1. 程式人生 > >Spring Cloud Alibaba基礎教程:Nacos服務發現與配置管理

Spring Cloud Alibaba基礎教程:Nacos服務發現與配置管理

隨著微服務概念的流行,越來越多的公司採用Spring Cloud全家桶構建微服務系統,實現業務的快速迭代。Spring Cloud提供了快速構建分散式微服務常用元件,包括Spring Cloud EurekaSpring Cloud RibbonSpring Cloud HystrixSpring Cloud Zuul等等。依賴Spring強大生態環境,其已經成為Java開發人員構建微服務系統首選解決方案。

本系列文章將帶大家認識另一個微服務解決方案Spring Cloud Alibaba。依託於Alibaba強大的技術支撐,以及Eureka2.x不再維護等因素,相信不久的將來Spring Cloud Alibaba

將會成為大多數公司進行微服務實踐的更優選擇。


下面向大家介紹Nacos的服務註冊發現與配置管理功能。

Nacos 致力於幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元資料及流量管理。

Nacos 幫助您更敏捷和容易地構建、交付和管理微服務平臺。 Nacos 是構建以“服務”為中心的現代應用架構 (例如微服務正規化、雲原生正規化) 的服務基礎設施。

一、註冊發現

首先需要下載Nacos,下載完成直接解壓,接下來啟動Nacos

cd nacos/bin
// Linux/Unix/Mac
sh startup.sh -m standalone
// Windows
cmd startup.cmd -m standalone

上面即使用獨立的方式啟動Nacos,啟動完成之後訪問Nacos首頁,預設登入賬號和密碼都是nacos

登入成功之後,可以看見如下圖

接下來建立一個服務註冊到Nacos

  1. 首先建立一個父專案管理依賴,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>

    <modules>
        <module>service-provider</module>
    </modules>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.example</groupId>
    <artifactId>spring-cloud-alibaba-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>alibaba-demo</name>
    <packaging>pom</packaging>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
        <spring-cloud-alibaba.version>2.1.1.RELEASE</spring-cloud-alibaba.version>
    </properties>


    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <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>
  1. 然後建立子模組service-providerpom.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">
    <parent>
        <artifactId>spring-cloud-alibaba-demo</artifactId>
        <groupId>com.example</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>service-provider</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
  1. service-provider模組中新增bootstrap.yml配置檔案,檔案內容如下:
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  application:
    name: service-provider
  main:
    allow-bean-definition-overriding: true
server:
  port: 8080

上面的配置指定了服務註冊發現地址

  1. 啟動類程式碼
@EnableDiscoveryClient
@SpringBootApplication
public class ServiceProviderApplication {

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

}

然後啟動service-provider,即可在Nacos的服務列表中觀察到已經註冊上去的服務

通過Nacos提供的Open-API可以看到已經註冊的服務列表

➜  ~ curl -X GET '127.0.0.1:8848/nacos/v1/ns/service/list?pageNo=1&pageSize=10'
{"count":1,"doms":["service-provider"]}%                                         
➜  ~ 

到此已經完成的服務註冊的基本使用,接下來介紹配置管理的使用

二、配置管理

為了方便,我直接對service-provider專案進行改造演示

  1. 修改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">
    <parent>
        <artifactId>spring-cloud-alibaba-demo</artifactId>
        <groupId>com.example</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>service-provider</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

新增了spring-cloud-starter-alibaba-nacos-config依賴

  1. 修改bootstrap.yml
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
  application:
    name: service-provider
  main:
    allow-bean-definition-overriding: true
server:
  port: 8080

上面的配置指定配置管理服務地址

  1. 修改啟動類程式碼
@RefreshScope
@RestController
@EnableDiscoveryClient
@SpringBootApplication
public class ServiceProviderApplication {
    @Value("${config.test}")
    private String testConfigValue;

    @GetMapping("/config")
    public String getConfigValue() {
        return testConfigValue;
    }

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

}

新增@RefreshScope是支援動態配置更新

  1. 新增Nacos配置檔案

然後啟動專案觀察控制檯日誌輸出

2019-12-01 15:44:39.097  INFO 19295 --- [           main] c.a.c.n.c.NacosPropertySourceBuilder     : Loading nacos data, dataId: 'service-provider.properties', group: 'DEFAULT_GROUP', data: config.test=這是一個測試值

可以看到本地服務已經獲取到Nacos配置管理中的資料了。嘗試通過介面訪問資料

➜  ~ curl -X GET '127.0.0.1:8080/config'
這是一個測試值%                                                                    
➜  ~ 

正確獲取到配置資料,接下來嘗試修改配置資料

檢視控制檯日誌

2019-12-01 15:47:25.694  INFO 19295 --- [-127.0.0.1_8848] o.s.c.e.event.RefreshEventListener       : Refresh keys changed: [config.test]

說明已經修改成功,服務同步到最新的配置了。嘗試通過介面訪問資料

➜  ~ curl -X GET '127.0.0.1:8080/config'
這是一個測試值-修改後%                                                                    
➜  ~ 

配置動態更新也已經生效。專案原始碼

本文由部落格一文多發平臺 OpenWrite 釋出!