SpringCloudAlibaba - 整合 Nacos 實現服務注冊與發現


前言

記錄下Nacos的整合過程

環境

Win 10 + Spring Cloud Hoxton.SR9 + Spring Cloud Alibaba 2.2.6.RELEASE + Nacos 1.4.2


Nacos是什么?

  • Nacos是一個服務發現組件,也是一個配置服務器,Nacos解決的兩個問題:
1、服務A怎么找到服務B 
2、管理微服務的配置

在這里插入圖片描述



服務發現原理

  • 服務發現機制
    服務發現機制就是服務消費者總能找到服務提供者的機制,舉個例子:服務發現就像手機中的名片夾,記錄一個人所有的聯系方式,通過該名片可以聯系到某個人,而當某個聯系方式不存在時(服務DOWN)就將其從名片夾中刪除。

  • 用於生產的服務發現機制:
    1、在微服務上做緩存,定時任務發送當前的地址,調用時取緩存中微服務的地址,該做法好處首先是壓力小,不用每次都去實時取,其次是即使服務發現組件崩潰也可以取到緩存中的值,只是無法更新緩存中的值。
    2、每個微服務實例都向服務發現組件發送心跳(即一次請求),告訴服務發現組件自己是活着的,如果服務發現組件發現某一個實例長時間未向自己發送心跳,即認為該實例已掛,將其健康狀態標記為DOWN,服務消費者即不再調用該實例。


搭建 Nacos Server

Nacos Server 下載地址

https://github.com/alibaba/nacos/releases


Nacos Server 的版本選擇

Nacos Server的版本選擇參照標准在spring-cloud-alibaba-dependencies-xxx.pom中有記錄,如我的Spring Cloud Alibaba的版本是2.2.6.RELEASE,其推薦的版本是1.4.2
在這里插入圖片描述


運行 Nacos Server

startup.cmd -m standalone

在這里插入圖片描述

  • 訪問http://localhost:8848/nacos/#/login(默認端口是8848)

在這里插入圖片描述

  • 默認登錄賬號/密碼:nacos/nacos

在這里插入圖片描述


... Nacos Server 搭建完畢


Nacos Client 注冊

user-center 用戶中心微服務注冊

  • 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.coisini</groupId>
    <artifactId>user-center</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>user-center</name>
    <description>user-center project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
        <spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--spring-cloud-starter-{spring cloud子項目的名稱}-[{模塊名稱}]-->
        <!-- 注冊中心客戶端 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <!-- 整合spring cloud -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- 整合spring cloud alibaba -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
  • application.yml
spring:
  application:
    # 服務名稱
    name: user-center
  cloud:
    nacos:
      discovery:
        # 指定nacos server的地址
        server-addr: localhost:8848
  • 啟動項目
  • 訪問Nacos

在這里插入圖片描述


content-center 內容中心微服務注冊

  • pom.xml依賴同上
  • application.yml
spring:
  application:
    # 服務名稱
    name: content-center
  cloud:
    nacos:
      discovery:
        # 指定nacos server的地址
        server-addr: localhost:8848
  • 訪問Nacos

在這里插入圖片描述



服務發現測試

  • 內容中心編寫測試代碼
@RestController
public class TestController {

    @Autowired
    private DiscoveryClient discoveryClient;

    /**
     * 測試:服務發現,證明內容中心總能找到用戶中心
     * @return 用戶中心所有實例的地址信息
     */
    @GetMapping("test")
    public List<ServiceInstance> getInstances() {
        // 查詢指定服務的所有實例的信息
        return discoveryClient.getInstances("user-center");
    }
}
  • 如下所示,內容中心可以獲取到用戶中心所有實例的地址信息

在這里插入圖片描述



測試用例

內容中心調用用戶中心的實例


user-center

  • TestController.java
@RestController
public class TestController {

    @GetMapping("/test/{name}")
    public String test(@PathVariable String name) {
        return "hello " + name;
    }

}

content-center

  • TestController.java
@RestController
@Slf4j
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class TestController {

    private final DiscoveryClient discoveryClient;

    @GetMapping("test1")
    public String test1() {
        // 用戶中心所有實例信息
        List<ServiceInstance> instances = discoveryClient.getInstances("user-center");
        String targetUrl = instances.stream()
                .map(instance -> instance.getUri().toString() + "/test/{name}")
                .findFirst()
                .orElseThrow(() -> new IllegalArgumentException("當前沒有實例"));

        log.info("目標地址:{}", targetUrl);

        // 調用用戶微服務獲取用戶信息
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate.getForObject(
                targetUrl,
                String.class,
                "Coisini"
        );
    }
}

測試結果


在這里插入圖片描述



項目源碼



- End -
白嫖有風險
點贊加收藏


免責聲明!

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



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