本文已参与「新人创作礼」活动.一起开启掘金创作之路。 服务注册发现Consul起步
一、consul介绍
1.consul是什么
consul是提供服务发现、简单配置管理、分区部署的服务注册发现解决方案。主要特性:
服务发现
健康检查
基于Key-Value的配置
支持TLS安全通讯
支持多数据中心部署
- consul架构
- 和其它服务发现软件对比
参见官网www.consul.io/intro/vs/in…
- 相关重要概念
consul的实例叫agent
agent有两种运行模式:server和client
每个数据中心至少要有一个server,一般推荐3-5个server(避免单点故障)
client模式agent是一个轻量级进程,执行健康检查,转发查询请求到server。
服务service是注册到consul的外部应用,比如spring web server
二、实战
- 安装
我们采用consul镜像来玩转consul(这就是容器的好处,不用安装,直接用,笔者写文章时最新版本1.2.2)
docker pull consul:1.2.2
- 启动consul server1
docker run --name consul1 -d -p 8501:8500 consul:1.2.2 agent -server -bootstrap -ui -bind=0.0.0.0 -client=0.0.0.0
注:
8500 http端口,用于http接口和web ui
8300 server rpc端口:同一数据中心consul server之间通过该端口通信
8301 serf lan端口,同一数据中心consul client通过该端口通信
8302 serf wan端口,不同数据中心consul server通过该端口通信
8600 dns端口,用于服务发现
-bootstrap:集群模式,需要至少两台服务器,才能选举集群leader
-ui: 运行web控制台
-bind: 监听网口,0.0.0.0表示所有网口,如果不指定默认为127.0.0.1,则无法和容器通信
-client:允许客户端ip
3.获取consul server1 ip地址
docker inspect --format '{{ .NetworkSettings.IPAddress }}' consul1
4. 启动consul server2,并加入consul server1
docker run --name consul2 -d -p 8502:8500 consul agent -server -ui -bind=0.0.0.0 -client=0.0.0.0 -join [consul1 ip address]
注:[consul1 ip address]用第3步获取ip填入
5. 启动consul server3,并加入consul server1或consul server2集群
docker run --name consul3 -d -p 8503:8500 consul agent -server -ui -bind=0.0.0.0 -client=0.0.0.0 -join [consul1 ip address]
注:[consul1 ip address]用第3步获取ip填入
6.宿主机浏览器访问: http://localhost:8501 或者 http://localhost:8502或者http://localhost:8503
- 停止consul server3
docker stop consul3
查看consul web界面,显示一个server node已经不在线
- 通过http接口注册服务
curl -X PUT --data @test-web.json http://localhost:8500/v1/agent/service/register
test-web.json内容:
{
"ID": "test-web1",
"Name": "test-web1",
"Tags": [
"test",
"v1"
],
"Address": "xxx.0.0.1",
"Port": 8000,
"Meta": {
"X-TAG": "testtag"
},
"EnableTagOverride": false,
"Check": {
"DeregisterCriticalServiceAfter": "90m",
"HTTP": "http://baidu.com",
"Interval": "10s"
}
}
更改test-web.json中内容id和name为test-web2,向另一台server注册:
curl -X PUT --data @test-web.json http://localhost:8501/v1/agent/service/register
刷新web控制台可以看到可用服务增加了:test-web2
- 通过http api获取某个service可用服务列表
宿主机浏览器访问:http://localhost:8500/v1/health/service/test-web1?passing,返回所有通过健康检查的可用test-web1服务列表
[{
"Node": {
"ID": "1e58f720-6b9e-b508-1f28-90b4461268f1",
"Node": "ca20157ca067",
"Address": "xxxx.17.0.3",
"Datacenter": "dc1",
"TaggedAddresses": {
"lan": "xxx.17.0.3",
"wan": "xx.17.0.3"
},
"Meta": {
"consul-network-segment": ""
},
"CreateIndex": 5,
"ModifyIndex": 8
},
"Service": {
"ID": "test-web1",
"Service": "test-web1",
"Tags": ["test", "v1"],
"Address": "xxxx.0.0.1",
"Meta": {
"X-TAG": "testtag"
},
"Port": 8000,
"EnableTagOverride": false,
"ProxyDestination": "",
"Connect": {
"Native": false,
"Proxy": null
},
"CreateIndex": 26,
"ModifyIndex": 26
},
"Checks": [{
"Node": "ca20157ca067",
"CheckID": "serfHealth",
"Name": "Serf Health Status",
"Status": "passing",
"Notes": "",
"Output": "Agent alive and reachable",
"ServiceID": "",
"ServiceName": "",
"ServiceTags": [],
"Definition": {},
"CreateIndex": 5,
"ModifyIndex": 5
}, {
"Node": "ca20157ca067",
"CheckID": "service:test-web1",
"Name": "Service 'test-web1' check",
"Status": "passing",
"Notes": "",
"Output": "HTTP GET http://baidu.com: 200 OK Output: <html>\n<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">\n</html>\n",
"ServiceID": "test-web1",
"ServiceName": "test-web1",
"ServiceTags": ["test", "v1"],
"Definition": {},
"CreateIndex": 26,
"ModifyIndex": 58
}]
}]
注:
其它应用程序可以通过这种方式轮询获取服务列表,这就是微服务能够动态知道其依赖微服务可用列表的原理。
- 解注册
curl -i -X PUT http://IP:PORT/v1/agent/service/deregister/:service_id
11. 适合本机调试的更简方式
上述集群方式需要至少启动两个consul server,本机调试web应用时,为了方便可以用-dev参数方式只启动一个consul server:
docker run --name consul -d -p 8500:8500 consul:1.2.2 agent -dev -bind=0.0.0.0 -cli