Nacos服務注冊與發現的2種實現方法!


Spring Cloud Alibaba 技術體系中的 Nacos,提供了兩個重要的功能:注冊中心(服務注冊與發現)功能和配置中心功能。

其中注冊中心解決了微服務調用中,服務提供者和服務調用者的解耦,讓程序開發者可以無需過多的關注服務提供者和調用者的運行細節,只需要通過 Nacos 的注冊中心就可以實現兩者的互聯互通,相當於實現了遠程服務本地化,並且提供了健康檢查等機制。

而 Nacos 注冊中心又提供了兩種服務注冊和發現的方法:OpenAPI 方法和(Nacos)SDK 方法。

所謂的 OpenAPI 是指通過 Nacos 提供的開放 API 地址實現服務的注冊與發現;而 SDK 方法是通過 Nacos 提供的 SDK 框架,也就是使用 spring-cloud-starter-alibaba-nacos-discovery 框架來實現服務注冊與發現的功能。

1.服務注冊

1.1 服務注冊:OpenAPI模式

OpenAPI 的使用方式相對來說比較簡單,首先打開系統的命令行,在系統命令行中使用以下命令實現服務注冊:

curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=spring-cloud-nacos-producer&ip=192.168.76.224&port=8081'

以上命令的執行結果如下圖所示:
image.png
當返回“ok”結果時,表示服務注冊成功,其中:

  • serviceName:表示服務名。
  • ip:表示客戶端程序的 IP 地址。
  • port:表示客戶端程序的端口號。

與此同時我們打開 Nacos 管理后台也可以看到我們注冊的服務,如下圖所示:
image.png
點擊服務詳情,可以看到我們注冊的 IP 地址和端口,如下圖所示:
image.png

1.2 服務注冊:SDK模式

SDK 模式需要先創建一個 Spring Cloud 項目,項目創建方法請參考:https://mp.weixin.qq.com/s/c4EHDWAlTXKr3Xl17biglA,項目創建成功之后添加 Nacos 的 SDK 框架支持,最后再配置 Nacos 的相關信息即可,具體實現如下。

1.2.1 添加 SDK

在 pom.xml 中添加 Nacos SDK 框架支持,具體配置如下:

<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

1.2.2 Nacos 配置

SDK 框架添加完成之后,需要在項目的配置文件中添加相應的配置,具體配置內容如下:

# 應用名稱
spring.application.name=spring-cloud-nacos-producer
# Nacos認證信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服務發現與注冊配置,其中子屬性 server-addr 指定 Nacos 服務器主機和端口
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 注冊到 nacos 的指定 namespace,默認為 public
spring.cloud.nacos.discovery.namespace=public

設置完以上配置之后,啟動當前項目,程序會自己自動注冊到 Nacos 服務端。

2.服務發現

服務被正確注冊到 Nacos 之后,就可以通過服務發現正常的調用服務提供者暴露的方法了,它的實現方法依然有以下兩種。

2.1 服務發現:OpenAPI模式

在系統命令行中使用以下命令實現服務發現:

curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'

執行結果如下所示:
image.png
以上內容 JSON 格式化之后的信息如下:

{
  "name": "DEFAULT_GROUP@@spring-cloud-nacos-producer",
  "groupName": "DEFAULT_GROUP",
  "clusters": "",
  "cacheMillis": 10000,
  "hosts": [
    {
      "instanceId": "192.168.76.224#8081#DEFAULT#DEFAULT_GROUP@@spring-cloud-nacos-producer",
      "ip": "192.168.76.224",
      "port": 8081,
      "weight": 1,
      "healthy": true,
      "enabled": true,
      "ephemeral": true,
      "clusterName": "DEFAULT",
      "serviceName": "DEFAULT_GROUP@@spring-cloud-nacos-producer",
      "metadata": {
        "preserved.register.source": "SPRING_CLOUD"
      },
      "instanceHeartBeatInterval": 5000,
      "instanceHeartBeatTimeOut": 15000,
      "ipDeleteTimeout": 30000
    }
  ],
  "lastRefTime": 1644210068852,
  "checksum": "",
  "allIPs": false,
  "reachProtectionThreshold": false,
  "valid": true
}

其中:

  • healthy:表示是否開啟健康檢測功能,也就是定期的將自己的健康狀態報告給 Nacos 服務器端。
  • ephemeral:表示是否為臨時實例,臨時實例下線一段時間之后,會被 Nacos 直接剔除。
  • “"instanceHeartBeatInterval": 5000”:表示每 5s 執行一次健康檢測。
  • “"instanceHeartBeatTimeOut": 15000”:表示如果超過 15s 沒有收到(客戶端)心跳包,就將此實例設置為非健康狀態。
  • “"ipDeleteTimeout": 30000”:表示如果超過 30s 沒有收到心跳包就剔除臨時實例。

2.2 服務發現:SDK模式

與 SDK 實現服務注冊的步驟類似,服務發現也是先要創建 Spring Cloud 項目,然后添加 Nacos SDK 框架,再配置 Nacos 相關信息,最后編寫代碼來調用服務提供者提供的方法。

2.2.1 添加 SDK

在項目的 pom.xml 文件中,添加 Nacos SDK 框架支持,具體內容如下:

<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2.2.2 配置 Nacos

在項目的配置文件中添加如下 Nacos 的相關配置:

# 應用名稱
spring.application.name=springcloud-nacos-consumer
# Nacos認證信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服務發現與注冊配置,其中子屬性 server-addr 指定 Nacos 服務器主機和端口
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 注冊到 nacos 的指定 namespace,默認為 public
spring.cloud.nacos.discovery.namespace=public

2.2.3 調用服務提供者

最后一步在項目中使用 RestTemplate 對象,實現調用服務提供者暴露的方法。
首先我們需要一個 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 SpringcloudNacosConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringcloudNacosConsumerApplication.class, args);
    }
    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

有了 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
public class TestController {
    @Autowired
    private RestTemplate restTemplate;
    @RequestMapping("/hi")
    public String hi(String name) {
        // 調用服務提供者的 sayhi 方法,並將結果返回
        return restTemplate.getForObject("http://spring-cloud-nacos-producer/sayhi/" + 
                                         name,String.class);
    }
}

其中“http://spring-cloud-nacos-producer/sayhi/xxx”中的“spring-cloud-nacos-producer”為 Nacos 的服務名,“/sayhi/xxx”為服務提供者提供的方法訪問地址。從這里可以看出,在服務調用者這里無需知道服務提供者的具體地址,只需要調用 Nacos 提供的服務名就可以了,這樣就實現了服務提供者和調用者的(請求地址)解耦了。

小結

Nacos 注冊中心提供了兩種服務注冊與發現的方法:OpenAPI 方式和 SDK 方式,其中比較常用的是 SDK 的實現方式,也就是在項目中添加 Nacos 的 SDK,再配置好 Nacos 的相關配置就可以實現服務的自動注冊和調用了。

是非審之於己,毀譽聽之於人,得失安之於數。

公眾號:Java中文社群

Java面試合集:https://gitee.com/mydb/interview


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM