Nacos框架服務(wù)注冊實(shí)現(xiàn)流程
rpc遠(yuǎn)程調(diào)用
可能存在的問題
- 超時的問題。
- 安全的問題。
- 服務(wù)與服務(wù)之間URL地址管理。
在我們的微服務(wù)架構(gòu)通訊,服務(wù)之間依賴關(guān)系非常大,如果通過傳統(tǒng)的方式管理我們服務(wù)的 url 地址的情況下,-一旦地址發(fā)生變化的情況下,還需要人工修改rpc遠(yuǎn)程調(diào)用地址。
微服務(wù)服務(wù)治理
在RPC遠(yuǎn)程調(diào)用過程中,服務(wù)與服務(wù)之間依賴關(guān)系非常大,服務(wù)Url地址管理非常復(fù)雜,所以這時候需要對我們服務(wù)的url實(shí)現(xiàn)治理,通過服務(wù)治理可以實(shí)現(xiàn)服務(wù)注冊與發(fā)現(xiàn)、負(fù)載均衡、容錯等。
分布式注冊中心
在 rpc 遠(yuǎn)程調(diào)用中,地址中域名和端口號/調(diào)用的方法名稱,如果基于數(shù)據(jù)庫實(shí)現(xiàn)服務(wù) url 治理:
缺點(diǎn):維護(hù)成本高、沒有完全絕對實(shí)現(xiàn)動態(tài)智能。
每次調(diào)用該服務(wù)如果地址直接寫死的話,一旦接口發(fā)生變化的情況下,這時候需要重新發(fā)布版本才可以該接口調(diào)用地址,所以需要一個注冊中心統(tǒng)一管理我們的服務(wù)注冊與發(fā)現(xiàn)。
注冊中心概念: 我們的服務(wù)注冊到我們注冊中心,key為服務(wù)名稱、value為該服務(wù)調(diào)用地址,該類型為集合類型。Eureka、consul、zookeeper、nacos等。
注冊中心原理:
服務(wù)注冊:生產(chǎn)者項(xiàng)目啟動的時候,會將當(dāng)前服務(wù)自己的信息地址注冊到注冊中心。
服務(wù)發(fā)現(xiàn): 消費(fèi)者從我們的注冊中心上獲取生產(chǎn)者調(diào)用的地址(集合),在使用負(fù)載均衡的策略獲取集群中某個地址實(shí)現(xiàn)本地rpc遠(yuǎn)程調(diào)用。
rpc 服務(wù)注冊調(diào)用實(shí)現(xiàn)原理:
1、生產(chǎn)者啟動的時候key= 服務(wù)的名稱value ip 和端口號注冊到我們的微服務(wù)注冊中心上。
2、注冊存放服務(wù)地址列表類型:key唯一,列表是list集合。
3、我們的消費(fèi)者從我們注冊中心.上根據(jù)服務(wù)名稱查詢服務(wù)地址列表(集合)。
4、消費(fèi)者獲取到集群列表之后,采用負(fù)載均衡器選擇一個地址實(shí)現(xiàn)rpc遠(yuǎn)程調(diào)用。
Nacos
介紹
Nacos 可以實(shí)現(xiàn)分布式服務(wù)注冊與發(fā)現(xiàn)/分布式配置中心框架。
官網(wǎng)的介紹: https://nacos.io/zh-cn/docs/what-is-nacos.html
安裝
下載直接啟動就可以了,nacos 是springboot項(xiàng)目。默認(rèn)端口號是:8848,可以修改配置文件修改端口號、數(shù)據(jù)持久化方式等等。
注意:高一點(diǎn)版本的nacos默認(rèn)是集群啟動,如果你是學(xué)習(xí)使用單機(jī)版的,需要修改額外配置,改成單機(jī)版啟動。
windows版本修改方式:以notepad++方式打開 startup.cmd
然后修改大概在26行的set MODE="cluster"為set MODE=“standalone”
基本使用
maven依賴
<dependencies> <!-- springboot 整合web組件--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>0.2.2.RELEASE</version> </dependency> </dependencies>
application.yml
spring: cloud: nacos: discovery: ###服務(wù)注冊地址 server-addr: www.kaicostudy.com:8848 application: name: kaico-member server: port: 8081
Java代碼,項(xiàng)目為springboot項(xiàng)目,menber服務(wù)
@RestController public class MenberService { @Value("${server.port}") private String serverPort; /** * 會員服務(wù)提供的接口 * * @param userId * @return */ @RequestMapping("/getUser") public String getUser(Integer userId) { return "kaico學(xué)習(xí)nacos:" + serverPort; } }
啟動項(xiàng)目之后,可以在nacos頁面看到注冊的服務(wù)信息。
使用discoveryClient 從nacos上獲取接口地址
order服務(wù)代碼,后面用作restTemplate 實(shí)現(xiàn)遠(yuǎn)程接口調(diào)用。
@RestController public class OrderService { @Autowired private DiscoveryClient discoveryClient; /** * 訂單調(diào)用會員服務(wù) * * @return */ @GetMapping("/orderToMember") public String orderToMember() { // 從注冊中心上獲取該注冊服務(wù)列表 List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("kaico-member"); ServiceInstance serviceInstance = serviceInstanceList.get(0); URI rpcMemberUrl = serviceInstance.getUri(); return "訂單調(diào)用會員獲取結(jié)果:" + rpcMemberUrl; } }
使用restTemplate實(shí)現(xiàn)rpc遠(yuǎn)程調(diào)用
注意spring沒有將 restTemplate 注入到IOC容器中,需要自己手動注入。在啟動類中添加下面注入bean的方法。
@Bean("restTemplate") public RestTemplate restTemplate(){ return new RestTemplate(); }
調(diào)用方法
@GetMapping("/orderToMember") public String orderToMember() { // 從注冊中心上獲取該注冊服務(wù)列表 List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("kaico-member"); ServiceInstance serviceInstance = serviceInstanceList.get(0); URI rpcMemberUrl = serviceInstance.getUri(); // 使用本地rest形式實(shí)現(xiàn)rpc調(diào)用 String result = restTemplate.getForObject(rpcMemberUrl + "/getUser", String.class); return "訂單調(diào)用會員獲取結(jié)果:" + result; }
本地負(fù)載均衡算法
1、從注冊中心獲取服務(wù)集群的列表
2、從列表中選擇一個(根據(jù)負(fù)載均衡算法來獲取)
1. 隨機(jī)獲取
2. 輪訓(xùn)、權(quán)重
3. 一致性 hash 計(jì)算
實(shí)現(xiàn)輪訓(xùn)代碼案例:
@Component public class RotationLoadBalancer implements LoadBalancer { private AtomicInteger atomicInteger = new AtomicInteger(0); @Override public ServiceInstance getSingleAddres(List<ServiceInstance> serviceInstances) { int index = atomicInteger.incrementAndGet() % serviceInstances.size(); ServiceInstance serviceInstance = serviceInstances.get(index); return serviceInstance; } }
@RequestMapping("/orderToMember") public String orderToMember() { // 從注冊中心上獲取該注冊服務(wù)列表 List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("kaico-member"); ServiceInstance serviceInstance = loadBalancer.getSingleAddres(serviceInstanceList); URI rpcMemberUrl = serviceInstance.getUri(); // 使用本地rest形式實(shí)現(xiàn)rpc調(diào)用 String result = restTemplate.getForObject(rpcMemberUrl + "/getUser", String.class); return "訂單調(diào)用會員獲取結(jié)果:" + result; }
到此這篇關(guān)于Nacos框架服務(wù)注冊實(shí)現(xiàn)流程的文章就介紹到這了,更多相關(guān)Nacos服務(wù)注冊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java數(shù)組轉(zhuǎn)換為集合的相關(guān)方法
在Java中我們經(jīng)常需要將數(shù)組從一種類型轉(zhuǎn)換為另一種類型,下面這篇文章主要給大家介紹了關(guān)于Java數(shù)組轉(zhuǎn)換為集合的相關(guān)方法,文中通過圖文及代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01Java中Set&List的迭代器實(shí)現(xiàn)步驟解析
這篇文章主要介紹了Java中Set&List的迭代器實(shí)現(xiàn)步驟解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10Java基礎(chǔ)學(xué)習(xí)之方法的重載知識總結(jié)
今天帶大家來回顧Java基礎(chǔ)知識,文中對Java方法的重載相關(guān)知識作了非常詳細(xì)的介紹,對正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05解決RedisTemplate調(diào)用increment報(bào)錯問題
這篇文章主要介紹了解決RedisTemplate調(diào)用increment報(bào)錯問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11springboot集成shiro遭遇自定義filter異常的解決
這篇文章主要介紹了springboot集成shiro遭遇自定義filter異常的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11淺談JAVA字符串匹配算法indexOf函數(shù)的實(shí)現(xiàn)方法
這篇文章主要介紹了淺談字符串匹配算法indexOf函數(shù)的實(shí)現(xiàn)方法,indexOf函數(shù)我們可以查找一個字符串(模式串)是否在另一個字符串(主串)出現(xiàn)過。對此感興趣的可以來了解一下2020-07-07聊聊maven的pom.xml中的exclusions標(biāo)簽的作用
這篇文章主要介紹了maven的pom.xml中的exclusions標(biāo)簽的作用,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12