Spring Cloud 入门 ---- Consul 服务注册中心【随笔】
Spring Cloud 入门 ---- Consul 服务注册中心
介绍
Consul 是一套开源的分布式微服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发。提供了微服务中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用构建全方位的服务网络,总之 Consul 提供了一种完整的服务网络解决方案。它具有很多优点,包括:基于 raft 协议,比较简洁;支持健康检查,同时支持 HTTP 和 DNS 协议,支持跨数据中心的 WAN 集群,提供图形化界面、跨平台,支持 Linux、Mac、Windwos。
官网:https://www.consul.io/
中文文档:https://www.springcloud.cc/spring-cloud-consul.html
使用docker 安装 consul
拉取镜像
docker pull consul:1.8.0
启动 consul
docker run --name consul1.8.0 -d -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600 镜像ID
浏览器打开:http://192.168.0.106:8500/ui/dc1/services 即可看到我们安装的 consul 了【注意若开启了防火墙,需要关闭防火墙】
端口详情:
- 8500 : http 端口,用于 http 接口和 web ui访问;
- 8300 : server rpc 端口,同一数据中心 consul server 之间通过该端口通信;
- 8301 : serf lan 端口,同一数据中心 consul client 通过该端口通信; 用于处理当前datacenter中LAN的gossip通信;
- 8302 : serf wan 端口,不同数据中心 consul server 通过该端口通信; agent Server使用,处理与其他datacenter的gossip通信;
- 8600 : dns 端口,用于已注册的服务发现;
各项参数:
- –net=host docker参数, 使得docker容器越过了net namespace的隔离,免去手动指定端口映射的步骤
- -server consul支持以server或client的模式运行, server是服务发现模块的核心, client主要用于转发请求
- -advertise 将本机私有IP传递到consul
- -retry-join 指定要加入的consul节点地址,失败后会重试, 可多次指定不同的地址
- -client 指定consul绑定在哪个client地址上,这个地址可提供HTTP、DNS、RPC等服务,默认是>127.0.0.1
- -bind 绑定服务器的ip地址;该地址用来在集群内部的通讯,集群内的所有节点到地址必须是可达的,>默认是0.0.0.0
allow_stale 设置为true则表明可从consul集群的任一server节点获取dns信息, false则表明每次请求都会>经过consul的server leader- -bootstrap-expect 数据中心中预期的服务器数。指定后,Consul将等待指定数量的服务器可用,然后>启动群集。允许自动选举leader,但不能与传统-bootstrap标志一起使用, 需要在server模式下运行。
- -data-dir 数据存放的位置,用于持久化保存集群状态
- -node 群集中此节点的名称,这在群集中必须是唯一的,默认情况下是节点的主机名。
- -config-dir 指定配置文件,当这个目录下有 .json 结尾的文件就会被加载,详细可参考https://www.consul.io/docs/agent/options.html#configuration_files
- -enable-script-checks 检查服务是否处于活动状态,类似开启心跳
- -datacenter 数据中心名称
- -ui 开启ui界面
- -join 指定ip, 加入到已有的集群中
Consul 集群
docker run --name consul1.8.0 -d -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600 941109e2896d agent -server -bootstrap-expect 2 -ui -bind=0.0.0.0 -client=0.0.0.0
查看consul1的ip地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' consul1
开启第二个节点(端口8501),并加入到 consul1
docker run --name consul2 -d -p 8501:8500 consul agent -server -ui -bind=0.0.0.0 -client=0.0.0.0 -join 172.17.0.4
开启第三个节点(端口8502),并加入到consul1’
docker run --name consul3 -d -p 8502:8500 consul agent -server -ui -bind=0.0.0.0 -client=0.0.0.0 -join 172.17.0.4
查看consul集群信息
docker exec -it consul1 consul members
以下的服务都基于单机搭建
Consul 服务提供者模块
创建服务提供者
引入 pom 依赖
<!--consul依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
创建 application.yml 配置文件
server:
port: 8007
spring:
application:
name: consul-payment-provider
cloud:
consul:
host: 192.168.0.106
port: 8500
discovery:
service-name: ${spring.application.name}
heartbeat:
enabled: true
主启动
@SpringBootApplication
@EnableDiscoveryClient
public class ConsulPaymentApplication {
public static void main(String[] args) {
SpringApplication.run(ConsulPaymentApplication.class, args);
}
}
业务类
@RestController
@Slf4j
public class ConsulPaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/payment/consul")
public String paymentConsul(){
return "spring cloud with consul port: "+serverPort+"\t"+ UUID.randomUUID().toString();
}
}
测试服务提供者
浏览器打开 consul 查看注册中心的服务,可以看到 consul-payment-provider 已经注册成功。
点击进去可以看到服务的实例详情信息,如下图:
访问: http://localhost:8007/payment/consul 发现提供者的业务可以正常访问
服务提供者集群
修改 原有服务提供者
application.yml
配置名为application-one.yml
并复制一份修改名称为application-two.yml
【两者除了端口号其它一样】,具体配置如下:
application-one.yml
server:
port: 8007
spring:
application:
name: consul-payment-provider
cloud:
consul:
# consul所在服务器ip
host: 192.168.0.106
port: 8500
discovery:
# 当前服务的别名
service-name: ${spring.application.name}
# 开启心跳,默认关闭的
heartbeat:
enabled: true
application-two.yml
server:
port: 8008
spring:
application:
name: consul-payment-provider
cloud:
consul:
host: 192.168.0.106
port: 8500
discovery:
service-name: ${spring.application.name}
heartbeat:
enabled: true
修改原有的服务,并指定运行的配置文件
copy 修改后的服务,并修改名称 与 运行的配置文件
启动这两个服务提供者,在 consul 注册中心中即可看到
consul-payment-provider
服务存在两个节点。
访问:http://localhost:8007/payment/consul 与 http://localhost:8008/payment/consul 可以发现两个服务都是能够正常访问的。
Consul 服务消费者模块
创建服务消费者
引入 pom 依赖
<!--consul依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
创建 application.yml 配置文件
server:
port: 80
spring:
application:
name: consul-order-concumer
cloud:
consul:
host: 192.168.0.106
port: 8500
discovery:
service-name: ${spring.application.name}
heartbeat:
enabled: true
主启动
@SpringBootApplication
@EnableDiscoveryClient
public class ConsulOrderApplication {
public static void main(String[] args) {
SpringApplication.run(ConsulOrderApplication.class, args);
}
}
配置类:注入RestTemplate组件并设置默认的负载均衡规则 (轮询)
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
业务类
@RestController
@Slf4j
public class ConsulOrderController {
/**
* 服务别名
*/
private static final String INVOKE_URL = "http://consul-payment-provider";
@Resource
private RestTemplate restTemplate;
@GetMapping(value = "/consumer/payment/consul")
public String paymentInfo(){
String msg = restTemplate.getForObject(INVOKE_URL+"/payment/consul", String.class);
return msg;
}
}
测试服务消费者
启动服务,在 consul 中可以看到服务已经注册进入了注册中心,如下图:
访问:http://localhost/consumer/payment/consul ,可以看到服务消费者使用
轮询
的负载均衡策略,轮询调用 8007 与 8008 服务提供者【关于负载均衡会在后续章节介绍】。
三个注册中心的对比
CAP
- C:Consistemcu(强一致性)
- A:Availability(可用性)
- P:Partition tolerance(分区容错性)
CAP理论关注粒度是数据,而不是整体系统设计的策略;
CAP理论,最多只能同时较好的满足两个
。CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错这三个需求,因此,根据CAP 原理将 NoSQL 数据库分成了 满足CA 原则、满足CP原则 和 满足AP原则 三大类:
- CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
- CP - 满足一致性,分区容错性的系统,通常性能不是特别高。
- AP - 满足可用性,分区容错性的系统,通常可能对一致性要求低一些。
AP:Eureka CP:Zookeeper/ Consul
AP架构:
当网络分区出现后,为了保证可用性,系统B可以返回旧值,保证系统的可用性。
结论:违背一致性C的要求,只满足可用性和分区容错,即AP
CP架构:
当网络分区出现后,为了保证一致性,就必须拒接请求,否则无法保证一致性
结论:违背了可用性A的要求,只满足一致性和分区容错,即CP
至此,通用的三个注册中心【Eureka、ZooKeeper、Consul】已经介绍完毕,Nacos 则会在 SpringCloudAlibaba 中介绍。
推荐阅读
-
详解Spring Cloud Consul 实现服务注册和发现
-
详解Spring Cloud Consul 实现服务注册和发现
-
Spring Cloud 入门 Consul-Client服务提供
-
Spring Cloud Alibaba入门实践(四)-注册中心nacos
-
基于Spring Boot 2.0.2.RELEASE 的 Spring Cloud 速成指南 | 二. Spring Cloud 服务注册中心(Eureka Server)
-
Nacos快速入门(三):Spring Cloud Alibaba Nacos实现服务注册与发现
-
如何优化Spring Cloud微服务注册中心架构?
-
Spring Cloud 入门 Eureka-Server服务注册
-
Spring Cloud 入门 Consul-Server服务注册
-
Spring Cloud--搭建Eureka注册中心服务