微服务之 Consul 集群搭建

微服务之 Consul 集群搭建

随着单体应用的越发的庞大,我们不得不着力于拆分原有的单体应用为微服务。但与此同时遇到的问题就是如何管理这些服务?Consul 就是为了解决这一问题而诞生的!

简介

Consul 是基于 Golang 开发的 Service Mesh 解决方案,提供了功能齐全的控制平面。具有服务发现、配置管理和分割等功能。这些特性可以根据需要单独使用,也可以一起用于构建完整的服务网格。

它内置了简单的服务代理,当然你可以可以选择使用其他第三方的代理,如 Envoy 代理。

配合 HashiCorp 开发的其他 Micro Service 生态工具集成,可以让用户更加简单的落地微服务。

功能介绍

服务发现

Consul 允许某个服务注册到数据中心,如 API 或 MySQL 等,其他客户端可以使用 Consul 来发现服务,使用内建的 DNS 可以更好的找到所依赖的服务。

健康检查

Consul 可以提供服务的健康检查,管理员可以通过这个功能及时的获取集群的健康状况,同时服务发现组件可以通过该功能,避免流量被路由到无法提供服务的节点。

K/V 存储

Consul 提供了分布式的 K/V 存储功能,该功能可以适用于动态配置特性标记分布式锁以及集群 Leader 的选举等,并且提供了易于使用的 HTTP API。

安全服务通信

Consul 可以为服务颁发 TLS 证书,以建立相互的 TLS 连接。

多数据中心

Consul 支持多个数据中心的连接,即使规模庞大的企业,也可以轻松用它来构建自己的基础设施。

安装

需要使用的端口

端口号 说明
8600 DNS 服务(TCP&UDP)
8500 HTTP 服务(TCP)
8301 Serf 内网端口(TCP&UDP)
8302 Serf 公网端口(TCP&UDP)
8300 RPC(TCP)
21000~21255 自动分配服务 Sidecar 代理的端口

考虑到实验环境的问题我这里采用 Docker 来部署 Consul 集群,如果你打算在多个节点上部署,配置和命令都差不多,只不过可能无需创建 Network。

Docker Step by step

创建一个网络环境

1
$ docker network create betterde --subnet 10.0.0.0/28 --gateway 10.0.0.14

创建 ACL 配置文件

1
2
$ mkdir -p /etc/consul/conf.d
$ touch /etc/consul/conf.d/server.json

将如下配置写入 /etc/consul/conf.d/server.json,这里的 acl.tokens.master 是用于访问的凭证,你可以替换成自己的 Token。

1
2
3
4
5
6
7
8
9
10
{
"acl": {
"enabled": true,
"default_policy": "deny",
"down_policy": "extend-cache",
"tokens": {
"master": "508hFauW5uEc11SegVpK0fQlBhDEBiLZSpOCG+2gbeM"
}
}
}

获取最新的镜像

1
$ docker pull consul:latest

运行 Consul 节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ docker run -d \
-h consul-1 \
--name consul-1 \
--net=betterde --ip 10.0.0.1 \
-v /etc/consul/conf.d:/etc/consul/conf.d
consul agent -server -node=10.0.0.1 -datacenter=betterde -bind=10.0.0.1 \
-ui -client=0.0.0.0 -bootstrap-expect=3 -config-dir=/etc/consul/conf.d

$ docker run -d \
-h consul-salver-1 \
--name consul-salver-1 \
--net=betterde --ip 10.0.0.2 \
-v /etc/consul/conf.d:/etc/consul/conf.d
consul agent -server -node=10.0.0.2 -datacenter=betterde -bind=10.0.0.2 \
-ui -join=10.0.0.1 -retry-join=10.0.0.1 -bootstrap-expect=3 -config-dir=/etc/consul/conf.d

$ docker run -d \
-h consul-salver-2 \
--name consul-salver-2 \
--net=betterde --ip 10.0.0.3 \
-v /etc/consul/conf.d:/etc/consul/conf.d
consul agent -server -node=10.0.0.3 -datacenter=betterde -bind=10.0.0.3 \
-ui -join=10.0.0.1 -retry-join=10.0.0.1 -bootstrap-expect=3 -config-dir=/etc/consul/conf.d

需要注意的是,为了避免脑裂 -bootstrap-expect=3 参数必须一致。

创建 /var/local/web/nginx.conf 配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
user  nginx;
worker_processes 2;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;


events {
worker_connections 102400;
}


http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
#tcp_nopush on;

keepalive_timeout 65;

#gzip on;

upstream consul {
server consul-4:8500;
}

server {
listen 80 default_server;
server_name _;

access_log /web/logs/consul/access.log;
error_log /web/logs/consul/error.log;
root html;

location / {
proxy_pass http://consul;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
}

创建目录

1
$ mkdir -p /var/local/web/logs/consul

运行 Nginx 容器

1
2
3
4
$ docker run -p 80:80 --name nginx --hostname nginx \
--net betterde --ip 10.0.0.253 \
-v /var/local/web/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /var/local/web/logs:/web/logs -d nginx:latest

Docker Compose

另外我还提供了一个使用 Docker Compose 方式来启动集群的仓库

启动方式:

1
2
3
$ git clone git@github.com:betterde/architecture.git
$ cd architecture/consul
$ docker-compose up -d

如果不出意外的话,此时访问 http://consul.betterde.com (在配置文件中替换成你自己的域名) 就可以看到 Consul 的 Web UI 了。

Consul Cluster

因为开启了 ACL 所以,第一次访问需要点击 ACL 将 server.json 中的 acl.tokens.master 输入并进行验证,然后刷新浏览器,这样偶能正常访问数据了。

接下来我将会发布更多的文章介绍 Consul 在不同场景下的使用方式,敬请期待!

评论