目錄
1. Nacos 的底層實現(xiàn)原理
1.1 配置中心自動刷新實現(xiàn)原理
1.2? 注冊中心底層實現(xiàn)原理
2. Nacos 注冊中心的兩種調(diào)用方式
?2.1 RestTemplate?+ Spring Cloud LoadBalancer 的調(diào)用方式
2.2 使用 OpenFeign + Spring Cloud LoadBalancer?
1. Nacos 的底層實現(xiàn)原理
1.1 配置中心自動刷新實現(xiàn)原理
Nacos 配置中心的自動刷新,其底層是基于長輪詢+事件驅(qū)動的方式來實現(xiàn)的。
長輪詢:客戶端通過發(fā)送HTTP長輪詢請求到Nacos服務(wù)器來實現(xiàn)配置更新的監(jiān)聽機(jī)制。這樣做的目的是減少頻繁的請求,同時能夠保證配置更新時能快速通知到客戶端。
事件驅(qū)動:當(dāng)注冊中心發(fā)生改變了,發(fā)生事件了,就會把這個事件推送給訂閱者。
對比長連接來理解長輪詢 >>
長連接(Persistent Connection):
- 長連接是指在一次連接建立之后,客戶端和服務(wù)器之間的連接會保持活躍,直到其中一方顯式地關(guān)閉連接。
- 長連接中,TCP連接默認(rèn)不會在傳輸了HTTP響應(yīng)后立即關(guān)閉,而是可以用來傳輸多個請求和響應(yīng)。
- 長連接減少了頻繁建立和關(guān)閉連接的開銷,但如果連接數(shù)多了,服務(wù)器端的資源壓力會比較大。
長輪詢(Long Polling):
- 長輪詢是,客戶端發(fā)起請求到服務(wù)器,如果服務(wù)器端沒有數(shù)據(jù)更新,它不會立即響應(yīng),而是保持這個請求開放(保持一段時間的連接),直到有數(shù)據(jù)更新或者超時。
- 當(dāng)有數(shù)據(jù)更新時,服務(wù)器響應(yīng)請求,發(fā)送更新給客戶端??蛻舳颂幚硗觏憫?yīng)后,會再次發(fā)起新的請求,重新開始長輪詢。
- 長輪詢不是持續(xù)的網(wǎng)絡(luò)連接,每次輪詢完成后連接都會關(guān)閉,然后客戶端再發(fā)起新的請求。這導(dǎo)致在每個輪詢周期之間會有短暫的延遲。
基于以上對比,還可以看出長輪詢是有助于 Nacos 進(jìn)行健康檢測的,因為健康檢測就是隔一段時間發(fā)送心跳包。
??配置中心具體執(zhí)行流程如下:
1. 客戶端向 Nacos 服務(wù)器發(fā)送一個帶有監(jiān)聽器的長輪詢請求,以獲取某個特定配置的值。
2. Nacos 服務(wù)器收到這個長輪詢請求后,會檢查該配置是否發(fā)生了變化。如果沒有變化,則該請求將被阻塞,直到超時或者配置發(fā)生變化。(通常設(shè)置一個較長的超時時間,比如30秒)
3. 當(dāng)配置發(fā)生變化時,Nacos 服務(wù)器會立即響應(yīng),并將新的配置響應(yīng)給客戶端。
4. 客戶端接收到新的配置值之后,可以根據(jù)需要跟新自身的配置。
1.2? 注冊中心底層實現(xiàn)原理
Nacos 注冊中心的底層實現(xiàn)主要依賴于兩個關(guān)鍵的組件:服務(wù)注冊 + 服務(wù)發(fā)現(xiàn)。
對于服務(wù)注冊和服務(wù)發(fā)現(xiàn)的不是很理解的可以先去看看我的這篇文章:https://blog.csdn.net/xaiobit_hl/article/details/134142521
??Nacos 注冊中心的執(zhí)行流程如下
1. 服務(wù)注冊:
- 當(dāng)服務(wù)啟動的時候,它會向Nacos服務(wù)器發(fā)送一個注冊請求,包含自己的元數(shù)據(jù)據(jù)信息
- Nacos服務(wù)器接受到注冊請求后,會在內(nèi)存中維護(hù)一個注冊表,然后將服務(wù)提供者的信息(如服務(wù)名、IP、端口、健康狀態(tài)等)存儲到服務(wù)注冊表中,用于后續(xù)的服務(wù)發(fā)現(xiàn)。
2. 服務(wù)同步 (如果部署了多個Nacos實例):
- Nacos集群中的服務(wù)同步機(jī)制確保所有的Nacos實例包含所有服務(wù)的最新信息。
- 同步過程通常由Nacos集群內(nèi)部協(xié)調(diào)完成,確保每個實例的數(shù)據(jù)一致性
3. 心跳機(jī)制:
- 服務(wù)實例會定期向Nacos服務(wù)器發(fā)送心跳來保持其注冊信息的活躍狀態(tài),表明自己的健康狀態(tài)和可用性。
- 如果Nacos在配置的心跳時間內(nèi)沒有收到某服務(wù)實例的心跳,它將認(rèn)為該實例不可用,并可能將其從服務(wù)列表中剔除。
4.. 服務(wù)發(fā)現(xiàn):
- 服務(wù)消費者在調(diào)用服務(wù)時,會向Nacos發(fā)送一個服務(wù)發(fā)現(xiàn)請求。
- Nacos會返回一份可用服務(wù)實例的列表,客戶端基于這份列表通過負(fù)載均衡策略選擇一個實例進(jìn)行調(diào)用。
5. 負(fù)載均衡:
- 在服務(wù)發(fā)現(xiàn)的過程中,Nacos還提供了負(fù)載均衡的支持,消費者可以選擇合適的負(fù)載均衡策略來選擇其中一個或多個實例進(jìn)行調(diào)用。
- Nacos 里的負(fù)載均衡策略有兩種:權(quán)重 + CMDB。
2. Nacos 注冊中心的兩種調(diào)用方式
當(dāng) Nacos 注冊了 Restful 接口時,它 的調(diào)用方式主要有兩種:
- 使用 RestTemplate + Spring Cloud LoadBalancer
- 使用 OpenFeign + Spring Cloud LoadBalancer?
?2.1 RestTemplate?+ Spring Cloud LoadBalancer 的調(diào)用方式
實現(xiàn)步驟:
- 添加依賴:nacos + loadbalancer
- 設(shè)置配置信息
- 編寫調(diào)用代碼
①?添加依賴:nacos + loadbalancer
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
② 設(shè)置配置信息
spring:
application:
name: nacos-discovery-business
cloud:
nacos:
discovery:
server-addr: localhost:8848
username: nacos
password: nacos
register-enabled: false # 設(shè)置消費者不要注冊到 Nacos
③?編寫調(diào)用代碼
此處又分為兩步實現(xiàn):
- 增加 RestTemplate 的 LoadBalanced 支持
- 使用 RestTemplate 調(diào)用接口
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 調(diào)用接口
@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);
}
}
2.2 使用 OpenFeign + Spring Cloud LoadBalancer?
使用這種方式調(diào)用注冊中心,實現(xiàn)步驟分為以下 5 步:文章來源:http://www.zghlxwxcb.cn/news/detail-742934.html
- 添加框架支持 【nacos discovery、spring cloud LoadBalancer、spring cloud OpenFeign】
- 配置 Nacos 連接信息
- 開啟 OpenFeign 功能
- 聲明 OpenFeign 式的 Service 【生產(chǎn)者的的服務(wù)】
- 調(diào)用服務(wù)【調(diào)用生產(chǎn)者的服務(wù)】
具體的實現(xiàn)代碼可以參考我的上一篇博客:https://blog.csdn.net/xaiobit_hl/article/details/134142521?文章來源地址http://www.zghlxwxcb.cn/news/detail-742934.html
到了這里,關(guān)于Nacos 的底層實現(xiàn)原理 & 注冊中心的兩種調(diào)用方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!