您好,登錄后才能下訂單哦!
本篇內容介紹了“Nacos框架服務注冊如何實現”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
可能存在的問題
超時的問題。
安全的問題。
服務與服務之間URL地址管理。
在我們的微服務架構通訊,服務之間依賴關系非常大,如果通過傳統的方式管理我們服務的 url 地址的情況下,-一旦地址發(fā)生變化的情況下,還需要人工修改rpc遠程調用地址。
在RPC遠程調用過程中,服務與服務之間依賴關系非常大,服務Url地址管理非常復雜,所以這時候需要對我們服務的url實現治理,通過服務治理可以實現服務注冊與發(fā)現、負載均衡、容錯等。
在 rpc 遠程調用中,地址中域名和端口號/調用的方法名稱,如果基于數據庫實現服務 url 治理:
缺點:維護成本高、沒有完全絕對實現動態(tài)智能。
每次調用該服務如果地址直接寫死的話,一旦接口發(fā)生變化的情況下,這時候需要重新發(fā)布版本才可以該接口調用地址,所以需要一個注冊中心統一管理我們的服務注冊與發(fā)現。
注冊中心概念: 我們的服務注冊到我們注冊中心,key為服務名稱、value為該服務調用地址,該類型為集合類型。Eureka、consul、zookeeper、nacos等。
注冊中心原理:
服務注冊:生產者項目啟動的時候,會將當前服務自己的信息地址注冊到注冊中心。
服務發(fā)現: 消費者從我們的注冊中心上獲取生產者調用的地址(集合),在使用負載均衡的策略獲取集群中某個地址實現本地rpc遠程調用。
rpc 服務注冊調用實現原理:
1、生產者啟動的時候key= 服務的名稱value ip 和端口號注冊到我們的微服務注冊中心上。
2、注冊存放服務地址列表類型:key唯一,列表是list集合。
3、我們的消費者從我們注冊中心.上根據服務名稱查詢服務地址列表(集合)。
4、消費者獲取到集群列表之后,采用負載均衡器選擇一個地址實現rpc遠程調用。
Nacos 可以實現分布式服務注冊與發(fā)現/分布式配置中心框架。
下載直接啟動就可以了,nacos 是springboot項目。默認端口號是:8848,可以修改配置文件修改端口號、數據持久化方式等等。
注意:高一點版本的nacos默認是集群啟動,如果你是學習使用單機版的,需要修改額外配置,改成單機版啟動。
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: ###服務注冊地址 server-addr: www.kaicostudy.com:8848 application: name: kaico-member server: port: 8081
Java代碼,項目為springboot項目,menber服務
@RestController public class MenberService { @Value("${server.port}") private String serverPort; /** * 會員服務提供的接口 * * @param userId * @return */ @RequestMapping("/getUser") public String getUser(Integer userId) { return "kaico學習nacos:" + serverPort; } }
啟動項目之后,可以在nacos頁面看到注冊的服務信息。
使用discoveryClient 從nacos上獲取接口地址
order服務代碼,后面用作restTemplate 實現遠程接口調用。
@RestController public class OrderService { @Autowired private DiscoveryClient discoveryClient; /** * 訂單調用會員服務 * * @return */ @GetMapping("/orderToMember") public String orderToMember() { // 從注冊中心上獲取該注冊服務列表 List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("kaico-member"); ServiceInstance serviceInstance = serviceInstanceList.get(0); URI rpcMemberUrl = serviceInstance.getUri(); return "訂單調用會員獲取結果:" + rpcMemberUrl; } }
使用restTemplate實現rpc遠程調用
注意spring沒有將 restTemplate 注入到IOC容器中,需要自己手動注入。在啟動類中添加下面注入bean的方法。
@Bean("restTemplate") public RestTemplate restTemplate(){ return new RestTemplate(); }
調用方法
@GetMapping("/orderToMember") public String orderToMember() { // 從注冊中心上獲取該注冊服務列表 List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("kaico-member"); ServiceInstance serviceInstance = serviceInstanceList.get(0); URI rpcMemberUrl = serviceInstance.getUri(); // 使用本地rest形式實現rpc調用 String result = restTemplate.getForObject(rpcMemberUrl + "/getUser", String.class); return "訂單調用會員獲取結果:" + result; }
本地負載均衡算法
1、從注冊中心獲取服務集群的列表
2、從列表中選擇一個(根據負載均衡算法來獲?。?/p>
1. 隨機獲取
2. 輪訓、權重
3. 一致性 hash 計算
實現輪訓代碼案例:
@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() { // 從注冊中心上獲取該注冊服務列表 List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("kaico-member"); ServiceInstance serviceInstance = loadBalancer.getSingleAddres(serviceInstanceList); URI rpcMemberUrl = serviceInstance.getUri(); // 使用本地rest形式實現rpc調用 String result = restTemplate.getForObject(rpcMemberUrl + "/getUser", String.class); return "訂單調用會員獲取結果:" + result; }
“Nacos框架服務注冊如何實現”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。