Spring Cloud Alibaba 使用Nacos作為服務註冊中心

SimpleWu發表於2021-10-28

為什麼需要註冊中心?

在分散式架構中,服務會註冊到這裡,當服務需要呼叫其它服務時,就到這裡找到服務的地址,進行呼叫;服務管理,核心是有個服務登錄檔,心跳機制動態維護 ;

服務註冊

建立普通SpringBoot工程(spring-cloud-alibaba-service-user)該工程當前用於使用Nacos進行服務註冊。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.gitee</groupId>
    <artifactId>spring-cloud-alibaba-service-user</artifactId>
    <version>0.0.1</version>
    <dependencyManagement>
        <dependencies>
            <!-- 依賴管理父工程 -->
            <dependency>
                <groupId>com.gitee</groupId>
                <artifactId>spring-cloud-alibaba-version-parent</artifactId>
                <version>${project.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!-- 公共模組 -->
        <dependency>
            <groupId>com.gitee</groupId>
            <artifactId>spring-cloud-alibaba-common</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!-- web服務 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- undertow伺服器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-undertow</artifactId>
        </dependency>
        <!-- 引數校驗 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <!-- nacos 服務治理 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- nacos 配置中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!-- openfeign 服務發現呼叫 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>
</project>

application.yaml

server:
  port: 8080
spring:
  application:
    name: service-user
  cloud:
    nacos:
      discovery:
        #註冊中心地址
        server-addr: localhost:8848
        #服務後設資料
        metadata:
          version: 0.0.1
          appname: ${spring.application.name}

UserServiceApplication.java

/**
 * 使用者中心服務啟動類
 *
 * @author wentao.wu
 */
@EnableDiscoveryClient//服務註冊
@SpringBootApplication
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}

HelloWorldController.java

/**
 * HelloWorld Web
 *
 * @author wentao.wu
 */
@RequestMapping(value = "/hello/")
@RestController
public class HelloWorldController {
    @GetMapping("/say/{name}")
    public Response<String> say(@PathVariable("name") String name) {
        Response<String> response = new Response<>();
        response.setCode("1");
        response.setMsg("你好啊," + name + "!");
        return response;
    }
}

以上內容是整個工程當前的內容,直接執行訪問:http://localhost:8080/hello/say/nacos,後者輸出:

{
    "code": "1",
    "msg": "你好啊,nacos!",
    "errorCode": null,
    "errorMsg": null,
    "result": null
}

看到以上返回內容代表整個服務完全啟動成功。進入nacos管理介面:http://localhost:8848/nacos 預設登入賬號與密碼為 nacos/nacos

進入服務管理選單->服務列表就能夠看到我們註冊進去的服務。

點選詳情即可檢視服務後設資料:

image-20211028095526214

從Nacos之中服務列表能夠看到我們所註冊的服務意味這服務已經註冊到Nacos Server端。

多環境服務隔離

用於進行租戶粒度的配置隔離。不同的名稱空間下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用場景之一是不同環境的配置的區分隔離,例如開發測試環境和生產環境的資源(如配置、服務)隔離等。

在資源不夠的情況下,開發環境(dev),綜合測試環境(sit),業務測試環境(uat)通常會公用一套Nacos Server,使用Namespace 來區分環境,然後再通過dataID來指定每個服務的配置檔案,這樣就可以每個環境的服務註冊發現不會相互干擾,並且也不會用到其他環境的配置檔案。

建立名稱空間

從Nacos選單中名稱空間點選新建名稱空間,輸入空間名稱與描述,名稱空間ID可填可不填,不填則會自動生成一串UUID的字元。

記錄自動生成的名稱空間ID:7e3699fa-09eb-4d47-8967-60f6c98da94a

工程使用對應的名稱空間

application.yaml

server:
  port: 8080
spring:
  application:
    name: service-user
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        metadata:
          version: 0.0.1
          appname: ${spring.application.name}
        #指定名稱空間 對應dev環境
        namespace: 7e3699fa-09eb-4d47-8967-60f6c98da94a
        #指定分組 案例組
        group: EXAMPLE-GROUP
        #指定叢集環境 華南
        cluster-name: HuaNan

這裡新增了3個配置。

Namespace:使用dev環境的名稱空間id指定該服務部署在dev環境下與其他名稱空間服務進行隔離。

Group: 標識該服務屬於哪個專案組。

Cluster-name:標識該服務部署在華南地區。

Nacos Server最終由namespace->group->ServiceID->Cluster-name獲取到對應的服務例項列表。

配置好之後執行UserServiceApplication.java對服務進行重啟,重啟之後服務將重新註冊到Nacos中並且在Web介面服務列表中Dev名稱空間進行顯示。

注意事項

Namespace與Group配置後只有Namespace與Group相同的才能夠算作一套系統,只有同一套系統才能夠內部進行快速訪問,如使用feign進行遠端呼叫時,GROUP=金融系統與GROUP=電商系統兩個不同的GROUP在其中是不能夠直接通過Feign服務發現進行訪問的,對應的業務服務只會發現對應Namespace與Group中的服務。

原始碼程式碼存放地址

gitee: https://gitee.com/SimpleWu/spring-cloud-alibaba-example.git
cnblogs: https://www.cnblogs.com/SimpleWu
持續更新目錄:https://www.cnblogs.com/SimpleWu/p/15476427.html

相關文章