该项目通过自动配置和Spring环境以及其他Spring编程模型习惯用法提供了Spring Boot应用程序的Consul集成。 通过一些简单的注释,您可以快速启用和配置应用程序内的通用模式,并使用基于Consul的组件构建大型分布式系统。 提供的模式包括服务发现,控制总线和配置。 智能路由(Zuul)和客户端负载平衡(功能区),断路器(Hystrix)通过与Spring Cloud Netflix集成提供。

在上个月我们知道 Eureka 2.X 遇到困难停止开发了,但其实对国内的用户影响甚小,一方面国内大都使用的是 Eureka 1.X 系列,另一方面 Spring Cloud 支持很多服务发现的软件,Eureka 只是其中之一,下面是 Spring Cloud 支持的服务发现软件以及特性对比:

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

Consul 介绍

Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其它分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其它工具(比如 ZooKeeper 等)。使用起来也较为简单。Consul 使用 Go 语言编写,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。

Consul 的优势:

  • 使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft。
  • 支持多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟, 分片等情况等。 zookeeper 和 etcd 均不提供多数据中心功能的支持。
  • 支持健康检查。 etcd 不提供此功能。
  • 支持 http 和 dns 协议接口。 zookeeper 的集成较为复杂, etcd 只支持 http 协议。
  • 官方提供 web 管理界面, etcd 无此功能。
  • 综合比较, Consul 作为服务注册和配置管理的新星, 比较值得关注和研究。

特性:

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

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

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

Consul VS Eureka

Eureka 是一个服务发现工具。该体系结构主要是客户端/服务器,每个数据中心有一组 Eureka 服务器,通常每个可用区域一个。通常 Eureka 的客户使用嵌入式 SDK 来注册和发现服务。对于非本地集成的客户,官方提供的 Eureka 一些 REST 操作 API,其它语言可以使用这些 API 来实现对 Eureka Server 的操作从而实现一个非 jvm 语言的 Eureka Client。

Eureka 提供了一个弱一致的服务视图,尽可能的提供服务可用性。当客户端向服务器注册时,该服务器将尝试复制到其它服务器,但不提供保证复制完成。服务注册的生存时间(TTL)较短,要求客户端对服务器心跳检测。不健康的服务或节点停止心跳,导致它们超时并从注册表中删除。服务发现可以路由到注册的任何服务,由于心跳检测机制有时间间隔,可能会导致部分服务不可用。这个简化的模型允许简单的群集管理和高可扩展性。

Consul 提供了一些列特性,包括更丰富的健康检查,键值对存储以及多数据中心。Consul 需要每个数据中心都有一套服务,以及每个客户端的 agent,类似于使用像 Ribbon 这样的服务。Consul agent 允许大多数应用程序成为 Consul 不知情者,通过配置文件执行服务注册并通过 DNS 或负载平衡器 sidecars 发现。

Consul 提供强大的一致性保证,因为服务器使用 Raft 协议复制状态 。Consul 支持丰富的健康检查,包括 TCP,HTTP,Nagios / Sensu 兼容脚本或基于 Eureka 的 TTL。客户端节点参与基于 Gossip 协议的健康检查,该检查分发健康检查工作,而不像集中式心跳检测那样成为可扩展性挑战。发现请求被路由到选举出来的 leader,这使他们默认情况下强一致性。允许客户端过时读取取使任何服务器处理他们的请求,从而实现像 Eureka 这样的线性可伸缩性。

Consul 强烈的一致性意味着它可以作为领导选举和集群协调的锁定服务。Eureka 不提供类似的保证,并且通常需要为需要执行协调或具有更强一致性需求的服务运行 ZooKeeper。

Consul 提供了支持面向服务的体系结构所需的一系列功能。这包括服务发现,还包括丰富的运行状况检查,锁定,密钥/值,多数据中心联合,事件系统和 ACL。Consul 和 consul-template 和 envconsul 等工具生态系统都试图尽量减少集成所需的应用程序更改,以避免需要通过 SDK 进行本地集成。Eureka 是一个更大的 Netflix OSS 套件的一部分,该套件预计应用程序相对均匀且紧密集成。因此 Eureka 只解决了一小部分问题,可以和 ZooKeeper 等其它工具可以一起使用。

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

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

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

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

其它方面,eureka 就是个 servlet 程序,跑在 servlet 容器中; Consul 则是 go 编写而成。

安装Consul

安装文档

Consul代理

