服务发现框架Consul的使用

分布式系统的三个指标

  • Consistency
  • Availability
  • Partition tolerance

它们的第一个字母分别是 C、A、P。

由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容错性是我们必须需要实现的

一致性和可用性,不可能同时成立。这个结论就叫做 CAP 定理。

 

服务发现框架的比较

 

Feature   Consul   zookeeper   etcd    euerka
服务健康检查    服务状态,内存,硬盘等   (弱)长连接,keepalive    连接心跳   可配支持
多数据中心   支持   —   —   —
kv存储服务    支持    支持    支持    
一致性   raft    paxosraft   —
cap  cp  cpcp ap
使用接口(多语言能力)    支持http和dns    客户端   http/grpc    http(sidecar)
watch支持   全量/支持long polling    支持    支持 long polling   支持 long polling/大部分增量
自身监控   metrics   —    metrics    metrics
安全   acl /https   acl    https支持(弱)    

Consul和Eureka最大的区别:Eureka保证AP, Consul为CP。

Consul强一致性(C)带来的是:

服务注册相比Eureka会稍慢一些。因为Consul的raft协议要求必须过半数的节点都写入成功才认为注册成功
Leader挂掉时,重新选举期间整个consul不可用。保证了强一致性但牺牲了可用性。


Eureka保证高可用(A)和最终一致性:

服务注册相对要快,因为不需要等注册信息replicate到其他节点,也不保证注册信息是否replicate成功
当数据出现不一致时,虽然A, B上的注册信息不完全相同,但每个Eureka节点依然能够正常对外提供服务,这会出现查询服务信息时如果请求A查不到,但请求B就能查到。如此保证了可用性但牺牲了一致性。

Eureka就是个servlet程序,跑在servlet容器中; Consul则是go编写而成

 

为什么要选择Consul

与其他分布式服务注册与发现的方案,Consul的方案更"一站式",内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案。ZK拥有的功能它几乎都支持,但是健康检查和服务安全性方面优于ZK。使用起来也较 为简单。Consul用Golang实现,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与Docker等轻量级容器可无缝配合。

 

什么是多数据中心

这里存在两个数据中心:DATACENTER1、DATACENTER2。每个数据中心有着 3 到 5 台 server(该数量使得在故障转移和性能之间达到平衡)。

一个数据中心的网络连接问题或故障不影响其他数据中心的可用性。每个数据中心都是独立运行,并且拥有私有的LAN gossip pool。

数据中心中包含客户节点和服务节点,通常建议三到五个服务节点。因为随着节点的增加,服务同步会变得相对更慢,同时考虑到服务失败和性能要求等方面因素。但是对于客户节点数量,则没有限制。利用Gossip协议用来向集群广播消息,节点之间利用Raft协议选举领导者,领导者负责处理所有的查询和事务请求。

 

Spring Cloud Consul特性

Spring Cloud Consul项目是针对Consul的服务治理实现。Consul是一个分布式高可用的系统,它包含多个组件,但是作为一个整体,在微服务架构中为我们的基础设施提供服务发现和服务配置的工具。它包含了下面几个特性:

  • 服务发现
  • 健康检查
  • Key/Value存储
  • 多数据中

 

Consul引入

由于Spring Cloud Consul项目的实现,我们可以轻松的将基于Spring Boot的微服务应用注册到Consul上,并通过此实现微服务架构中的服务治理。

以之前实现的基于Eureka的示例(eureka-client)为基础,我们如何将之前实现的服务提供者注册到Consul上呢?方法非常简单,我们只需要在pom.xml中将eureka的依赖修改为如下依赖:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

接下来再修改一下application.properites,将consul需要的配置信息加入即可,比如:(下面配置是默认值)

spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500

到此为止,我们将eureka-client转换为基于consul服务治理的服务提供者就完成了

 

Consul 角色

  • client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群。
  • server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其它数据中心通讯。 每个数据中心的 server 数量推荐为 3 个或是 5 个。

 

Consul常用指令

 

Consul 工作原理

  • 1、当 Producer 启动的时候,会向 Consul 发送一个 post 请求,告诉 Consul 自己的 IP 和 Port
  • 2、Consul 接收到 Producer 的注册后,每隔10s(默认)会向 Producer 发送一个健康检查的请求,检验Producer是否健康
  • 3、当 Consumer 发送 GET 方式请求 /api/address 到 Producer 时,会先从 Consul 中拿到一个存储服务 IP 和 Port 的临时表,从表中拿到 Producer 的 IP 和 Port 后再发送 GET 方式请求 /api/address
  • 4、该临时表每隔10s会更新,只包含有通过了健康检查的 Producer

 

Consul的key/value数据持久化

dev模式下不会持久化数据

cmd启动:

consul agent -config-file=config.json

{

"bind_addr": "127.0.0.1",

"server": true,

"bootstrap_expect": 1,

"client_addr": "0.0.0.0",

"data_dir": "D:\\tool\\consul_1.4.4_windows_amd64\\data",

"log_level": "info",

"ui": true,

"rejoin_after_leave": true

}

 

Consul注册向windows注册服务

1、向path里添加D:\tool\consul_1.4.4_windows_amd64

2、以管理员身份启动命令提示符,执行

3、sc.exe create "Consul" binPath="consul agent -config-file=D:\\tool\\consul_1.4.4_windows_amd64\\config.json"

4、“运行“输入services.msc进入系统服务,将Consul服务设置为自动启动

 

windows删除Consul服务

通过管理员权限运行CMD,输入如下命令

1、Net Stop consul

2、sc delete consul

 

参考文章:

http://blog.didispace.com/spring-cloud-starter-dalston-1/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据与后端架构提升之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值