Nacos註冊中心有幾種呼叫方式?

2023-10-30 12:01:46

Spring Cloud Alibaba Nacos 作為近幾年最熱門的註冊中心和設定中心,也被國內無數公司所使用,今天我們就來看下 Nacos 作為註冊中心時,呼叫它的介面有幾種方式?

1.什麼是註冊中心?

註冊中心(Registry)是一種用於服務發現和服務註冊的分散式系統元件。它是在微服務架構中起關鍵作用的一部分,用於管理和維護服務範例的資訊以及它們的狀態。

它的執行流程如下圖所示:

註冊中心充當了服務之間的中介和協調者,它的主要功能有以下這些:

  1. 服務註冊:服務提供者將自己的服務範例資訊(例如 IP 地址、埠號、服務名稱等)註冊到註冊中心。通過註冊中心,服務提供者可以將自己的存在告知其他服務。
  2. 服務發現:服務消費者通過向註冊中心查詢服務資訊,獲取可用的服務範例列表。通過註冊中心,服務消費者可以找到並連線到需要呼叫的服務。
  3. 健康檢查與負載均衡:註冊中心可以定期檢查註冊的服務範例的健康狀態,並從可用範例中進行負載均衡,確保請求可以被正確地轉發到可用的服務範例。
  4. 動態擴容與縮容:在註冊中心中註冊的服務範例資訊可以方便地進行動態的增加和減少。當有新的服務範例上線時,可以自動地將其註冊到註冊中心。當服務範例下線時,註冊中心會將其從服務列表中刪除。

使用註冊中心有以下優勢和好處:

  • 服務自動發現和負載均衡:服務消費者無需手動設定目標服務的地址,而是通過註冊中心動態獲取可用的服務範例,並通過負載均衡演演算法選擇合適的範例進行呼叫。
  • 服務彈性和可延伸性:新的服務範例可以動態註冊,並在發生故障或需要擴充套件時快速提供更多的範例,從而提供更高的服務彈性和可延伸性。
  • 中心化管理和監控:註冊中心提供了中心化的服務管理和監控功能,可以對服務範例的狀態、健康狀況和流量等進行監控和管理。
  • 降低耦合和提高靈活性:服務間的通訊不再直接依賴寫死的地址,而是通過註冊中心進行解耦,使得服務的部署和變更更加靈活和可控。

常見的註冊中心包括 ZooKeeper、Eureka、Nacos 等。這些註冊中心可以作為微服務架構中的核心元件,用於實現服務的自動發現、負載均衡和動態擴容等功能。

2.方法概述

當 Nacos 中註冊了 Restful 介面時(一種軟體架構風格,它是基於標準的 HTTP 協定和 URI 的一組約束和原則),其呼叫方式主要有以下兩種:

  1. 使用 RestTemplate + Spring Cloud LoadBalancer
  2. 使用 OpenFeign + Spring Cloud LoadBalancer

3.RestTemplate+LoadBalancer呼叫

此方案的實現有以下 3 個關鍵步驟:

  1. 新增依賴:nacos + loadbalancer
  2. 設定組態檔
  3. 編寫呼叫程式碼

具體實現如下。

3.1 新增依賴

<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>

3.2 設定組態檔

spring:
  application:
    name: nacos-discovery-business
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        username: nacos
        password: nacos
        register-enabled: false

3.3 編寫呼叫程式碼

此步驟又分為以下兩步:

  1. 給 RestTemplate 增加 LoadBalanced 支援
  2. 使用 RestTemplate 呼叫介面

3.3.1 RestTemplate新增LoadBalanced

在 Spring Boot 啟動類上新增「@EnableDiscoveryClient」註解,並使用「@LoadBalanced」註解替換 IoC 容器中的 RestTemplate,具體實現程式碼如下:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
public class BusinessApplication {
    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(BusinessApplication.class, args);
    }
}

3.3.2 使用RestTemplate

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@RequestMapping("/business")
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);
    }
}

4.OpenFeign+LoadBalancer呼叫

此步驟又分為以下 5 步:

  1. 新增依賴:nacos + openfeign + loadbalancer
  2. 設定組態檔
  3. 開啟 openfeign 支援
  4. 編寫 service 程式碼
  5. 呼叫 service 程式碼

具體實現如下。

4.1 新增依賴

<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-openfeign</artifactId>
  </dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

4.2 設定組態檔

spring:
  application:
    name: nacos-discovery-business
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        username: nacos
        password: nacos
        register-enabled: false

4.3 開啟OpenFeign

在 Spring Boot 啟動類上新增 @EnableFeignClients 註解。

4.4 編寫Service

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Service
@FeignClient(name = "nacos-producer") // name 為生產者的服務名
public interface UserService {
    @RequestMapping("/user/getinfo") // 呼叫生產者的介面
    String getInfo(@RequestParam String name);
}

4.5 呼叫Service

import com.example.consumer.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OrderController {
    @Autowired
    private UserService userService;
    @RequestMapping("/order")
    public String getOrder(@RequestParam String name){
        return userService.getInfo(name);
    }
}

5.獲取本文原始碼

因平臺不能上傳附件,所以想要獲取本文完整原始碼,請聯絡我:gg_stone,備註:Nacos 原始碼,不然不予通過。

6.版本說明

本文案例基於以下版本:

  • JDK 17
  • Spring Boot 3.x
  • Spring Cloud Alibaba 2022.0.0.0
  • Nacos 2.2.3

7.小結

註冊中心作為微服務中不可或缺的重要元件,在微服務中充當著中介和協調者的作用。而 Nacos 作為近幾年來,國內最熱門的註冊中心,其 Restf 介面呼叫有兩種方式:RestTemplate + LoadBalancer 和 OpenFeign + LoadBalancer,開發者可以根據自己的實際需求,選擇相應的呼叫方式。

本文已收錄到我的面試小站 www.javacn.site,其中包含的內容有:Redis、JVM、並行、並行、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、設計模式、訊息佇列等模組。