Consul服务注册发现与Fabio反向代理

渺小Y · · 2915 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Consul

Consul是一个注册与发现的服务, 并且支持健康检查

二进制安装

https://releases.hashicorp.com/consul/1.2.2/consul_1.2.2_linux_amd64.zip
下载并解压, 然后拷贝二进制文件到 /usr/local/bin


启动consul

开发模式启动consul
consul agent -dev -config-dir=/etc/consul -bind=0.0.0.0 -client=0.0.0.0


参数说明

agent -- 使用agent模式跑起来
-dev -- 使用开发模式启动agent
-config-dir -- 配置文件目录, 这里存放json文件以文件的形式注册服务
-bind=0.0.0.0 -- 绑定集群通讯的ip地址, 默认是127.0.0.1
-client=0.0.0.0 -- 绑定客户端API,DNS等服务监听的地址, 默认是127.0.0.1

Consul主配置文件

/etc/consul/config.json

{
    "acl_agent_token": "c3591489-a756-019a-e97f-87f867ece12c", 
    "acl_datacenter": "aliyun", # 数据中心名称
    "acl_default_policy": "deny", # acl默认策略
    "acl_master_token": "5d79de96-106f-11e7-9381-005056abff5a",
    "bootstrap_expect": 2,
    "client_addr": "0.0.0.0",
    "data_dir": "/opt/consul",
    "datacenter": "aliyun",
    "dns_config": { # DNS发现功能的配置
        "allow_stale": true,
        "enable_truncate": true,
        "node_ttl": "60s",
        "service_ttl": {
            "*": "5s"
        }
    },
    "enable_script_checks": true, # 允许服务使用脚本进行健康检查
    "encrypt": "NnKESxGToysca68P7FM2sA==", # consul的server和client通信秘钥 使用consul keygen创建, 不管server还是client都要这个参数和相同的值
    "log_level": "INFO", # 日志记录模式
    "node_name": "monitor", # 本节点名称
    "server": true # consul以server模式启动
}

consul的配置参数大部分都可以使用启动参数和config.json方式两种方式
详见文档 https://www.consul.io/docs/agent/options.html


服务注册json配置 web.json

{
    "service": {
        "checks": [ # 健康检查配置
            {
                "tcp": ":80", # 检查模式, tcp, http, https, script几种模式, :80表示访问本机任何ip的80端口
                "interval": "5s",
                "timeout": "1s"
            }
        ],
        "id": "web-1", # 服务id
        "name": "web-1", # 服务名称
        "port": 80 , # 服务端口
        "tags": [ # 标签
            "urlprefix-/web" # 给fabio使用的标签, 后面会详细说
        ]
    }
}

consul监听端口

协议 端口
tcp 8300 -- 服务器节点与集群通讯
tcp 8301 Cluster LAN -- 集群sever间通信
udp 8301 Cluster LAN -- 集群sever间通信
tcp 8302 Cluster WAN -- 集群sever间通信
udp 8302 Cluster WAN -- 集群sever间通信
tcp 8500 Client HTTP Server -- 节点对外HTTP服务
tcp 8600 Client DNS Server(TCP) -- 节点对外DSN服务
udp 8600 Client DNS Server(UDP) -- 节点对外DNS服务

这些端口在config.json或者启动参数中都是可以修改的


Consul的UI界面

http://x.x.x.x:/8500/ui 可以进入UI界面

image.png

服务健康检查

常见的有http, script, tcp等, 同一个服务可以有多种检查方法,例如:

{
  "checks": [
    {
      "id": "chk1",
      "name": "mem",
      "args": ["/bin/check_mem", "-limit", "256MB"], # 带参数的script类型检查
      "interval": "5s",
      "timeout": "1s"
    },
    {
      "id": "chk2",
      "name": "/health",
      "http": "http://localhost:5000/health", # http类型检查
      "tls_skip_verify": false,
      "method": "POST",
      "header": {"x-foo":["bar", "baz"]},
      "interval": "15s",
      "timeout": "1s"
    },
    {
      "id": "chk3",
      "name": "cpu",
      "script": "/bin/check_cpu", # 不带参数的script检查
      "interval": "10s"
    },
    ...
  ]
}

更多健康检查方法和参数详见官方文档
https://www.consul.io/docs/agent/checks.html


