Consul简介
- 是什么
- Consul是一套开源的分布式服务发现和配置管理系统, 由Go语言开发.
- 提供了微服务系统中的服务治理, 配置中心, 控制总线等功能. 这些功能中的每个都可以根据需要单独使用, 也可以一起使用以构建全方位的服务网格, 总之Consul提供了一种完整的服务网格解决方案.
- Consul中文文档: https://www.springcloud.cc/spring-cloud-consul.html
- 能干什么
- 服务发现 -> 提供HTTP和DNS两种发现方式
- 健康检测 -> 支持多种协议 HTTP, TCP, Docker, Shell脚本定制化
- KV存储 -> Key, Value的存储方式
- 多数据中心 -> Consul支持多数据中心
- 天生自带可视化Web界面.
- 安装与运行
- 下载完解压后只有一个consul.exe文件, 在cmd下查看版本: consul --version
- 在cmd下启动: consul agent -dev
- 通过一下地址访问Consul的首页: http://localhost:8500
服务提供者注册进Consul
- 新建Module支付服务cloud-providerconsul-payment8006
- pom中增加如下依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency>
- yml
#consul服务端口号 server: port: 8006 spring: application: name: consul-provider-payment cloud: consul: #consul注册中心 host: localhost port: 8500 discovery: service-name: ${spring.application.name} #hostname: 127.0.0.1
- 主启动类
@EnableDiscoveryClient @SpringBootApplication public class PaymentMain8006 { public static void main(String[] args) { SpringApplication.run(PaymentMain8006.class, args); } }
- 业务类Controller
@RestController @Slf4j public class PaymentController { @Value("${server.port}") private String serverPort; @GetMapping("/payment/consul") public String paymentConsul() { return "SpringCloud with consul: " + serverPort + " " + UUID.randomUUID().toString(); } }
- 测试
- http://localhost:8006/payment/consul
服务消费者注册进Consul
- 新建Module消费服务cloud-consumerconsul-order80
- pom
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <dependency> <groupId>springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>${project.version}</version> </dependency> <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> <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: consul-consumer-order cloud: consul: #consul注册中心 host: localhost port: 8500 discovery: service-name: ${spring.application.name} #hostname: 127.0.0.1
- 主启动类
@SpringBootApplication @EnableDiscoveryClient public class OrderConsulMain80 { public static void main(String[] args) { SpringApplication.run(OrderConsulMain80.class,args); } }
- 配置Bean(RestTemplate)
@Configuration public class ApplicationContextConfig { @LoadBalanced @Bean public RestTemplate getRestTemplate() { return new RestTemplate(); } }
- controller
@RestController @Slf4j public class OrderConsulController { private static final String INVOKE_URL = "http://consul-provider-payment"; @Resource private RestTemplate restTemplate; @GetMapping("/consumer/consul") public String paymentInfo() { String url = INVOKE_URL + "/payment/consul/"; String result = restTemplate.getForObject(url, String.class); return result; } }
- 测试
- http://localhost/consumer/payment/consul
与Eureka的区别
- 异同
- CAP理论
- C: Consistency - 强一致性
- A: Availability - 可用性
- P: Partition tolerance - 分区容错
- CAP理论关注的是数据, 而不是整体系统设计的策略
- 经典的CAP
- CAP理论的核心: 一个分布式系统不可能同时很好的满足一致性, 可用性和分区容错性这三个需求.
- AP - Eureka
- 当网络分区出现后, 为了保证可用性, 系统B可以返回旧值, 保证系统的可用性. 但违背了一致性C的要求.
- CP - Consul
- 当网络分区出现后, 为了保证一致性, 就必须拒接请求, 否则无法保证一致性, 但违背了可用性A的要求.