1.1 简介
1.1.1 概述
服务发现是微服务架构体系中最关键的组件之一。如果尝试着用手动的方式来给每一个客户端来配置所有服务提供者的服务列表是一件非常困难的事,而且也不利于 服务的动态扩缩容。Nacos Discovery Starter 可以帮助您将服务自动注册到 Nacos 服务端并且能够动态感知和刷新某个服务实例的服务列表。除此之外,Nacos Discovery Starter 也将服务实例自身的一些元数据信息,例如 host、port,健康检查 URL,主页等注册到 Nacos 。Spring Cloud Alibaba Nacos Discovery 通过一些简单的注解,快速来注册一个服务,并使用经过双十一考验的 Nacos 组件来作为大规模分布式系统的服务注册中心。
1.1.2 相关依赖
<!-- 版本管理 -->
<properties>
<java.version>1.8</java.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
</properties>
<!-- 注册中心依赖 -->
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<!-- 如果需要使用 Spring Cloud Hoxton 版本,请在 dependencyManagement 中添加如下内容锁定版本 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<!-- Spring Cloud Alibaba 与 Spring Cloud 版本对应关系参考下表 -->
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Spring Cloud Version | Spring Cloud Alibaba Version | Spring Boot Version |
---|---|---|
Spring Cloud Hoxton.SR8 | 2.2.3.RELEASE | 2.3.2.RELEASE |
Spring Cloud Greenwich.SR6 | 2.1.3.RELEASE | 2.1.13.RELEASE |
Spring Cloud Hoxton.SR3 | 2.2.1.RELEASE | 2.2.5.RELEASE |
Spring Cloud Hoxton.RELEASE | 2.2.0.RELEASE | 2.2.X.RELEASE |
Spring Cloud Greenwich | 2.1.2.RELEASE | 2.1.X.RELEASE |
Spring Cloud Finchley | 2.0.3.RELEASE | 2.0.X.RELEASE |
Spring Cloud Edgware | 1.5.1.RELEASE(停止维护,建议升级) | 1.5.X.RELEASE |
1.2 Provider
我们这里创建两个提供者
1.2.1 配置文件
server:
port: 8081
spring:
application:
name: nacos-producer
cloud:
nacos:
discovery:
# 默认为 true,不想使用 Nacos 作为注册中心可以设为 false
enabled: true
# 服务端地址
server-addr: 127.0.0.1:8848
# 暴露监控端点
management:
endpoints:
web:
exposure:
include: "*"
1.2.2 启动类
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/11/18
* @description 提供者启动类
*/
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
1.2.3 controller
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/11/18
* @description
*/
@RestController
@RequestMapping("/provider")
public class ProviderController {
@Value("${server.port}")
private String port;
@GetMapping("/find")
public Object find() {
return "我的端口号为:" + port;
}
}
1.2.4 启动
启动之后我们可以在 Nacos 界面看到服务列表中有一个名为 nacos-producer 的集群,包含两个实例,标明我们创建的提供者已经注册到 Nacos 中。在详情中包含实例的详细信息。
1.3 Consumer
1.3.1 配置文件
server:
port: 80
spring:
application:
name: nacos-consumer
cloud:
nacos:
discovery:
# 服务端地址
server-addr: 127.0.0.1:8848
# 暴露监控端点
management:
endpoints:
web:
exposure:
include: "*"
1.3.2 启动类
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/11/18
* @description 消费者启动类
*/
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
1.3.3 controller
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/11/18
* @description
*/
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/find")
public Object find() {
return restTemplate.getForObject("http://nacos-producer/provider/find", String.class);
}
}
1.3.4 启动
启动消费者,可以看到该服务也已经注册到 Nacos 中
1.4 调用测试
多次请求消费者发现,消费者调用提供者时在进行轮询,查看依赖关系发现 Nacos 集成了 Ribbon 负载均衡。
1.5 与其他注册中心的对比
1.5.1 CAP 理论
CAP 理论是分布式架构中重要理论,一致性(Consistency):在分布式系统中的所有数据备份,在同一时刻是否同样的值,等同于所有节点访问同一份最新的数据副本;可用性(Availability):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求,保证每个请求不管成功或者失败都有响应;分隔容忍(Partition tolerance):系统中任意信息的丢失或失败不会影响系统的继续运作。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在 C 和 A 之间做出选择。
CAP 原则的精髓就是要么 AP,要么 CP,要么 AC,但是不存在 CAP。如果在某个分布式系统中数据无副本, 那么系统必然满足强一致性条件, 因为只有独一数据,不会出现数据不一致的情况,此时 C 和 P 两要素具备,但是如果系统发生了网络分区状况或者宕机,必然导致某些数据不可以访问,此时可用性条件就不能被满足,即在此情况下获得了 CP 系统,但是 CAP 不可同时满足。
1.5.2 对比关系
Nacos | Eureka | Consul | CoreDNS | Zookeeper | |
---|---|---|---|---|---|
一致性协议 | CP + AP | AP | CP | — | CP |
健康检查 | TCP/HTTP/MYSQL/Client Beat | Client Beat | TCP/HTTP/gRPC/Cmd | — | Keep Alive |
负载均衡策略 | 权重 /metadata/Selector | Ribbon | Fabio | RoundRobin | — |
雪崩保护 | 有 | 有 | 无 | 无 | 无 |
自动注销实例 | 支持 | 支持 | 支持 | 不支持 | 支持 |
访问协议 | HTTP/DNS | HTTP | HTTP/DNS | DNS | TCP |
监听支持 | 支持 | 支持 | 支持 | 不支持 | 支持 |
多数据中心 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
跨注册中心同步 | 支持 | 不支持 | 支持 | 不支持 | 不支持 |
SpringCloud 集成 | 支持 | 支持 | 支持 | 不支持 | 支持 |
Dubbo 集成 | 支持 | 不支持 | 支持 | 不支持 | 支持 |
K8S 集成 | 支持 | 不支持 | 支持 | 支持 | 不支持 |
1.5.3 Nacos 切换 CP/AP
Nacos 支持 AP 和 CP 两种模式,Nacos 集群默认支持的是 CAP 原则中的 AP 原则,但是也可通过以下命令切换为 CP 原则
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
同时微服务的 bootstrap.properties 需配置指明注册为注册为临时/永久实例。 AP 模式不支持数据一致性,所以只支持服务注册的临时实例,CP 模式支持服务注册的永久实例,满足配置文件的一致性。
spring:
cloud:
nacos:
discovery:
# false 注册为永久实例,true 注册为临时实例
ephemeral: false