Consul 是一套开源的分布式发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发
提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以更具需要单独使用, 也可以一起使用构建全方位的服务网格总之 Consul 提供了一宗完整的服务网格解决方案。
它具有很多优点, 包括: 基于 raft 协议,比较简洁; 支持健康检查,同时支持 HTTP 和DNS 协议支持跨数据中心的WAN 集群 提供图形化界面,跨平台,支持 Linux 、Max 、Windows
consul --version #查看consule版本
consul agent -dev #开启consul服务
cloud-providerconsul-payment8006
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-consul-discoveryartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<scope>runtimescope>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
application.yml
server:
port: 8006
spring:
application:
name: consul-provider-payment
###consul注册中心地址
cloud:
consul:
host: localhost
port: 8500
discovery:
#hostname: 127.0.0.1
service-name: ${spring.application.name}
PaymentMain8006.java
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain8006 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8006.class, args);
}
}
controller.PaymentController.java
@RestController
@Slf4j
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/payment/consul")
public String paymentConsul(){
return "SpringCloud with consul: "+ serverPort + "\t"+ UUID.randomUUID().toString();
}
}
cloud-consumerconsul-order80
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-consul-discoveryartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<scope>runtimescope>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
dependency>
dependencies>
### consul服务端口号
server:
port: 801
spring:
application:
name: cloud-consumer-order
###consul服务注册中心
cloud:
consul:
host: localhost
port: 8500
discovery:
#hostname: 127.0.0.1
service-name: ${spring.application.name}
OrderConsulMain80.java
@SpringBootApplication
@EnableDiscoveryClient
public class OrderConsulMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderConsulMain80.class, args);
}
}
con.ApplicationContextConfig.java
用来注入RestTemplate的bean
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
controller.OrderConsulController
@RestController
@Slf4j
public class OrderConsulController {
public static final String INVOKE_URL ="http://consul-provider-payment";
@Resource
private RestTemplate restTemplate;
@GetMapping(value = "/consumer/payment/consul")
public String getPaymentInfo(){
return restTemplate.getForObject(INVOKE_URL+"/payment/consul",String.class);
}
}
测试
前提是consul服务器开启。现在启动PaymentMain8006和OrderConsulMain80,
上图可以看出已经两个微服务已经被注册进Consul中了。
下图测试PaymentMain8006
下图测试OrderConsul80
CAP
最多只能同时较好的满足两个。
CAP的核心理论是:一个分布式系统不可能同时很好的满足一致性,可用和分区容错性三个需求。因此,根据CAP原理将NoSQL 数据分成了满足 CA 原则、满足CP原则和满足AP原则三大类。
CA - 单点集群,满足一致性,可用性的系统,通常拓展性不是特别强大。
CP - 满足一致性,分区容错性的系统,通常性能不是特别高
AP - 满足可用性,分区容错性的系统,通常对一致性的要求要低一些。