文章目录
前置内容
(1)、微服务理论入门和手把手带你进行微服务环境搭建及支付、订单业务编写
(2)、SpringCloud之Eureka服务注册与发现
(3)、SpringCloud之Zookeeper进行服务注册与发现
1、Consul
1.1、Consul简介
1.1.1、Consul是什么?
Consul
是一套开源的分布式服务发现和配置管理系统,由HashiCorp
公司用Go
语言开发。- 它提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个可以根据需要单独使用,也可以一起使用以构建全方位的服务网络。
- 它基于
raft
协议,比较简洁;支持健康检查,同时支持Http
和DNS
协议,支持跨数据中心的WAN
集群,提供图形界面;同时它也支持跨平台。
1.1.2、Consul的特点和作用
- 服务发现:提供
HTTP
和DNS
两种发现方式。 - 健康监测:支持多种协议,
HTTP
、TCP
、Docker
、Shell
脚本定制化。 - KV存储:
key
、Value
的存储方式。 - 多数据中心:
Consul
支持多数据中心 - 可视化Web界面
1.2、Consul的安装和运行
- Consul下载地址
- Consul使用手册
- 下载解压之后发现是一个
exe
文件,所以我们只需要在其放置的目录下进行命令行操作即可。
consul agent -dev
1. 操作本地访问测试之后的结果
1.3、服务提供者入驻Consul
1. 建Module
Module
的名称为cloud-providerconsul-payment8006
。
2. 改POM
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>cloud02</artifactId><groupId>com.xiao</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>cloud-providerconsul-payment8006</artifactId><dependencies><!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-consul-discovery --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency><dependency><groupId>com.xiao</groupId><artifactId>cloud-api-commons</artifactId><version>1.0-SNAPSHOT</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies></project>
3. 改YML
server:port:8006spring:application:name: consul-provider-payment
cloud:consul:host: localhost
port:8500discovery:service-name: ${spring.application.name}
4. 主启动
importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication@EnableDiscoveryClientpublicclassPaymentMain8006{publicstaticvoidmain(String[] args){SpringApplication.run(PaymentMain8006.class,args);}}
5. 业务类
importcn.hutool.core.lang.UUID;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;@RestController@Slf4jpublicclassPaymentController{@Value("${server.port}")privateString serverPort;@GetMapping(value ="/payment/consul")publicStringpaymentConsul(){return"springcloud with consul: "+serverPort+"\t"+ UUID.randomUUID().toString();}}
6. 测试结果
7. 包结构图示
1.4、服务消费者入驻Consul
1. 建Module
Module
的名称为cloud-consumerconsul-order80
。
2. 改POM
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>cloud02</artifactId><groupId>com.xiao</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>cloud-consumerconsul-order80</artifactId><dependencies><!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-consul-discovery --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency><dependency><groupId>com.xiao</groupId><artifactId>cloud-api-commons</artifactId><version>1.0-SNAPSHOT</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies></project>
3. 改YML
server:port:80spring:application:name: consul-consumer-order
cloud:consul:host: localhost
port:8500discovery:service-name: ${spring.application.name}
4. 主启动
importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication@EnableDiscoveryClientpublicclassOrderConsulMain80{publicstaticvoidmain(String[] args){SpringApplication.run(OrderConsulMain80.class,args);}}
5. 配置类
importorg.springframework.cloud.client.loadbalancer.LoadBalanced;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.client.RestTemplate;@ConfigurationpublicclassApplicationContextConfig{@Bean@LoadBalancedpublicRestTemplategetRestTemplate(){returnnewRestTemplate();}}
6. 业务类
importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.client.RestTemplate;@RestController@Slf4jpublicclassOrderController{publicstaticfinalString URL ="http://consul-provider-payment";@AutowiredprivateRestTemplate restTemplate;@GetMapping("consumer/payment/consul")publicStringpaymentInfo(){String result = restTemplate.getForObject(URL +"/payment/consul",String.class);return result;}}
7. 测试结果
8. 包结构图示
1.5、三个注册中心的异同点
组件名语言CAP服务健康检查对外暴露接口SpringCloud 集成EurekaJavaAP可配支持HTTP已集成ConsulGoCP支持HTTP/DNS已集成ZookeeperJavaCP支持客户端已集成
1.6、CAP理论简述
- 最多只能同时较好的满足两个。
CAP(C:Consistency(强一致性),A:Availability(可用性),P:Partition tolerance(分区容错))
理论的核心是:一个分布式系统不可能同时很好的满足一致性、可用性、分区容错性这三个需求。CAP
理论关注粒度是数据,而不是整体系统设计的策略
- CA:单点集群,满足一致性、可用性的系统,通常在可扩展性上不太强大。
- CP:满足一致性、分区容错性的系统,通常性能不是特别高。
- AP:满足可用性、分区容错性的系统,通常可能对一致性要求低一些。
1. AP架构(Eureka)
- 当网络分区出现后,为了保证可用性,系统
B
可以返回旧值,保证系统的可用性。 - 结论:违背了一些一致性的要求,只满足可用性和分区容错性,即
AP
。
2. CP架构
- 当网络分区出现后,为了保证一致性,就必须拒绝请求,否则无法保证一致性。
- 结论:违背了可用性
A
的要求,只满足一致性和分区容错,即CP
。
版权归原作者 崇尚学技术的科班人 所有, 如有侵权,请联系我们删除。