go语言服务注册与发现 golang consul服务发现和注册( 三 )


然后在服务器 Server4 和 Server5 上通过 Consul Client 分别注册 Service A、B、C , 这里每个 Service 分别部署在了两个服务器上,这样可以避免 Service 的单点问题 。
服务注册到 Consul 可以通过 HTTP API(8500 端口)的方式 , 也可以通过 Consul 配置文件的方式 。
Consul Client 可以认为是无状态的,它将注册信息通过 RPC 转发到 Consul Server , 服务信息保存在 Server 的各个节点中,并且通过 Raft 实现了强一致性 。
最后在服务器 Server6 中 Program D 需要访问 Service B,这时候 Program D 首先访问本机 Consul Client 提供的 HTTP API,本机 Client 会将请求转发到 Consul Server 。
【go语言服务注册与发现 golang consul服务发现和注册】 Consul Server 查询到 Service B 当前的信息返回,最终 Program D 拿到了 Service B 的所有部署的 IP 和端口,然后就可以选择 Service B 的其中一个部署并向其发起请求了 。
如果服务发现采用的是 DNS 方式,则 Program D 中直接使用 Service B 的服务发现域名 , 域名解析请求首先到达本机 DNS 代理 , 然后转发到本机 Consul Client , 本机 Client 会将请求转发到 Consul Server 。
Consul Server 查询到 Service B 当前的信息返回,最终 Program D 拿到了 Service B 的某个部署的 IP 和端口 。
图中描述的部署架构笔者认为是最普适最简单的方案 , 从某些默认配置或设计上看也是官方希望使用者采用的方案 , 比如 8500 端口默认监听 127.0.0.1,当然有些同学不赞同,后边会提到其他方案 。
consul必须启动agent才能使用,有两种启动模式server和client , 还有一个官方自带的web ui 。server用与持久化服务信息,集群官方建议3或5个节点 。client只用与于server交互 。ui可以查看集群情况的 。
server模式启动如下:
参数解释:
client启动如下:
client节点可以有多个,自己根据服务指定即可 。
ui启动如下:
参数解释:
集群创建完成后:
使用一些常用的命令检查集群的状态:
可以在raft:stat看到此节点的状态是Fllower或者leader
新加入一个节点有几种方式;
访问ui:
端口:
8300:consul agent服务relplaction、rpc(client-server)
8301:lan gossip
8302:wan gossip
8500:http api端口
8600:DNS服务端口
输入 consul agent -dev
在浏览器中输入就可以启动web查看
consul注册服务,有三种方式 , 
方式一:通过配置文件的方式静态注册
创建文件夹/etc/consul.d
.d代表有许多配置文件在里面
vim /etc/consul.d/jetty.json内容如下:
重启consul,并将配置文件的路径给consul(指定参数:-config-dir /etc/consul.d)
方式二:通过HTTP API接口来动态注册
直接调用/v1/agent/service/register接口注册即可,需要注意的是:http method为PUT提交方式 。如:
注意,这种方式,和上面的注册方式有一点不一样 , body的参数,是上面service的值,这点需要注意
方式三:使用程序实现服务的注册和发现(Java)
首先加入consul client的依赖
服务发现
consul支持两种方式实现服务发现,一种是通过http API来查询有哪些服务,另外一种是通过consul agent 自带的DNS(8600端口),域名是以NAME.service.consul的形式给出,NAME即在定义的服务配置文件中,服务的名称 。DNS方式可以通过check的方式检查服务 。
服务间的通信协议
Consul使用gossip协议管理成员关系、广播消息到整个集群,他有两个gossippool(LAN pool和WAN pool),LAN pool是同一个数据中心内部通信的,WAN pool是多个数据中心通信的,LAN pool有多个,WAN pool只有一个 。

推荐阅读