3.2 SpringCloud整合Zookeeper集群步骤
**思路:**需要在每台zookeeper上注册服务就可,然后消费者需要服务时,根据负载均衡轮训获取服务.每个zookeeper之间应该也需要相互注册.
具体操作等用到了再完善.
4.Consul服务注册与发现
4.1 Consul简介
4.1.1 是什么?
https://www.consul.io/intro/index.html
4.1.2 能干嘛?
- 服务发现
提供HTTP和DNS两种发现方式。
- 健康监测
支持多种方式,HTTP、TCP、Docker、Shell脚本定制化监控
- KV存储
Key、Value的存储方式
- 多数据中心
Consul支持多数据中心
- 可视化Web界面
4.1.3 去哪下?
https://www.consul.io/downloads.html
4.1.4 怎么玩?
https://www.springcloud.cc/spring-cloud-consul.html
4.2 安装并运行Consul
- 官网安装说明
https://learn.hashicorp.com/consul/getting-started/install.html
Linux下使用yum -y install consul
进行安装
下载完成后只有一个consul.exe文件,windows路径下双击运行.
使用开发模式启动
windows:consul agent -dev
Linux:consul agent -dev -ui -node=consul-dev -client=主机IP
验证是否安装成功
通过以下地址可以访问Consul的首页:http://localhost:8500
4.3 服务提供者
- 建Module—cloud-providerconsul-payment8006
- POM
<dependencies> <!--SpringCloud consul-server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <!-- SpringBoot整合Web组件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--日常通用jar包配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
- YML
###consul服务端口号 server: port: 8006 spring: application: name: consul-provider-payment ####consul注册中心地址 cloud: consul: host: 192.168.174.128 # 用linux的IP地址 port: 8500 discovery: #hostname: 127.0.0.1 配置当前项目所在的主机IP, service-name: ${spring.application.name} heartbeat: # 如果心跳不打开,则服务上面可能出现一个红叉 enabled: true
- 主启动
@SpringBootApplication @EnableDiscoveryClient public class ConsulPaymentMain8006 { public static void main(String[] args) { SpringApplication.run(ConsulPaymentMain8006.class, args); } }
- 业务类Controller
@RestController public class PaymentController { @Value("${server.port}") private String serverPort; @RequestMapping(value = "/payment/consul") public String paymentConsul(){ return "springcloud with consul: "+serverPort+"\t"+ UUID.randomUUID().toString(); } }
- 验证测试
4.4 服务消费者
- 建Module—新建Module消费服务order80
- POM
<dependencies> <!--SpringCloud consul-server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <!-- SpringBoot整合Web组件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--日常通用jar包配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
- YML
###consul服务端口号 server: port: 80 spring: application: name: cloud-consumer-order ####consul注册中心地址 cloud: consul: host: 192.168.174.128 port: 8500 discovery: #hostname: 127.0.0.1 service-name: ${spring.application.name} heartbeat: enabled: true
- 主启动类
@SpringBootApplication @EnableDiscoveryClient public class ConsulOrderMain80 { public static void main(String[] args) { SpringApplication.run(ConsulOrderMain80.class, args); } }
- 配置Bean
@Configuration public class ApplicationContextConfig { //向SpringBoot容器中加入该组件 @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
- Controller
@RestController @Slf4j public class OrderController { public static final String INVOKE_URL = "http://consul-provider-payment"; @Resource public RestTemplate restTemplate; @RequestMapping(value = "/consumer/payment/consul") public String paymentInfo(){ String result = restTemplate.getForObject(INVOKE_URL + "/payment/consul", String.class); System.out.println("消费者调用支付服务(consul)--->result:"+result); return result; } }
- 验证测试
4.5 三个注册中心异同点
4.5.1 CAP理论
C:Consistency(强一致性)
A:Availability(可用性)
P:Partition tolerance(分区容错性)
CAP理论关注粒度是数据,而不是整体系统设计的策略
最多只能同时较好的满足两个。
CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求, 因此,根据 CAP 原理分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三 大类:
CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
CP - 满足一致性,分区容忍必的系统,通常性能不是特别高。
AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。
4.5.2 经典CAP图
- AP(Eureka)
当网络分区出现后,为了保证可用性,系统B可以返回旧值,保证系统的可用性。
结论:违背了一致性C的要求,只满足可用性和分区容错,即AP
- CP(Zookeeper/Consul)
当网络分区出现后,为了保证一致性,就必须拒接请求,否则无法保证一致性
结论:违背了可用性A的要求,只满足一致性和分区容错,即CP