spring-cloud-consul 服务注册发现与配置
下面是 Spring Cloud 支持的服务发现软件以及特性对比(Eureka 已停止更新,取而代之的是 Consul):
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公司推出的开源软件,使用GO语言编写,提供了分布式系统的服务注册和发现、配置等功能,这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格。Consul不仅具有服务治理的功能,而且使用分布式一致协议RAFT算法实现,有多数据中心的高可用方案,并且很容易和Spring Cloud等微服务框架集成,使用起来非常的简单,具有简单、易用、可插排等特点。使用简而言之,Consul提供了一种完整的服务网格解决方案 。
Consul具有以下的特点和功能:
服务发现:Consul的客户端可以向Consul注册服务,例如api服务或者mysql服务,其他客户端可以使用Consul来发现服务的提供者。Consul支持使用DNS或HTTP来注册和发现服务。
运行时健康检查:Consul客户端可以提供任意数量的运行状况检查机制,这些检查机制可以是给定服务(“是Web服务器返回200 OK”)或本地节点(“内存利用率低于90%”)相关联。这些信息可以用来监控群集的运行状况,服务发现组件可以使用这些监控信息来路由流量,可以使流量远离不健康的服务。
KV存储:应用程序可以将Consul的键/值存储用于任何需求,包括动态配置,功能标记,协调,领导者选举等。它采用HTTP API使其易于使用。
安全服务通信:Consul可以为服务生成和分发TLS证书,以建立相互的TLS连接。
多数据中心:Consul支持多个数据中心。这意味着Consul的用户不必担心构建额外的抽象层以扩展到多个区域。
Consul原理:
每个提供服务的节点都运行了Consul的代理,运行代理不需要服务发现和获取配置的KV键值对,代理只负责监控检查。代理节点可以和一个或者多个Consul server通讯。 Consul服务器是存储和复制数据的地方。服务器本身选出了领导者。虽然Consul可以在一台服务器上运行,但建议使用3到5,以避免导致数据丢失的故障情况。建议为每个数据中心使用一组Consul服务器。
如果你的组件需要发现服务,可以查询任何Consul Server或任何Consul客户端,Consul客户端会自动将查询转发给Consul Server。需要发现其他服务或节点的基础架构组件可以查询任何Consul服务器或任何Consul代理。代理会自动将查询转发给服务器。每个数据中心都运行Consul服务器集群。发生跨数据中心服务发现或配置请求时,本地Consul服务器会将请求转发到远程数据中心并返回结果。
Consul 服务注册发现流程:
Consul在业界最广泛的用途就是作为服务注册中心,同Eureka类型,consul作为服务注册中心,它的注册和发现过程如下图:
- 当 Producer 启动的时候,会向 Consul 发送一个 post 请求,告诉 Consul 自己的 IP 和 Port
- Consul 接收到 Producer 的注册后,每隔10s(默认)会向 Producer 发送一个健康检查的请求,检验Producer是否健康
- 当 Consumer 发送 GET 方式请求 /api/address 到 Producer 时,会先从 Consul 中拿到一个存储服务 IP 和 Port 的临时表,从表中拿到 Producer 的 IP 和 Port 后再发送 GET 方式请求 /api/address
- 该临时表每隔10s会更新,只包含有通过了健康检查的 Producer
Consul (CA)VS Eureka (AP):
Eureka是一种服务发现工具。 该体系结构主要是客户端/服务器,每个数据中心有一组Eureka服务器,通常每个可用区域一个。 通常,Eureka的客户使用嵌入式SDK来注册和发现服务。 对于非本地集成的客户端,使用Ribbon等边车通过Eureka透明地发现服务。Eureka使用尽力而为的复制提供弱一致的服务视图。 当客户端向服务器注册时,该服务器将尝试复制到其他服务器但不提供保证。 服务注册的生存时间很短(TTL),要求客户端对服务器进行心跳检测。 不健康的服务或节点将停止心跳,导致它们超时并从注册表中删除。 发现请求可以路由到任何服务,由于尽力复制,这些服务可以提供过时或丢失的数据。 这种简化的模型允许轻松的集群管理和高可扩展性。
Consul提供了一系列超级功能,包括更丰富的运行状况检查,键/值存储和多数据中心感知。 Consul需要每个数据中心中的一组服务器,以及每个客户端上的代理,类似于使用像Ribbon这样的边车。 Consul代理允许大多数应用程序不知道Consul,通过配置文件执行服务注册以及通过DNS或负载平衡器sidecars进行发现。
Consul提供强大的一致性保证,因为服务器使用Raft协议复制状态。 Consul支持丰富的运行状况检查,包括TCP,HTTP,Nagios / Sensu兼容脚本或基于的Eureka的TTL。 客户端节点参与基于gossip的健康检查,该检查分发健康检查的工作,而不像集中式心跳,这成为可扩展性挑战。 发现请求被路由到当选的Consul领导者,这使他们默认情况下非常一致。 允许过时读取的客户端允许任何服务器处理其请求,从而允许像Eureka一样的线性可伸缩性。
Consul的强烈一致性意味着它可以用作领导者选举和集群协调的锁定服务。 Eureka不提供类似的保证,并且通常需要为需要执行协调或具有更强一致性需求的服务运行ZooKeeper。
Consul提供了支持面向服务的体系结构所需的功能工具包。 这包括服务发现,还包括丰富的运行状况检查,锁定,键/值,多数据中心联合,事件系统和ACL。 Consul和consul-template和envconsul等工具生态系统都试图最大限度地减少集成所需的应用程序更改,以避免需要通过SDK进行本机集成
Eureka是更大的Netflix OSS套件的一部分,该套件期望应用程序相对同质且紧密集成。 因此,Eureka只解决了有限的一部分问题,期望其他工具如ZooKeeper可以同时使用。
Eureka Server端采用的是P2P的复制模式,但是它不保证复制操作一定能成功,因此它提供的是一个最终一致性的服务实例视图;Client端在Server端的注册信息有一个带期限的租约,一旦Server端在指定期间没有收到Client端发送的心跳,则Server端会认定为Client端注册的服务是不健康的,定时任务将会将其从注册表中删除。Consul与Eureka不同,Consul采用Raft算法,可以提供强一致性的保证,Consul的agent相当于Netflix Ribbon + Netflix Eureka Client,而且对应用来说相对透明,同时相对于Eureka这种集中式的心跳检测机制,Consul的agent可以参与到基于goosip协议的健康检查,分散了server端的心跳检测压力。除此之外,Consul为多数据中心提供了开箱即用的原生支持等。
Consul 安装:
下载地址:https://www.consul.io/downloads.html
我这里以 Windows 为例,下载下来是一个 consul_1.7.2_windows_amd64.zip 的压缩包,解压是是一个 consul.exe 的执行文件.
需要再环境变量 path 里配置 consul.exe 的执行文件的路径
然后查看版本信息:consul --version
consul的一些常见的执行命令如下:
命令 | 解释 | 示例 |
---|---|---|
agent | 运行一个consul agent | consul agent -dev |
join | 将agent加入到consul集群 | consul join IP |
members | 列出consul cluster集群中的members | consul members |
leave | 将节点移除所在集群 | consul leave |
更多命令请查看官方网站:https://www.consul.io/docs/commands/index.html
使用 开发模式启动:consul agent -dev ,然后访问 http://localhost:8500/
使用spring cloud consul来服务注册与发现:
先来看服务的提供方:
1.创建一个标准的springboot项目,添加以下依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
2.添加配置文件 application.properties
spring:
application:
name: consul-server-hello
cloud:
consul:
port: 8500 # consul代理端口
host: localhost # consul代理ip
enabled: true #启用 spring cloud consul
discovery:
# 配置服务注册到Consul上
register: true # 是否开启在 consul 中注册服务
health-check-path: /actuator/health #定义 consul 健康检查路径
health-check-interval: 10s # consul 健康检查频率
instance-id: ${spring.application.name}:${server.port} # 配置注册到consul 服务的id
enabled: true #启用 consul 服务发现
service-name: ${spring.application.name} #设置 注册到 consul 的服务名称
ip-address: localhost # 访问服务时使用的 ip地址 (还必须设置preferIpAddress才能使用)
prefer-ip-address: true
server:
port: 8081
3.启动类:
@SpringBootApplication
@EnableDiscoveryClient
public class ConsulServerApp { public static void main(String[] args) {
SpringApplication.run(ConsulServerApp.class, args);
}
}
4.提供一个接口:
@RestController
public class TestController { @GetMapping("/hello")
public String home() {
return "hi ,i am from Consul:";
}
}
5.然后启动该服务,打开consul控制台会发现服务已经注册上去了。
服务消费者的搭建过程同服务提供者,在pom文件中引入的依赖同服务提供者,在配置文件application.yml配置同服务提供者,不同的点在端口为8655,服务名为consul-ribbon。
1.这里采用 ribbon 客户端,添加以下依赖,如果使用 feign 按照之前的配置即可,导入相应依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
2.提供个 rest 接口用域调用测试:
@RestController
public class RibbonController {
//需要配置该服务在condul里注册的名字
private static final String REST_URL_PREFIX = "http://consul-server-hello"; @Autowired
private RestTemplate restTemplate; @RequestMapping(value = "/consulHello")
public String find() throws ExecutionException, InterruptedException { return restTemplate.getForObject(REST_URL_PREFIX + "/hello", String.class);
}
}
3.主启动类:
@SpringBootApplication
@EnableDiscoveryClient
public class ConsulRibbonApp { public static void main(String[] args) {
SpringApplication.run(ConsulRibbonApp.class, args);
}
@Bean
@LoadBalanced // ribbon是客户端 的负载均衡工具
//默认算法是轮询算法 核心组件IRule
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
4.启动该项目,注册完成如下图:
5.测试调用 http://localhost:8655/consulHello 可以看到返回信息。这样就完成最基本的服务调用。
使用Spring Cloud Consul Config来做服务配置中心:
Consul不仅能用来服务注册和发现,Consul而且支持Key/Value键值对的存储,可以用来做配置中心。Spring Cloud 提供了Spring Cloud Consul Config依赖去和Consul相集成,用来做配置中心。现在以案例的形式来讲解如何使用Consul作为配置中心,本案例在上一个案例的consul-server-hello基础上进行改造。首先在工程的pom文件加上consul-config的起步依赖,代码如下:
1. pom 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
2.这里需要修改配置文件了,由于application有不同的环境文件类型,比如 dev、test。我们这里先添加 boostrap.yml
spring:
application:
name: consul-server-hello
cloud:
consul:
port: 8500 # consul代理端口
host: localhost # consul代理ip
enabled: true #启用 spring cloud consul
discovery:
# 配置服务注册到Consul上
register: true # 是否开启在 consul 中注册服务
health-check-path: /actuator/health #定义 consul 健康检查路径
health-check-interval: 10s # consul 健康检查频率
instance-id: ${spring.application.name}:${server.port} # 配置注册到consul 服务的id
enabled: true #启用 consul 服务发现
service-name: ${spring.application.name} #设置 注册到 consul 的服务名称
ip-address: localhost # 访问服务时使用的 ip地址 (还必须设置preferIpAddress才能使用)
prefer-ip-address: true
config:
enabled: true
format: yaml
prefix: config
profile-separator: ':'
data-key: data
default-context: consul-server-hello
关于spring.cloud.consul.config的配置项描述如下:
- enabled 设置config是否启用,默认为true
- format 设置配置的值的格式,可以yaml和properties
- prefix 设置配的基本目录,比如config
- defaultContext 设置默认的配置,被所有的应用读取
- profileSeparator profiles配置分隔符,默认为‘,’
- date-key为应用配置的key名字,值为整个应用配置的字符串。
3.然后修改 application.yml 为:
spring:
profiles:
active: dev
4.新增 application-dev.yml
server:
port: 8081
5.网页上访问consul的KV存储的管理界面,即http://localhost:8500/ui/dc1/kv,创建一条记录 ,按照我们上面的配置信息,这里需要新增为 config/consul-server-hello:dev/data
6. 修改服务端的接口:
@RestController
public class TestController { @Value("${foo.bar}")
String fooBar; @GetMapping("/foo")
public String getFooBar() {
return fooBar;
} @GetMapping("/hello")
public String home() {
return "hi ,i am from Consul:";
}
}
7.服务调用放也要新增接口:
@RestController
public class RibbonController { // private static final String REST_URL_PREFIX="http://localhost:8001"; 单机版
//集群的时候 需要配置该服务在eureka里注册的名字
private static final String REST_URL_PREFIX = "http://consul-server-hello"; @Autowired
private RestTemplate restTemplate; @RequestMapping(value = "/consulHello")
public String find() throws ExecutionException, InterruptedException { return restTemplate.getForObject(REST_URL_PREFIX + "/hello", String.class);
} @RequestMapping(value = "/foo")
public String foo() throws ExecutionException, InterruptedException { return restTemplate.getForObject(REST_URL_PREFIX + "/foo", String.class);
}
}
8.都启动后访问 http://localhost:8655/foo
动态刷新配置:
当使用spring cloud config作为配置中心的时候,可以使用spring cloud config bus支持动态刷新配置。Spring Cloud Comsul Config默认就支持动态刷新,只需要在需要动态刷新的类上加上@RefreshScope注解即可
注意事项:
- consul支持的KV存储的Value值不能超过512KB
- Consul的dev模式,所有数据都存储在内存中,重启Consul的时候会导致所有数据丢失,在正式的环境中,Consul的数据会持久化,数据不会丢失。
spring-cloud-consul 服务注册发现与配置的更多相关文章
- SpringBoot + Spring Cloud Consul 服务注册和发现
什么是Consul Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其它分布式服务注册与发现的方案,Consul 的方案更"一站式" ...
- 玩转Spring Cloud之服务注册发现(eureka)及负载均衡消费(ribbon、feign)
如果说用Spring Boot+Spring MVC是开发单体应用(或单体服务)的利器,那么Spring Boot+Spring MVC+Spring Cloud将是开发分布式应用(快速构建微服务)的 ...
- spring cloud Eureka 服务注册发现与调用
记录一下用spring cloud Eureka搭建服务注册与发现框架的过程. 为了创建spring项目方便,使用了STS. 一.Eureka注册中心 1.新建项目-Spring Starter Pr ...
- Spring Cloud 之 服务注册与发现
作为微服务框架,提供服务注册发现是最基本的功能.Spring Cloud 针对服务注册发现 提供了 Eureka版本的实现 .Zookeeper版本的实现.Consul版本的实现.由于历史原因 Eur ...
- 服务注册发现、配置中心集一体的 Spring Cloud Consul
前面讲了 Eureka 和 Spring Cloud Config,今天介绍一个全能选手 「Consul」.它是 HashiCorp 公司推出,用于提供服务发现和服务配置的工具.用 go 语言开发,具 ...
- Spring cloud实现服务注册及发现
服务注册与发现对于微服务系统来说非常重要.有了服务发现与注册,你就不需要整天改服务调用的配置文件了,你只需要使用服务的标识符,就可以访问到服务. 本文属于<7天学会spring cloud系列& ...
- 如何优化Spring Cloud微服务注册中心架构?
作者: 石杉的架构笔记 1.再回顾:什么是服务注册中心? 先回顾一下什么叫做服务注册中心? 顾名思义,假设你有一个分布式系统,里面包含了多个服务,部署在不同的机器上,然后这些不同机器上的服务之间要互相 ...
- Spring Cloud中服务的发现与消费
之前没注意,微信公众号的图片不能引用到其他地方,本文图片显示不正常,原图在写完博客后已经删了,,,,,,所以本文小伙伴可以移步这里https://mp.weixin.qq.com/s/GoIZdwt5 ...
- SpringBoot + Spring Cloud Eureka 服务注册与发现
什么是Spring Cloud Eureka Eureka是Netflix公司开发的开源服务注册发现组件,服务发现可以说是微服务开发的核心功能了,微服务部署后一定要有服务注册和发现的能力,Eureka ...
随机推荐
- NGK公链全面服务旅游经济
有数据显示,2019 年全球旅游总收入已达 6.5万亿美元, 占全球 GDP 的 7.3%,旅游业发展所创造的收益,于全球经济的重要性,不言而喻. 在旅游产业蓬勃发展的同时,中心化运营模式下却仍存在痛 ...
- Git 学习相关笔记
Git Bash 相关命令学 基础概念 参考: https://www.cnblogs.com/gaoht/p/9087070.html https://www.runoob.com/git/git- ...
- UDP编程详解
目录 报文格式 通信过程 UDP客户端流程 UDP客户端编码 UDP服务器流程 UDP服务器编码 参考文献 UDP与TCP的不同之处是:他的通信不需要建立连接的过程.中文名称用户数据报协议.时OSI参 ...
- banner自用图床2
- hutool的DateUtil工具类
1.0.DateUitl(日期时间) 0)坐标 <dependency> <groupId>cn.hutool</groupId> <artifactId&g ...
- Navicat Premium的数据传输功能----将远程Mysql数据库复制到本地数据库的方法
1.先连上本地.远程的数据库 2.在本地建一个和你要复制的远程数据库的名称一样的数据库 3.数据转移.工具-->数据传输-->填写源数据库和目标数据库-->下一步-->开始 注 ...
- Android - 利用扩展函数为Bitmap添加文字水印
<异空间>项目技术分享系列--扩展函数为Bitmap添加文字水印 对图片Bitmap绘制文字水印还是比较常见的需求,毕竟版权意识都在增强(用户可以给自己图片加上用户名),还可以为用户提供更 ...
- Pyqt5——变色的表格
需求:鼠标左键点击表格后,对应的单元格背景颜色发生变化. 实现:(1)使用Qt的model-view模式生成表格视图. (2)重写表格的点击事件. (3)设置表格的背景颜色. 正常情况下,当用户选中单 ...
- ng-class动态类几种用法
方法1.逻辑在后面的中括号里面 ng-class="{true : 'checker disabled',false : 'checker' }[selectAllButton]" ...
- 如何使用python爬取网页动态数据
我们在使用python爬取网页数据的时候,会遇到页面的数据是通过js脚本动态加载的情况,这时候我们就得模拟接口请求信息,根据接口返回结果来获取我们想要的数据. 以某电影网站为例:我们要获取到电影名称以 ...