所有Spring Cloud Consul应用程序都必须使用Consul Agent客户端。 默认情况下,代理客户端应位于localhost:8500。 有关如何启动代理客户端以及如何连接到Consul Agent Server群集的详细信息,请参阅代理文档。 对于开发,在安装了consul之后,您可以使用以下命令启动Consul Agent:

Linux

./src/main/bash/local_run_consul.sh

这将在端口8500上以服务器模式启动代理,其中浏览器可访问http://localhost:8500

window下安装

Consul 不同于 Eureka 需要单独安装,访问Consul 官网下载 Consul 的最新版本,我这里是 consul_1.2.1。

根据不同的系统类型选择不同的安装包,从下图也可以看出 Consul 支持所有主流系统。

我这里以 Windows 为例,下载下来是一个 consul_1.2.1_windows_amd64.zip 的压缩包,解压是是一个 consul.exe 的执行文件。

cd 到对应的目录下,使用 cmd 启动 Consul


  1. cd E:\soft\consul_1.2.1_windows_amd64
  2. #cmd启动:
  3. consul agent -dev # -dev表示开发模式运行,另外还有-server表示服务模式运行

为了方便期间,可以在同级目录下创建一个 run.bat 脚本来启动,脚本内容如下:


  1. consul agent -dev
  2. pause

启动结果如下:

启动成功之后访问:http://localhost:8500,可以看到 Consul 的管理界面

这样就意味着我们的 Consul 服务启动成功了。

1.Consul服务发现

服务发现是基于微服务体系结构的关键原则之一。 尝试手动配置每个客户端或某种形式的约定可能非常困难,并且可能非常脆弱。 Consul通过HTTP API和DNS提供服务发现服务。 Spring Cloud Consul利用HTTP API进行服务注册和发现。 这并不妨碍非Spring Cloud应用程序利用DNS接口。 Consul 代理服务器在群集中运行,该群集通过八卦协议进行通信并使用Raft共识协议。

1.1如何添加consul


  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-consul-discovery</artifactId>
  4. </dependency>

1.2注册consul

当客户向Consul注册时,它会提供有关自身的元数据,例如主机和端口,ID,名称和标签。 默认情况下会创建HTTP检查,Consul每10秒命中一次/ health端点。 如果运行状况检查失败,则将服务实例标记为严重。

Consul客户端


  1. @SpringBootApplication
  2. @RestController
  3. public class Application {
  4. @RequestMapping("/")
  5. public String home() {
  6. return "Hello world";
  7. }
  8. public static void main(String[] args) {
  9. new SpringApplicationBuilder(Application.class).web(true).run(args);
  10. }
  11. }

(以上是一个普通的Spring Boot应用程序)。 如果Consul客户端位于localhost:8500以外的其他位置,则需要配置以查找客户端。如:

application.yml


  1. spring:
  2. cloud:
  3. consul:
  4. host: localhost
  5. port: 8500

注意:如果您使用Spring Cloud Consul Config,则需要将上述值放在bootstrap.yml而不是application.yml中。

从Environment获取的默认服务名称,实例ID和端口分别是$ {spring.application.name},Spring Context ID和$ {server.port}。

要禁用Consul Discovery Client,可以将spring.cloud.consul.discovery.enabled设置为false【客户端可以设置注册到 Consul 中,也可以不注册到 Consul 注册中心中,根据我们的业务来选择,只需要在使用服务时通过 Consul 对外提供的接口获取服务信息即可】。

要禁用服务注册,可以将spring.cloud.consul.discovery.register设置为false。

1.3HTTP健康检测

Consul实例的运行状况检查默认为“/ health”,这是Spring Boot Actuator应用程序中有用端点的默认位置。 如果使用非默认上下文路径或servlet路径(例如server.servletPath = / foo)或管理端点路径(例如management.context-path = / admin),则需要更改这些,即使对于Actuator应用程序也是如此。 还可以配置Consul用于检查健康端点的时间间隔。 “10s”和“1m”分别代表10秒和1分钟。

综上健康检测是需要依赖Spring Boot Actuator。

如:

application.yml


  1. spring:
  2. cloud:
  3. consul:
  4. discovery:
  5. healthCheckPath: ${management.context-path}/health
  6. healthCheckInterval: 15s

1.3.1元数据和Consul标签

Consul尚不支持服务元数据。 Spring Cloud的ServiceInstance有一个Map <String,String>元数据字段。 Spring Consul使用Consul标签来近似元数据,直到Consul正式支持元数据。 形式为key = value的标签将被拆分并分别用作Map键和值。 没有等号=的标签将用作键和值。

application.yml.


  1. spring:
  2. cloud:
  3. consul:
  4. discovery:
  5. tags: foo=bar, baz

