自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Leo的博客

记录开发的点滴,更好的阅读体验请访问:leehao.me

  • 博客(237)
  • 资源 (4)
  • 收藏
  • 关注

原创 Go 并发:带缓冲的通道

在上一篇文章 《Go 并发:Channel 通道》中,我们讨论了通道的一些基本特性,需要指出的是,之前讨论的通道都是不带缓冲的通道,也就是说从通道接收数据和往通道发送数据都会阻塞,直到有其他 goroutine 往通道发送数据或从通道接收数据。在这篇文章中,我们继续讨论带缓冲的通道的使用。带缓冲的通道可以创建带缓冲的通道。往通道发送数据时,只有当缓冲满时才会阻塞。同理,从通道接收数据时,只有当缓冲为空时才会阻塞。可以使用 make 函数来创建带缓冲的通道:ch := make(chan type,

2022-02-22 22:18:08 1236

原创 Go 并发:Channel 通道

在上一篇文章《Go 并发机制:Goroutine》中,我们讨论了 Go 如何使用 goroutine 实现并发。本文我们继续讨论 goroutine 如何利用 channel 来进行通信。什么是 channelChannel,通道,可看作是 goroutine 进行通信的管道(pipe)。跟水可以在管道中从一端流向另一端类似,数据也可以通过通道从一端发送,从另一端接收。声明 channel每一个通道都有一个具体的类型,即这个通道允许传输的数据类型。ch T一个类型为 T 的通道。通道的零值为

2022-02-06 11:05:42 643

原创 Go 并发机制:Goroutine

Go 是当前一门热门的编程语言,其优秀的并发特性吸引了无数程序员的目光。Go 的并发特性是一个比较大的话题,笔者计划从以下三个方面讨论:Go goroutineGo channelGo select本文讨论 Go 的 goroutine 并发机制。并发与并行在讨论 goroutine 之前,我们先来看下并发与并行的区别。多线程程序在单核心的 cpu 上运行,称为并发;多线程程序在多核心的 cpu 上运行,称为并行。并发与并行并不相同,并发主要由切换时间片来实现“同时”运行,并行则是直接利

2022-01-11 08:57:19 645

原创 Apache Bench ab 性能测试工具入门简介

Apache Bench,即 ab 工具,是 Apache 提供的用来对 HTTP Web 服务器进行性能测试的工具。ab 命令不仅可以对传统的 Apache Web 服务器进行性能测试,也可以对其他的 Web 服务器进行性能测试,使用起来十分方便。安装在笔者 MacBook 上,ab 工具已安装好。如果是 CentOS 7 操作系统,可以使用以下命令进行安装:yum -y install httpd-tools测试是否安装成功:ab -V在笔者 MacBook 下输出:This is A

2021-12-31 22:50:27 8387

原创 Raft 共识算法学习笔记 三:成员变更

文章 《Raft 共识算法学习笔记 一:领导人选举》 和 《Raft 共识算法学习笔记 二:日志复制》 分别讲述了 Raft 算法如何进行领导人选举和如何进行日志复制。这篇文章继续讲述 Raft 算法如何处理集群成员节点变更的问题。考虑一种场景,原来 Raft 集群中存在三个节点,现在需要增加2 个节点。那么,在这种情况下, Raft 算法如何能保证同一个任期内,只有一个领导者呢?在 Raft 论文中,作者使用配置(configuration)来表示集群由哪些节点组合,即集群所有节点的信息集合。在稳定

2021-03-16 14:04:26 397

原创 Raft 共识算法学习笔记 二:日志复制

文章 Raft 共识算法学习笔记 一:领导人选举 描述了 Raft 算法如何进行领导者选举,本文描述 Raft 共识算法如何进行日志复制。复制状态机在 Raft 集群中,每个服务器可以看成是一个复制状态机(Replicated State Machine),如下图。复制状态机通常基于复制日志(replicated log)实现。每个服务器存储一个包含一系列指令的日志,并且按顺序执行指令。由于日志都包含相同顺序的指令,状态机会按照相同的顺序执行指令,由于状态机是确定的(deterministic),因此

2021-03-16 14:03:05 882

原创 Raft 共识算法学习笔记 一:领导者选举

Raft 算法是现在分布式系统开发首选的共识算法。文章 《图解 Paxos 算法》 介绍了 Paxos 共识算法,绝大多数选用 Paxos 算法的系统(比如 Cubby),都是在 Raft 算法发布前开发的,当时没得选。新系统绝大多数选择了 Raft 算法,例如,Etcd,Consul,等。就像作者 Diego Ongaro 在 Raft 论文 In Search of an Understandable Consensus Algorithm 说的,Paxos 太难理解了,无论是对于学生还是系统开发者来说

2021-02-27 08:07:20 957

原创 图解 Paxos 算法

Paxos 算法由 Leslie Lamport 在 1989 年提出的一个分布式共识算法,Paxos 算法较难理解,本文尝试以图形化方案解释 Paxos 算法。本文在很大篇幅参考了韩健极客时间的课程《分布式协议与算法》,有兴趣了解韩老师其他课程的同学可以购买来学习下。Lamport 提出的 Paxos 算法包括两个部分:Basic Paxos 算法:多节点如何就某个值达成共识Multi Paxos 思想:执行多个 Basic Paxos ,就一系列的值达成共识Basic Paxos问题假

2021-02-11 10:15:20 755

原创 Spring Cloud Gateway 网关

Spring Cloud 在最新版本 2020.0.0 开始,已去除了 Zuul 网关的使用,改用 Spring Cloud Gateway 作为网关。Spring Cloud Gateway 基于 Spring WebFlux 框架实现,相对于 Zuul 来说,性能更高。本文讲述如何在 Spring Cloud 中使用 Nacos 作为注册中心,通过 Spring Cloud Gateway 实现 API 路由的功能。启动 Nacos由于需要使用 Nacos 作为注册中心,网关和微服务都注册到 N

2021-02-11 10:13:33 418

原创 Spring Cloud + MyBatis + Druid 动态数据源实现

最近公司某项目计划对数据库进行水平分库处理,因此需要实现程序根据参数自动切换数据库的功能。本文讲述如何在 Spring Cloud + MyBatis + Druid + Oracle 环境下实现动态数据源切换的功能。配置数据源在两个 Oracle 数据库创建 Person 表,并插入几行数据:create table Person( id NUMBER(8) not null, name VARCHAR2(64) not null)INSERT INTO Person (id, n

2021-02-11 10:12:06 1234

原创 Spring Cloud 使用 Nacos 作注册中心

文章 《Spring Cloud 使用 Nacos 作配置中心》 描述了如何在 Spring Cloud 使用 Nacos 作配置中心的使用方法,本文在此基础上,使用 Nacos 作为 Spring Cloud 的注册中心。安装 Nacos为简单起见,这里使用单机版本的 Nacos Server 作为注册中心,安装过程可以参考 《Spring Cloud 使用 Nacos 作配置中心》。服务提供者服务提供者在文章 《Spring Cloud 使用 Nacos 作配置中心》 源代码 springclo

2021-02-11 10:10:49 729

原创 Spring Cloud 使用 Nacos 作配置中心

title: Spring Cloud 使用 Nacos 作配置中心date: 2021-01-14 18:35:39tags:JavaSpring CloudNacoscategories:JavaNacos 是 Spring Cloud Alibaba 核心组件之一,可以用作 Spring Cloud 的注册中心和配置中心。本文讲述如何在 Spring Cloud 中使用 Nacos 作为配置中心。安装 Nacos与 Spring Cloud Config 和 Eurek.

2021-02-11 10:08:00 1473 2

原创 Spring Boot Druid 使用教程

阿里巴巴开源的 Druid 是 Java 语言的数据库连接池,提供了强大的监控和扩展功能。本文讲述如何在 Spring Boot 项目中使用 Druid 数据库连接池。教程基于文章 《Spring Boot MyBatis 学习教程》 配套的源代码进行扩展,添加 Druid 数据库连接池和监控的功能。如果读者对于 Spring Boot 如何使用 MyBatis 还不了解,可以先完成文章 《Spring Boot MyBatis 学习教程》 的阅读和学习。添加依赖在 pom.xml 文件添加当

2021-01-12 17:27:55 1896

原创 Spring Boot MyBatis 学习教程

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL,存储过程以及高级映射。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects)为数据库中的记录。本文讲述如何在 Spring Boot 框架中基于 XML 方式使用 Mybatis。创建 MySQL 数据表本文采用 MySQL 数据库作为数据源,创建用户表 user:CREATE TABLE `user`( `id` int(32)

2021-01-11 14:00:34 565 1

原创 Spring Boot 多线程使用

Spring Boot 提供了非常优雅使用多线程执行任务的方式,本文说明 Spring Boot 项目如何利用 ThreadPoolTaskExecutor 来使用多线程。创建 Spring Boot 项目使用 IntelliJ Idea 创建向导创建一个 Spring Boot 项目,或者在 Spring 官网创建一个 Spring Boot 项目,地址:https://start.spring.io/。由于创建过程比较简单,此处不再赘述。其中,pom.xm 文件如下:<?xml vers

2021-01-05 19:09:58 1450 2

原创 OpenResty 入门教程

OpenResty 是一款基于 Nginx 和 Lua 的高性能 Web 框架,可以方便地基于 Nginx 进行二次开发,以实现超高并发 Web 网关,Web 服务等。本文讲述如何在 Linux 安装和使用 OpenResty。安装 OpenRestyOpenResty 官方提供源代码编译安装以及二进制包安装方式,本文采用源代码编译安装方式。有关二进制包安装方式,可以参考链接 https://openresty.org/cn/linux-packages.html。在 OpenResty 下载页面

2020-12-11 19:38:47 1208

原创 Nginx 模块开发 Hello World

最近在研究如何利用 Nginx 实现高性能网关,这里记录一下开发 Nginx 扩展模块 Hello World。编译安装 Nginx下载 Nginx 源代码,解压,进入源代码目录:wget http://nginx.org/download/nginx-1.13.10.tar.gztar zvxf nginx-1.13.10.tar.gzcd nginx-1.13.10编译,安装 Nginx 到指定目录:./configure --prefix=/home/lihao/code/nginx/

2020-12-11 09:06:42 845

原创 Nginx 作 WebService 反向代理

WebService 对外提供 SOAP 接口,SOAP 接口基于 HTTP + XML,因此,可以使用 Nginx 作用 WebService 的反向代理,以实现 WebService 请求的负载均衡功能。本文使用 docker-compose 部署 nginx,有关 docker-compose 的使用,可以参考 《Docker Compose 入门教程》。文件目录结构如下:.├── conf.d│ └── ksb.conf├── docker-compose.yml└── log

2020-12-08 10:45:14 4001

原创 Hexo 网站支持 HTTP/2

HTTP / 2 具有以下的特性:采用二进制传输数据基于流的多路复用头部压缩服务端推送由于 HTTP / 2 可以提升网站访问速度,因此,本人决定对个人站点 Leo 的博客 进行 HTTP / 2 升级改造。leehao.me 网站采用 Ngninx + Hexo + NexT 实现,有关部署细节可以参考之前的文章 《在阿里云部署 Hexo 网站》 以及 《Hexo 网站配置免费阿里云证书》。Nginx 从版本 1.9.5 支持 HTTP / 2,因此,为使网站支持 HTTP / 2,只需

2020-12-01 22:25:28 501

原创 CMake 入门教程

文章 CMake 语言 15 分钟入门教程 介绍了 CMake 语言的基础知识,本文在此基础上,进一步说明说明如何利用 CMake 生成 Makefile,并实现编译安装功能。CMake 除了可以生成 Makefile 外,还可以生成以下 IDE 的编译文件:XcodeVisual StudioCodeBlocksEclipseCMake 生成可执行文件先来看如何利用 CMake 编译单个 .cpp 源文件。需要编译的 main.cpp#include <iostream>

2020-11-29 10:18:32 2547

原创 GitLab 实现 C++ 项目持续集成

Gitlab 集成了 CI / CD (Continuous Integration,持续集成 /Continuous Delivery,持续交付)功能。下图是 gitlab 官网上有关 ci / cd 各阶段的图示:本文重点讲述如何利用 gitlab 实现 c++ 项目的持续集成。安装 gitlab runner为了利用 gitlab 实现 ci / cd,需要安装 gitlab runner,gitlat runner 用于执行 ci / cd 任务。本文采用 docker 方式安装 gitl

2020-11-19 18:31:18 3809

原创 CMake 语言 15 分钟入门教程

cmake 是一个跨平台的编译安装工具,可以用简单的语句来描述所有平台的编译安装过程。本文介绍 cmake 的基础语法。第一个例子使用任意的文本编辑器,输入:message("Hello world!") 然后保存为 hello.txt 文本文件,执行:cmake -P hello.txt输出:Hello world!所有变量都是字符串在 cmake 中,所有变量都是字符串。可以使用 ${} 来引用一个变量。例如,修改 hello.txt :message("Hello $

2020-11-18 13:35:56 1667

原创 Dubbo 入门应用程序

Dubbo 是一款微服务框架,提供高性能 RPC 通信,服务发现,流量管理等服务治理能力,提供构建大规模微服务集群所需的整套解决方案。本文讲述如何利用 Dubbo 快速构建一个完整的服务端 - 客户端程序,包括基于 XML,注解和 API 的方式实现一个 Dubbo 的 demo。配置开发环境本文使用 IntelliJ IDEA 作为 Dubbo 应用程序开发的 IDE。安装 ZooKeeperDubbo 推荐使用 ZooKeeper (下文简称为 zk)作用注册中心,为简单起见,本文搭建一个单机

2020-11-11 21:31:44 444

原创 K8s 部署 Nginx 入门

文章 《Mac docker desktop 搭建 kubernetes 环境》 介绍了如何在 mac 上利用 docker desktop 搭建 k8s 运行环境,本文在此基础上,说明如何利用 k8s 部署 nginx 。创建 podpod 是 k8s 最小的编排单位,通常来说不需要直接创建 pod。这里是为了演示 pod 的使用创建了一个 pod。pod 的配置文件 nginx-pod.yml:apiVersion: v1kind: Podmetadata: name: nginx

2020-11-04 17:34:26 6872 3

原创 Mac Docker Desktop 搭建 Kubernetes 环境

学习 kubernetes (下文简称为 k8s)的前提是需要一个 k8s 运行环境。k8s 官网上推荐使用 minikube 开始 k8s 的学习之旅。由于自己的 mac 上已安装了 docker desktop(下文简称 desktop),且 desktop 集成了 kubernetes 功能,可以满足最快完成 k8s 学习环境的搭建的需求。安装/更新 docker desktop如果没有安装 docker desktop,可以直接下载最新版本进行安装。如果已安装 docker,为了更新至最新版本,

2020-11-01 21:08:34 3627 8

原创 Filebeat 日志输出至 Kafka

Filebeat 是一款轻量级的日志采集器,可以用来收集日志,并将日志汇总起来处理。Filebeat 的工具原理如下图所示:图片来源:https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-overview.html通过 filebeat 配置文件 filebeat.yml 指定需要收集的日志,并指定输出至 elasticsearch,logstash,kafka,redis 等。本文讲述如何配置 filebeat,将日志输

2020-08-03 18:19:11 9620

原创 Kafka 生产者和消费者学习笔记

最近搭建 kafka 集群环境以便于收集应用程序日志并进行个性化的处理,因此学习了 kafka 生产者和消费者 python 程序的实现。这篇文章当是个 kafka 的学习笔记。一、搭建 kafka 集群为方便测试,我们在 MacOS 单机上搭建具有三个 kafka 节点的集群。如果在生产上部署 kafka ,请在不同的物理机上部署 kafka 集群。1. 下载 kafka 镜像我们使用 wurstmeister/kafka 镜像来部署 kafka,由于 kafka 依赖于 zookeeper ,因

2020-07-04 21:07:20 811

原创 使用 Prometheus Python 库编写自定义指标

虽然 prometheus 已有大量可直接使用的 exporter 可供使用,以满足收集不同的监控指标的需要。例如,node exporter 可以收集机器 cpu,内存等指标,cadvisor 可以收集容器指标。然而,如果需要收集一些定制化的指标,还是需要我们编写自定义的指标。本文讲述如何使用 prometheus python 客户端库和 flask 编写 prometheus 自定义指标。安装依赖库我们的程序依赖于 flask 和 prometheus client 两个库,其 requirem

2020-06-27 21:28:07 9201 1

原创 Prometheus 发送企业微信

最近在公司搭建 prometheus 监控平台。文章 《Prometheus 使用阿里云邮件推送发送告警邮件》 已说明如何实现 prometheus 发送邮件告警的功能,这篇文章说明如何实现发送企业微信告警的功能。申请企业微信账号为实现发送企业微信告警消息,需要一个企业微信账号,在页面 企业微信 可以免费申请一个测试账号。进入应用管理 - 创建应用,创建一个用于接收告警消息的账号。创建成功后,可以看到该应用的 AgentId 和 Secret 串,如图所示:配置 alertmanagerAler

2020-06-25 17:38:34 1616

原创 C++ Lambda 学习笔记

C++ 中,对于一个对象或一个表达式,如果可以对其使用调用运算符(()),则称它是可调用的。即,如果 e 是可调用的,则可以这样使用:e(args)其中,args 是一个逗号分隔的一个或多个参数的列表。C++ 中可调用对象除了我们熟悉的函数或函数指针外,还包括函数对象以及 lambda 表达式。本文重点讲述 lambda 表达式。lambda 表达式表示一个可调用的代码单元,我们可以将...

2020-04-26 21:45:59 518

原创 C++ 函数对象学习笔记

函数对象本质上是一个类对象,它重载了函数调用操作符 operator()。调用操作符的函数体实现函数的功能。例如,我们定义类 LessThan:class LessThan {public: bool operator() (const string &s1, const string &s2) { return s1.size() < s2.s...

2020-04-26 10:48:17 719

原创 POJ 1401 Factorial 解题报告

以下是算法的直观解释。假设求60!的结果后面有几个0。由《编程之美》可知其实是求1,2,3……60中共有几个5的因子,如,5有一个,10有两个,……一起加起来即得到结果。但是如果一个一个这样计算下去,会超时的。其实还有更简单的计算方法。我们知道,在1->60的数中,以下的数可以被5整除:5,10,15,20,25,30,35,40,45,50,55,60共60/5 = 12

2020-03-04 08:22:15 1068

原创 在多线程环境中使用Jedis

Jedis是一个Java语言的Redis客户端,它为Java语言连接与操作Redis提供了简单易用的接口。Jedis不是线程安全的,故不应该在多线程环境中共用一个Jedis实例。但是,也应该避免直接创建多个Jedis实例,因为这种做法会导致创建过多的socket连接,性能不高。 要保证线程安全且获得较好的性能,可以使用JedisPool。

2020-03-04 08:18:37 33499 7

原创 SOAP Web Services 简介

SOAP(Simple Object Access Protocol)是一种基于 XML 的 web 服务协议。SOAP 是平台独立的,不依赖于特定的语言,例如,我们可以使用 C#,C/C++,或者 Java 语言来实现 SOAP web 服务。SOAP 的优点SOAP 的优点有:WS Security:SOAP 使用 WS Security 作为其安全的标准,安全性较高。语言与平台独立:可以使

2020-03-04 08:17:35 3163

原创 Prometheus 使用阿里云邮件推送发送告警邮件

我们在文章 《使用 docker-compose 搭建 prometheus 监控系统》 的基础上,增加 prometheus 的告警功能。Prometheus 指标的收集和存储与告警是分开的,告警功能由 alertmanager 提供。我们需要在 prometheus 定义告警规则,这些规则可以触发事件,然后传播到 alertmanager。接下来,alertmanager 会决定如何处理相应...

2020-03-03 15:31:49 1828

原创 使用 docker-compose 搭建 Prometheus 监控系统

Prometheus 是当前一套非常流行的开源监控和报警系统,于 2016 年加入了 Clound Native Computing Foundation,是继 kubernates 之后的第二个托管项目。本文讲述如何使用 docker 快速搭建 prometheus 监控系统。概览本文的实验环境为 Mac OS,监控系统主要是用来监控两台 CentOS 主机资源使用情况。搭建的监控系统包括...

2020-02-16 21:27:45 7241

原创 使用 Gitlab 搭建 Docker 私有仓库

我们知道,gitlab 可以用来管理 git 提交的源代码,此外,gitlab 还集成了 docker registry 的功能,可以用来作为一个 docker 镜像私有仓库使用。启用 gitlab registry 功能我们假设已安装好 gitlab,具体安装可参考 《使用 docker 安装 gitlab》。Gitlab 默认不打开 docker registry 的功能,需要修改配置打...

2020-02-12 10:26:04 6543 1

原创 使用 Docker 安装 Gitlab

Gitlab 作为开源的 git 代码仓库,功能强大,使用起来非常方便。本文讲述如何使用 docker 来安装 gitlab。本文假定已安装好 docker,可以输入 docker --version 来验证是否已正常安装,输出:Docker version 19.03.5, build 633a0ea使用 docker run 命令安装为方便安装,我们先拉取最新版本的 gitlab ...

2020-02-11 15:45:11 1400

原创 Docker Compose 入门教程

Docker compose (以下简称为 compose)可用于定义和运行多容器 docker 应用程序。通过 compose,我们可以使用 YAML 文件来配置应用程序的服务(services),然后只需要通过一个命令,就可以将配置的所有服务启动起来。使用 compose 只需要三步:使用 Dockerfile 定义应用的环境,以便于可以任何地方复制应用的环境使用 docker-co...

2020-02-09 21:39:01 2124

原创 Docker 数据持久化

概览默认情况下,在 docker 容器(container)内创建的文件或产生的数据都只是保存在容器的可写层,这意味着当容器不存在时,容器内产生的数据也没有保存下来。Docker 提供两种容器数据持久化的方法,使用这两种方法即使容器不存在时,数据也能持久化下来:Bind mount:bind mount 可以是宿主机(host)文件系统的任意目录或文件,除了 docker 容器可以访问,宿...

2020-02-06 19:54:06 1303 1

matlab中文帮助文档

matlab中文帮助文档,学习matlab的好帮手,各位有福啦。

2011-02-05

86版五笔字根表,经典,好用

86版五笔字根表,经典,好用,还包括了字根背诵口诀。

2011-02-05

01背包问题及变种详解

经典的背包问题九讲文档,包含了01背包及其变种的详细解释。

2011-01-28

POJ水题集--50道--增加自信

POJ水题集-----50道左右-----增加自信啊..

2010-12-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除