溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Nacos框架服務注冊如何實現

發(fā)布時間:2022-08-01 14:26:47 來源:億速云 閱讀:127 作者:iii 欄目:開發(fā)技術

本篇內容介紹了“Nacos框架服務注冊如何實現”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

rpc遠程調用

可能存在的問題

  • 超時的問題。

  • 安全的問題。

  • 服務與服務之間URL地址管理。

在我們的微服務架構通訊,服務之間依賴關系非常大,如果通過傳統的方式管理我們服務的 url 地址的情況下,-一旦地址發(fā)生變化的情況下,還需要人工修改rpc遠程調用地址。

微服務服務治理

在RPC遠程調用過程中,服務與服務之間依賴關系非常大,服務Url地址管理非常復雜,所以這時候需要對我們服務的url實現治理,通過服務治理可以實現服務注冊與發(fā)現、負載均衡、容錯等。

分布式注冊中心

在 rpc 遠程調用中,地址中域名和端口號/調用的方法名稱,如果基于數據庫實現服務 url 治理:

缺點:維護成本高、沒有完全絕對實現動態(tài)智能。

每次調用該服務如果地址直接寫死的話,一旦接口發(fā)生變化的情況下,這時候需要重新發(fā)布版本才可以該接口調用地址,所以需要一個注冊中心統一管理我們的服務注冊與發(fā)現。

注冊中心概念: 我們的服務注冊到我們注冊中心,key為服務名稱、value為該服務調用地址,該類型為集合類型。Eureka、consul、zookeeper、nacos等。

注冊中心原理:

Nacos框架服務注冊如何實現

服務注冊:生產者項目啟動的時候,會將當前服務自己的信息地址注冊到注冊中心。

服務發(fā)現: 消費者從我們的注冊中心上獲取生產者調用的地址(集合),在使用負載均衡的策略獲取集群中某個地址實現本地rpc遠程調用。

rpc 服務注冊調用實現原理:

1、生產者啟動的時候key= 服務的名稱value ip 和端口號注冊到我們的微服務注冊中心上。

2、注冊存放服務地址列表類型:key唯一,列表是list集合。

3、我們的消費者從我們注冊中心.上根據服務名稱查詢服務地址列表(集合)。

4、消費者獲取到集群列表之后,采用負載均衡器選擇一個地址實現rpc遠程調用。

Nacos

介紹

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頁面看到注冊的服務信息。

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è)相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI