ZookeeperAndConsul
Table of Contents generated with DocToc (opens new window)
# Zookeeper
首先,使用zookeeper作为注册中心,肯定需要启动zookeeper的server,这里使用的zookeeper版本是3.5.10,springcloud的版本是2020.0.5
zookeeper下载地址:https://cloud.zaiolos.top/s/oRF7
- 下载好后直接通过zkServer.cmd(我在win上)启动即可
# provider注册
# 新建payment8004模块
- 和其他payment步骤一致,端口号修改即可
# 增加依赖
<!-- zookeeper添加的依赖(zk的版本是3.5.10) -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
2
3
4
5
# 修改yaml
server:
port: 8004
spring:
application:
name: cloud-payment-service
cloud:
zookeeper:
connect-string: localhost:2181
2
3
4
5
6
7
8
# 增加验证接口
@Slf4j
@RestController
@RequestMapping("/payment")
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/zk")
public String paymentZk(){
return "springcloud with zookeeper: "+serverPort+"\t"+ UUID.randomUUID().toString();
}
}
2
3
4
5
6
7
8
9
10
11
12
13
# 验证
启动项目,再启动zkCli.cmd,执行
ls /
命令后,可以看到新增了services节点,进入services节点即可发现注册进去的payment服务
进入cloud-payment-service节点中我们发现有一串无规律编码的节点,这个节点就是我们真正注册进的服务所表示的节点(名为cloud-payment-service的服务,代表了其可以为多个),
使用get命令,可以获得此节点的JSON串信息,其中就有ip port等等
get /services/cloud-payment-service/0af6e3c5-57d4-4e52-97b9-b58c9fe719aa
# 临时or持久节点
注册进去的服务节点在zookeeper中是临时节点还是持久节点?
在关闭payment服务以后,zookeeper收不到心跳,是会将注册的服务节点进行移除的,所以是临时节点
# consumer注册
基本步骤和provider注册一致,yaml和pom都一样,启动后可在zCli中看到对应的consumer服务及其节点信息
# 验证
@Slf4j
@RestController
public class OrderZkController {
// public static final String PAYMENT_URL = "http://localhost:8001";
/**
* 调用地址改为微服务的名称(yaml中的application.name,这样调用时就会去eureka中获取提供者)
*/
public static final String PAYMENT_URL = "http://cloud-payment-service";
@Autowired
private RestTemplate restTemplate;
@GetMapping("/consumer/payment/zk")
public String create(Payment payment){
return restTemplate.getForObject(PAYMENT_URL+"/payment/zk", String.class);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 集群zookeeper配置
在yaml中
zookeeper: connect-string: localhost:2181,xxx:xxx,xxx:xxx 这样即可
# Consul
简介
Consul是一套开源的分布式服务发现和配置管理系统,由HashiCorp公司用Go语言开发
提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之Consul提供了一种完整的服务网格解决方案
它具有很多优点。包括:基于raft协议,比较简洁;支持健康检查,同时支持HTTP和DNS协议;支持跨数据中心的WAN集群;提供图形界面;跨平台,支持Linux、Mac、Windows
# Consul能干嘛
- 服务发现:提供HTTP和DNS两种发现方式
- 健康检测:支持多种方式,HTTP、TCP、Docker、Shell脚本定制化
- KV存储:提供Key、Value键值对的存储方式
- 多数据中心:Consul支持多数据中心
- 可视化Web界面
# 中文文档
https://www.springcloud.cc/spring-cloud-consul.html
# 下载安装
官网下载即可 https://www.consul.io/ win版本就是一个exe文件
# 启动
consul --version #查看版本
consul agent -dev #以开发模式启动
# 启动后访问 http://localhost:8500
2
3
控制面板:
# provider注册
# pom
<!-- consul依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
2
3
4
5
# yaml
### consul服务端口号
server:
port: 8006
spring:
application:
name: consul-provider-payment-service
##consul注册中心地址
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
# hostname: 127.0.0.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
然后添加主启动类,编写测试controller
@Slf4j
@RestController
public class ConsulPaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("payment/consul")
public String paymentZk(){
return "springcloud with consul: "+serverPort+"\t"+ UUID.randomUUID().toString();
}
}
2
3
4
5
6
7
8
9
10
11
启动服务可以发现consul控制台已显示成功
# consumer注册
步骤基本一致,不赘述
直接测试
@Slf4j
@RestController
public class OrderConsulController {
// public static final String PAYMENT_URL = "http://localhost:8001";
/**
* 调用地址改为微服务的名称(yaml中的application.name,这样调用时就会去eureka中获取提供者)
*/
public static final String PAYMENT_URL = "http://consul-provider-payment-service";
@Autowired
private RestTemplate restTemplate;
@GetMapping("/consumer/payment/consul")
public String create(){
return restTemplate.getForObject(PAYMENT_URL+"/payment/consul", String.class);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 三个注册中心的异同点
组件名 | 语言 | CAP | 服务健康检查 | 对外暴露接口 | Spring Cloud集成 |
---|---|---|---|---|---|
Eureka | Java | AP | 可配支持 | HTTP | 已集成 |
Consul | Go | CP | 支持 | HTTP/DNS | 已集成 |
Zookeeper | Java | CP | 支持 | 客户端 | 已集成 |
# CAP
- C:Consistency(强一致性)
- A:Availability(高可用性)
- P:Partition tolerance(分区容错性)
CAP理论关注丽都是数据,而不是整体系统设计的策略
最多只能同时较好的满足两个
CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求
因此,根据CAP原理将NoSQL数据库分成了满足CA原则、满足CP原则和满足AP原则三大类:
CA:单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。 CP:满足一致性,分区容错性的系统,通常性能不是特别高。 AP:满足可用性,分区容错性的系统,通常可能对一致性要求低一些。
# AP
AP架构,当网络分区出现后,为了保证可用性,系统B
可以返回久值
,保证系统的可用性结论:违背了一致性C的要求,只满足可用性和分区容错,即AP
# CP
CP架构 当网络分区出现后,为了保证一致性,就必须拒绝请求,否则无法保证一致性
结论:违背了可用性A的要求,只满足一致性和分区容错,即CP