上面的配置将生成一个带有foo→bar和baz→baz的映射。

1.3.2使Consul实例ID唯一

默认情况下,consul实例注册的ID等于其Spring Application Context ID。 默认情况下,Spring Application Context ID为$ {spring.application.name}:逗号,分隔,配置文件:${server.port}。 对于大多数情况,这将允许一台服务的多个实例在一台计算机上运行。 如果需要进一步的唯一性,使用Spring Cloud可以通过在spring.cloud.consul.discovery.instanceId中提供唯一标识符来覆盖它。 例如:

application.yml.


  1. spring:
  2. cloud:
  3. consul:
  4. discovery:
  5. instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}

1.4查找服务

1.4.1用Ribbon

Spring Cloud支持Feign(一个REST客户端构建器)和Spring RestTemplate,用于使用逻辑服务名称/ ID而不是物理URL查找服务。 Feign和发现感知RestTemplate都使用Ribbon进行客户端负载平衡。

如果您想使用RestTemplate访问服务STORES,只需在springboot主类中声明如下:


  1. @LoadBalanced
  2. @Bean
  3. public RestTemplate loadbalancedRestTemplate() {
  4. new RestTemplate();
  5. }

并像如下使用它(注意我们使用Consul的STORES服务名称而不完全限定域名):


  1. @Autowired
  2. RestTemplate restTemplate;
  3. public String getFirstProduct() {
  4. return this.restTemplate.getForObject("https://STORES/products/1", String.class);
  5. }

1.4.2 用DiscoveryClient

您还可以使用org.springframework.cloud.client.discovery.DiscoveryClient,它为不特定于Netflix的发现客户端提供简单的API,例如:


  1. @Autowired
  2. private DiscoveryClient discoveryClient;
  3. public String serviceUrl() {
  4. List<ServiceInstance> list = discoveryClient.getInstances("STORES");
  5. if (list != null && list.size() > 0 ) {
  6. return list.get(0).getUri();
  7. }
  8. return null;
  9. }

2.Consul失败重试

如果您希望应用程序启动时偶尔可能无法使用领事代理,您可以要求它在失败后继续尝试。 您需要在类路径中添加spring-retry和spring-boot-starter-aop。 默认行为是重试6次,初始退避间隔为1000毫秒,指数乘数为1.1,以便后续退避。 您可以使用spring.cloud.consul.retry.*配置属性配置这些属性(和其他属性)。 这适用于Spring Cloud Consul Config和Discovery注册。


  1. <dependency>
  2. <groupId>org.springframework.retry</groupId>
  3. <artifactId>spring-retry</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-aop</artifactId>
  8. </dependency>

3.整合Hystrix的断路器

应用程序可以使用Spring Cloud Netflix项目提供的Hystrix断路器,将此启动器包含在项目pom.xml中:spring-cloud-starter-hystrix。 Hystrix不依赖于Netflix Discovery Client。 @EnableHystrix注释应放在配置类(通常是springbooyt主类)上。 然后可以使用@HystrixCommand对方法进行注释,以便通过断路器进行保护。 有关详细信息,请参阅文档。

4.Hystrix检测整合Turbine和Consul

Turbine(由Spring Cloud Netflix项目提供)聚合多个Hystrix指标流实例,因此仪表板可以显示聚合视图。 Turbine使用DiscoveryClient接口查找相关实例。 要将Turbine与Spring Cloud Consul一起使用,请以类似于以下示例的方式配置Turbine应用程序:

pom.xml.


  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-netflix-turbine</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.cloud</groupId>
  7. <artifactId>spring-cloud-starter-consul-discovery</artifactId>
  8. </dependency>

请注意,Turbine依赖性不是startter。 turbine包括对Netflix Eureka的支持。

application.yml.


  1. spring.application.name: turbine
  2. applications: consulhystrixclient1,consulhystrixclient2
  3. turbine:
  4. aggregator:
  5. clusterConfig: ${applications}
  6. appConfig: ${applications}

clusterConfig和appConfig部分必须匹配,因此将逗号分隔的服务ID列表放入单独的配置属性中非常有用。

Turbine.java


  1. @EnableTurbine
  2. @SpringBootApplication
  3. public class Turbine {
  4. public static void main(String[] args) {
  5. SpringApplication.run(DemoturbinecommonsApplication.class, args);
  6. }
  7. }
      原文地址:https://blog.csdn.net/niugang0920/article/details/81183783                          </div>

