| 
                            
                                  注册中心
 注册中心选型你有没有思考过这样一个问题,为什么会有这么多的注册中心(etcd/ZooKeeper/Consul),选用那个最适合自己,是不是在选用的时候会眼花缭乱? 我在开始做的时候,自己也有很多困惑,将近3年的时候里我都在不停的学习,但是还是有很多不同的框架和产品,后来我明白了其中的原因,他们就像生活中的可乐、果汁、和牛奶一样,你在使用的时候选取你的编程语言(Java、Go、PHP),程序易接入的就好了。 产生注册中心五花八门的原因是因为语言很多,都想打造最适合自己的体系生态,我选择Consul为大家讲解,因为它安装和接入都比较方便。 不用被这些假象所困扰,多学习网络和系统的底层原理,万变不离其宗,技术人应该是给出解决方案。 CAP原理
	一致性: 所有节点在同一时间具有相同的数据可用性:保证每个请求不管成功或者失败都有响应分区容错:系统中任意信息的丢失或失败不会影响系统的继续运作 
	
		
			| Feature | Consul | ZooKeeper | etcd |  
			| 服务健康检查 | 服务状态、内存、硬盘 | 长链接、Keepalive | 链接心跳 |  
			| 多数据中心 | 支持 | — | — |  
			| K/V存储服务 | 支持 | 支持 | 支持 |  
			| 一致性 | Raft | Paxos | Raft |  
			| CAP定理 | CP | CP | CP |  
			| 使用接口(多语言能力) | Http/Dns | 客户端 | Http/Grpc |  
			| 安全 | acl/https | acl | Https支持 |  Consul介绍使用PHP、和Go编写,使用Consul作为注册中心和配置中心比较方便,所以我选用的是Consul。 
	采用Raft算法实现,有服务发现,Key/Value存储,可以做配置中心使用,有健康检查,并提供了web管理页面。 Consul 内部端口说明: 
	TCP/8300:8300端口用于服务器节点,客户端通过RPC协议调用服务端节点。TCP/UDP/8301: 8301端口用于单个数据中心所有节点之间的互相通信,即对LAN池信息的同步,它使得整个数据中心能够自动的发现服务器地址,分布式监测点的故障,事件广播。TCP/UDP/8302: 8302端口用于单个或多个数据中心之间的服务器节点的信息同步(WAL池信息的同步),它针对互联网的高延迟进行了优化,能够实现跨数据中心请求。HTTP/8500: 8500端口基于Http服务,用于Api接口和Ui访问。DNS/8600: 8600端口作为DNS服务器,它使得我们可以通过节点查询节点信息。 Consul Raft算法
	解决了分布式中领导选举和一致性问题Raft算法是比较出名的共识算法,比如Redis的哨兵、Consul Consul 集群的特点: 
	任期机制,Raft是终身任期的,它永远都是领导者心跳机制,它决定领导者是否能有效的和跟随者通信随机的选举超时时间,因为是随机的所以决定了不会再同一时间进行选举先到先得,一届任期内,先收到谁的投票就会给谁,剩下的请求一律拒绝过半机制,收到一半的投票才会 Consul 集群的角色: 
	Followers 追随者:接受到领导者发送的消息,当心跳超时时,主动推荐自己成为候选人。Candidate 候选人:发送Rpc消息,让其它节点投票给自己,当投票超过半数时,成为领导者。Leader 领导者:向其他节点发送心跳,只要心跳不超时,一直为领导者。 算法的详情可以点击官网视频查看 Consul 基本使用注册服务1.注册服务是Consul最基础的服务,点击查看官网Api 
	
		
			| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | PUT 192.168.88.144:8500/v1/agent/service/register {     "Name":"audio",     "Id":"audio",     "Tags":[         "v2",         "primary"     ],     "Address":"192.168.88.144",     "Port":8500,     "Check":{         "HTTP":"http://192.168.88.144:8500",         "Interval":"10s"     } } |  
	
		
			| 1 2 3 4 5 6 7 8 9 10 11 | {   "id": "web",   "name": "web",   "port": 80,   "check": {     "name": "ping check",     "args": ["ping", "-c1", "test.stark.com"],     "interval": "30s",     "status": "passing"   } } |  2.发现服务 
	
		
			| 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 | GET http://192.168.88.144:8500/v1/health/service/audio [     {         "Node": {             "ID": "38779dca-bffd-e399-6597-266aff68132c",             "Node": "server01-virtual-machine",             "Address": "127.0.0.1",             "Datacenter": "dc1",             "TaggedAddresses": {                 "lan": "127.0.0.1",                 "lan_ipv4": "127.0.0.1",                 "wan": "127.0.0.1",                 "wan_ipv4": "127.0.0.1"             },             "Meta": {                 "consul-network-segment": ""             },             "CreateIndex": 13,             "ModifyIndex": 17         },         "Service": {             "ID": "audio",             "Service": "audio",             "Tags": [                 "v2",                 "primary"             ],             "Address": "192.168.88.144",             "TaggedAddresses": {                 "lan_ipv4": {                     "Address": "192.168.88.144",                     "Port": 8500                 },                 "wan_ipv4": {                     "Address": "192.168.88.144",                     "Port": 8500                 }             },             "Meta": null,             "Port": 8500,             // ... } ] |  Service API Service 相关的 API 都在 /v1/agent/service 下: 
	/agent/services:该端点返回在本地代理程序中注册的所有服务;/agent/service/{service_id}:返回在本地代理上注册的单个服务实例的完整服务定义;/agent/health/service/name/{service_name}//agent/health/service/id/{service_id}:通过名称或id检索本地代理上的聚合服务状态;/agent/service/register:注册服务;/agent/service/deregister/{service_id} :注销服务;/agent/service/maintenance/{service_id}:该端点将给定的服务置于“维护模式”,在维护模式下,该服务将被标记为不可用,并且不会出现在DNS或API查询中。 关于更多Consul的使用,查询官方文档吧。 
 |