ConsulAPI

请参见 官方文档 https://www.consul.io/api/agent.html


Consul集群配置


Fabio反向代理

Fabio是为consul而生的一个反向代理服务器, 支持负载均衡, http, https, tcp等. 你可以把它想象成nginx, 与nginx不同的是fabio可以根据consul服务的tag来进行自动转发请求

安装Fabio

首先需要安装git 和go环境 使用yum安装即可
# yum -y install git golang

获取fabio
# go get github.com/eBay/fabio

拷贝fabio二进制文件到彬bin目录
# cp go/bin/fabio /usr/local/bin/

拷贝配置文件到etc目录
# cp go/src/github.com/eBay/fabio/fabio.properties /etc/

/etc/fabio.properties常见配置

proxy.addr = :9999 # fabio代理监听端口
proxy.localip = # 代理监听的本地ip地址, 默认是空也就是0.0.0.0
proxy.strategy = rnd # 代理策略 rr(轮训)和rnd(基于微秒时间随机分配)
proxy.matcher = prefix # fabio反代请求给consul的匹配方式, prefix是使用uri前缀匹配, glob是使用通配符匹配(通配符不是正则表达式哦, 虽然有些相通)
proxy.maxconn = 10000 # 缓存的连接数
registry.consul.addr = localhost:8500 # fabio 去个consul服务注册自己? 一般指定任意一个client的8500端口即可
registry.consul.token = # fabio去consul注册自己时, 需要使用的token(当consul启用了acl才需要)
registry.consul.kvpath = /fabio/config # fabio在consul的k/v数据库中写入数据的路径
# fabio转发请求到consul时, 如果使用prefix策略, 则需要指定前缀是啥
# 比如 当请求fabio地址http://fabio_ip:9999/urlprefix-/webService 
# fabio将会把请求转发到consul中tag为"urlprefix-/webService"的服务
# 也就是说"urlprefix-"是fabio和consule服务注册者在consul注册服务打标签时约定的标签前缀
registry.consul.tagprefix = urlprefix-

fabio还有很多关于反代的参数, 比如代理https时使用的证书, http头的修改等等配置, 详情参见官方文档 https://fabiolb.net/ref/


自定义代理路由

fabio默认会按照proxy.matcher配置的匹配方法自动向consul转发请求, 当然也可以自定义路由进行转发

如何配置自定义转发路由规则?
登陆consul的UI界面, 在Key/Value中创建
Key:
fabio/config
Value:
route add serviceName1 /abc http://192.168.1.1/
如下图所示

新增自定义转发路由

转发的路由规则语法请参见官方文档
https://fabiolb.net/cfg/

查看Fabio路由表
http://fabio_ip:9998/routes

Fabio路由表: 其中第1条是fabio自动转发的路由, 第2条是我们自定义的路由规则

路由有各种Option, 这些Option在add route自定义路由或consul注册服务时都需要注意

比如consul注册如下服务时:

{
    "service": {
        "checks": [
            {
                "tcp": ":443",
                "interval": "5s",
                "timeout": "1s"
            }
        ],
        "id": "web-2",
        "name": "web-2",
        "port": 443 ,
        "tags": [
            "urlprefix-/web2, proto=https, tlsskipverify=true"
        ]
    }
}

consul注册服务时已定义好如果fabio向自己转发请求时自己应该告诉fabio些什么:

  • urlprefix-/web2: 当用户请求fabio(你)的uri前缀是"/urlprefix-/web2"的时候才转发到consul(我)这个服务(注意urlprefix-/web2在tag里时前面时没有/的)
  • proto=https:consul(我)的这个服务是https的
  • tlsskipverify=true:fabio(你)在访问consul(我)的这个服务时请跳过证书检查

比如在fabio新增一个路由时:
route add web2 /web2 https://x.x.x.x:8080/ opts "proto=https, tlsskipverify=true"
这个自定义路由是fabio告诉自己, 当匹配到uri为/web2的请求时, 应该将请求转发的目标是什么, 转发给目标时需要哪些参数:

  • proto=https 目标是https协议
  • tlsskipverify=true 转发给目标时, 忽略目标的ssl证书检查

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:渺小Y

查看原文:Consul服务注册发现与Fabio反向代理

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2915 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传