目录
1. Nacos 的底层实现原理
1.1 配置中心自动刷新实现原理
1.2 注册中心底层实现原理
2. Nacos 注册中心的两种调用方式
2.1 RestTemplate + Spring Cloud LoadBalancer 的调用方式
2.2 使用 OpenFeign + Spring Cloud LoadBalancer
Nacos 配置中心的自动刷新,其底层是基于长轮询+事件驱动的方式来实现的。
长轮询:客户端通过发送HTTP长轮询请求到Nacos服务器来实现配置更新的监听机制。这样做的目的是减少频繁的请求,同时能够保证配置更新时能快速通知到客户端。
事件驱动:当注册中心发生改变了,发生事件了,就会把这个事件推送给订阅者。
对比长连接来理解长轮询 >>
长连接(Persistent Connection):
- 长连接是指在一次连接建立之后,客户端和服务器之间的连接会保持活跃,直到其中一方显式地关闭连接。
- 长连接中,TCP连接默认不会在传输了HTTP响应后立即关闭,而是可以用来传输多个请求和响应。
- 长连接减少了频繁建立和关闭连接的开销,但如果连接数多了,服务器端的资源压力会比较大。
长轮询(Long Polling):
- 长轮询是,客户端发起请求到服务器,如果服务器端没有数据更新,它不会立即响应,而是保持这个请求开放(保持一段时间的连接),直到有数据更新或者超时。
- 当有数据更新时,服务器响应请求,发送更新给客户端。客户端处理完响应后,会再次发起新的请求,重新开始长轮询。
- 长轮询不是持续的网络连接,每次轮询完成后连接都会关闭,然后客户端再发起新的请求。这导致在每个轮询周期之间会有短暂的延迟。
基于以上对比,还可以看出长轮询是有助于 Nacos 进行健康检测的,因为健康检测就是隔一段时间发送心跳包。
配置中心具体执行流程如下:
1. 客户端向 Nacos 服务器发送一个带有监听器的长轮询请求,以获取某个特定配置的值。
2. Nacos 服务器收到这个长轮询请求后,会检查该配置是否发生了变化。如果没有变化,则该请求将被阻塞,直到超时或者配置发生变化。(通常设置一个较长的超时时间,比如30秒)
3. 当配置发生变化时,Nacos 服务器会立即响应,并将新的配置响应给客户端。
4. 客户端接收到新的配置值之后,可以根据需要跟新自身的配置。
Nacos 注册中心的底层实现主要依赖于两个关键的组件:服务注册 + 服务发现。
对于服务注册和服务发现的不是很理解的可以先去看看我的这篇文章:https://blog.csdn.net/xaiobit_hl/article/details/134142521
Nacos 注册中心的执行流程如下
1. 服务注册:
- 当服务启动的时候,它会向Nacos服务器发送一个注册请求,包含自己的元数据据信息
- Nacos服务器接受到注册请求后,会在内存中维护一个注册表,然后将服务提供者的信息(如服务名、IP、端口、健康状态等)存储到服务注册表中,用于后续的服务发现。
2. 服务同步 (如果部署了多个Nacos实例):
- Nacos集群中的服务同步机制确保所有的Nacos实例包含所有服务的最新信息。
- 同步过程通常由Nacos集群内部协调完成,确保每个实例的数据一致性
3. 心跳机制:
- 服务实例会定期向Nacos服务器发送心跳来保持其注册信息的活跃状态,表明自己的健康状态和可用性。
- 如果Nacos在配置的心跳时间内没有收到某服务实例的心跳,它将认为该实例不可用,并可能将其从服务列表中剔除。
4.. 服务发现:
- 服务消费者在调用服务时,会向Nacos发送一个服务发现请求。
- Nacos会返回一份可用服务实例的列表,客户端基于这份列表通过负载均衡策略选择一个实例进行调用。
5. 负载均衡:
- 在服务发现的过程中,Nacos还提供了负载均衡的支持,消费者可以选择合适的负载均衡策略来选择其中一个或多个实例进行调用。
- Nacos 里的负载均衡策略有两种:权重 + CMDB。
当 Nacos 注册了 Restful 接口时,它 的调用方式主要有两种:
实现步骤:
① 添加依赖:nacos + loadbalancer
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
org.springframework.cloud
spring-cloud-starter-loadbalancer
② 设置配置信息
spring:
application:
name: nacos-discovery-business
cloud:
nacos:
discovery:
server-addr: localhost:8848
username: nacos
password: nacos
register-enabled: false # 设置消费者不要注册到 Nacos
③ 编写调用代码
此处又分为两步实现:
1. 增加 RestTemplate 的 LoadBalanced 支持
在Spring Boot启动类上添加 @EnableDiscoveryClient 注解,然后使用 @LoadBalanced 注解替换 Ioc 容器中的 RestTemplate。
@SpringBootApplication
@EnableDiscoveryClient // 增加 RestTemplate 的 LoadBalanced 支持
public class ConsumerApplication {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
2. 使用 RestTemplate 调用接口
@RestController // 消费者
public class BusinessController2 {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/getnamebyid")
public String getNameById(Integer id) {
return restTemplate.getForObject("http://nacos-discovery-demo/
user/getnamebyid?id="+id,String.class);
}
}
使用这种方式调用注册中心,实现步骤分为以下 5 步:
具体的实现代码可以参考我的上一篇博客:https://blog.csdn.net/xaiobit_hl/article/details/134142521