简介

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

创建一个网络环境

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

创建 ACL 配置文件

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

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

{
  "acl": {
    "enabled": true,
    "default_policy": "deny",
    "down_policy": "extend-cache",
    "tokens": {
      "master": "508hFauW5uEc11SegVpK0fQlBhDEBiLZSpOCG+2gbeM"
    }
  }
}

获取最新的镜像

$ docker pull consul:latest

运行 Consul 节点

$ 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 配置文件

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;
       }
    }
}

创建目录

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

运行 Nginx 容器

$ 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 方式来启动集群的仓库

启动方式:

$ 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 在不同场景下的使用方式,敬请期待!

I hope this is helpful, Happy hacking…