目录
创建服务提供者模块:cloud-providerconsul-payment8006
创建服务提供者模块:cloud-consumerconsul-order80
Consul 简介
Consul 是一个服务网格解决方案,提供功能齐全的控制平面,具有服务发现、配置和分段功能。这些特性中的每一个都可以根据需要单独使用,也可以一起使用以构建完整的服务网格。concul 需要一个数据平面,并支持代理和本机集成模型。领事船与一个简单的内置代理,使一切工作的开箱即用,但也支持第三方代理集成,如特使。
Consul的主要特点是:
服务发现:Concul 的客户端可以注册一个服务,如api或mysql,其他客户端可以使用Concul来发现给定服务的提供者。使用DNS或HTTP,应用程序可以轻松找到它们所依赖的服务。
运行状况检查:Concul 客户端可以提供任意数量的运行状况检查,与给定服务(“Web服务器是否返回200 OK”)或本地节点(“内存利用率是否低于90%”相关。操作员可以使用此信息监视群集运行状况,服务发现组件也可以使用此信息将流量路由到不健康的主机。
KV存储:应用程序可以将Consor的分层键/值存储用于任何目的,包括动态配置、功能标记、协调、领导人选举等。简单的HTTP API使其易于使用。
安全服务通信:Consul 可以为服务生成和分发TLS证书,以建立相互TLS连接。意图可用于定义允许哪些服务进行通信。服务分段可以很容易地管理,目的可以实时更改,而不是使用复杂的网络拓扑和静态防火墙规则。
多数据中心:Consul 支持多个现成的数据中心。这意味着concul 的用户不必担心构建额外的抽象层来扩展到多个区域。
Concul 的设计宗旨是对DevOps社区和应用程序开发人员都友好,这使它非常适合现代、弹性的基础设施。
Consul 下载地址:Downloads | Consul by HashiCorp
使用教程:Spring Cloud Consul 中文文档 参考手册 中文版
安装运行:Install Consul | Consul - HashiCorp Learn,下载完成后只有一个consul.exe文件.
使用开发者模式启动, consul.exe 文件目录下进入 cmd,输入consul agent -dev 进入开发者模式。
创建服务提供者模块:cloud-providerconsul-payment8006
1、POM依赖
<dependencies>
<dependency>
<groupId>com.yixuan.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</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.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</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>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2、YML 依赖
server:
port: 8006
spring:
application:
# 微服务名称
name: cloud-provider-payment
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
3、主启动类 com.atyixuan.springcloud.PaymentMain8006
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain8006 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8006.class, args);
}
}
4、业务类 com.atyixuan.springcloud.controller.PaymentController
@RestController
public class PaymentController {
@Value("S{server.port}")
private String serverPort;
@GetMapping(value = "/payment/consul")
public String paymentConsul(){
return "spring cloud with consul: " + serverPort+"\t" + UUID.randomUUID().toString();
}
}
5、验证测试:http://localhost:8006/payment/consul
创建服务提供者模块:cloud-consumerconsul-order80
1、POM 依赖
<dependencies>
<!--引入自己定义的 api 通用包,可以使用 Payment 支付 entity-->
<dependency>
<groupId>com.yixuan.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</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>
2、YML 配置文件
server:
port: 80
spring:
application:
name: cloud-consumer-order
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
3、主启动类 com.atyixuan.springcloud.controller.OrderConsulController
@Slf4j
@RestController
public class OrderConsulController {
public static final String INVOKE_URL = "http://cloud-provider-payment";
@Resource
private RestTemplate restTemplate;
@GetMapping(value = "/consumer/payment/consul")
public String paymentConsul(){
return restTemplate.getForObject(INVOKE_URL+"/payment/consul", String.class);
}
}
4、配置 Bean com.atyixuan.springcloud.config.ApplicationContextConfig
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
5、Controller 类 com.atyixuan.springcloud.controller.OrderConsulController
@Slf4j
@RestController
public class OrderConsulController {
public static final String INVOKE_URL = "http://consul-provider-payment";
@Resource
private RestTemplate restTemplate;
@GetMapping(value = "/consumer/payment/consul")
public String paymentConsul(){
return restTemplate.getForObject(INVOKE_URL+"/payment/consul", String.class);
}
}
项目结构
测试:先启动 cloud-providerconsul-payment8006,再启动 cloud-consumerconsul-order80
浏览器输入:http://localhost/consumer/payment/consul
浏览器输入:http://localhost:8500
三个注册中心异同点
CAP:C:Consistency(强一致性)、A:Availability(可用性)、P:Partition tolerance(分区容错)
CAP理论关注粒度是数据,而不是整体系统设计的策略
经典 CAP 图
AP(Eureka)
AP架构:当网络分区出现后,为了保证可用性,系统B可以返回旧值,保证系统的的可用性。
结论:违背了一致性 C 的要求,只满足可用性和分区容错性,即 AP
CP(Zookeeper/Consul)
CP 架构:当网络分区出现后,为了保证一致性,就必须拒绝请求,否则无法保证一致性
结论:违背了可用性A的要求,只满足一致性好分区容错性,即CP