Spring Cloud Consul综合整理的更多相关文章

  1. Spring Cloud Consul使用——服务注册与发现(注册中心)

    整理自该文章 一.Consul 服务端接下来我们开发 Consul 的服务端,创建一个 spring-cloud-consul-producer 项目 1.添加依赖包 <dependencies ...

  2. Spring Cloud Consul入门

    1. Consul介绍 Consul是一套开源的分布式服务发现和配置管理系统,支持多数据中心分布式高可用.Consul是HashiCorp( Vagrant的创建者)开发的一个服务发现与配置项目,用G ...

  3. Spring Cloud Consul 实现服务注册和发现

    Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具,它为基于 JVM 的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布 ...

  4. Spring Cloud Consul

    1.2.0.RELEASE 该项目通过自动配置并绑定到Spring环境和其他Spring编程模型成语,为Spring Boot应用程序提供Consul集成.通过几个简单的注释,您可以快速启用和配置应用 ...

  5. Spring Cloud Consul 之Greenwich版本全攻略

    什么是Consul Consul是HashiCorp公司推出的开源软件,使用GO语言编写,提供了分布式系统的服务注册和发现.配置等功能,这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全 ...

  6. 服务注册发现、配置中心集一体的 Spring Cloud Consul

    前面讲了 Eureka 和 Spring Cloud Config,今天介绍一个全能选手 「Consul」.它是 HashiCorp 公司推出,用于提供服务发现和服务配置的工具.用 go 语言开发,具 ...

  7. Spring Cloud Consul Config 知识点

    Spring Cloud Consul Config 是 Config Server 和 Client的替代方案. 搭建一个配置中心,可以选择的方案: Spring Cloud Config 或者 S ...

  8. spring cloud consul上下线体验

    spring cloud consul中默认会将spring.application.name作为ID 同一服务起多个实例时,ID默认会变成${spring.application.name}-${s ...

  9. Spring Cloud Consul 入门指引

    1 概述 Spring Cloud Consul 项目为 Spring Boot 应用程序提供了与 Consul 的轻松集成. Consul 是一个工具,它提供组件来解决微服务架构中一些最常见的挑战: ...

随机推荐

  1. 夏令营501-511NOIP训练18——高三楼

    传送门:QAQQAQ 题意:定义矩阵A与矩阵B重复,当且仅当A可以通过任意次行列交换得到B,例如下图A,B即为合法矩阵 现求对于$n*n$的矩阵有多少个不重复的矩阵 数据范围: 对于10%的数据 N≤ ...

  2. Java并发编程中的若干核心技术,向高手进阶!

    来源:http://www.jianshu.com/p/5f499f8212e7 引言 本文试图从一个更高的视角来总结Java语言中的并发编程内容,希望阅读完本文之后,可以收获一些内容,至少应该知道在 ...

  3. 连接 MySQL 报错:Lost connection to MySQL server at 'reading authorization packet', system error: 34

    报错信息: Lost connection to MySQL server at 解决方案: use mysql; ; flush privileges; 参考: https://blog.csdn. ...

  4. 笔记:使用Python解析JSON

    使用Python解析JSON json是一种轻量级的数据交换格式,易于阅读和编写. json函数具体作用描述 函数 具体描述作用 json.dumps 将python对象编码为JSON字符串 json ...

  5. loj6005 [网络流24题]最长递增子序列

    题意:给你一个序列,求不严格上升lcs长度/最多有几个没有重复元素的lcs/如果x1和xn可以多次出现,求最多有几个lcs?n<=500. 标程: #include<cstdio> ...

  6. Java jmx的使用

    JMX Java Management Extensions,Java管理扩展.本质就是用来监控java语言开发的程序,一般常用于jconsole,java visual VM的监控,今天主要介绍ja ...

  7. IDEA将代码推送至远程GitHub仓库

    1 在项目根路径下添加.gitignore文件 2 创建本地git仓库 3 git add操作 快捷键 ctrl+alt+a 4 git commit操作 快捷键ctrl+k 5 git push操作 ...

  8. HTML+css 小组件

    1.三角 代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...

  9. Git命令汇总(转)

    转自:http://blog.csdn.net/esrichinacd/article/details/17645951 图片看不清请点击放大

  10. 国内平台比特币(Bitcoin)搬砖流程教学

    建议搬砖时要的价差,实际费用与利润请自行计算,避免亏损或白做工请自行拿捏利润. 请搬砖前要先自行操作与确认双边平台的存取速度.利於拿捏时间,避免时间差导致亏损. (所有内容 仅供参考 盈亏自负) 搬砖 ...