SpringCloud Alibaba Nacos服務注冊和配置中心


一、Nacos簡介

1、為什么叫Nacos?

前四個字母分別為Naming和Configuration的前兩個字母,最后的s為Service

2、是什么?

一個更易於構建雲原生應用的動態服務發現,配置管理和服務管理中心。一句話:Nacos就是注冊中心+配置中心的組合——替代Eureka做服務注冊中心,替代Config做服務配置中心。

3、去哪下?

https://github.com/alibaba/Nacos

官方文檔:

https://nacos.io/zh-cn/index.html

https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_nacos_discovery

二、安裝並運行Nacos

本地 Java8+Maven 環境已經OK。先從官網下載Nacos,然后解壓,進入bin目錄,執行start命令,命令運行成功后直接訪問:http://localhost:8848/nacos,默認賬號密碼都是nacos

三、基於Nacos的服務提供者

新建Module:cloudalibaba-provider-payment9001

1、父POM

<!--spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.1.0.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

2、本模塊POM

<?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>cloud2020</artifactId>
        <groupId>com.atguigu.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloudalibaba-provider-payment9001</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <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>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>
    </dependencies>
</project>
pom文件

3、YML

server:
  port: 9001

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.216.132:8848 #配置Nacos地址

management:
  endpoints:
    web:
      exposure:
        include: '*'

4、主啟動

@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain9001.class,args);
    }
}

5、業務類

@RestController
public class PaymentController {
    @Value("${server.port}")
    private String serverPort;

    @GetMapping(value = "/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id) {
        return "nacos registry, serverPort: " + serverPort + "\t id" + id;
    }
}

仿照9001創建9002

6、測試

http://localhost:9001/payment/nacos/1

nacos控制台

nacos服務注冊中心+服務提供者9001都ok了

四、基於Nacos的服務消費者

新建Module:cloudalibaba-consumer-nacos-order83

1、POM

<?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>cloud2020</artifactId>
        <groupId>com.atguigu.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloudalibaba-consumer-nacos-order83</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.atguigu.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <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>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
pom文件

2、YML

server:
  port: 83

spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.216.132:8848

service-url:
  nacos-user-service: http://nacos-payment-provider

3、主啟動

@EnableDiscoveryClient
@SpringBootApplication
public class OrderNacosMain83 {
    public static void main(String[] args) {
        SpringApplication.run(OrderNacosMain83.class, args);
    }
}

4、注入RestTemplate

@Configuration
public class ApplicationContextConfig {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

5、業務類

@RestController
@Slf4j
public class OrderNacosController {
    @Resource
    private RestTemplate restTemplate;

    @Value("${service-url.nacos-user-service}")
    private String serverURL;

    @GetMapping(value = "/consumer/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Long id) {
        return restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class);
    }
}

6、測試

nacos控制台

訪問:http://localhost:83/consumer/payment/nacos/13

83訪問9001/9002,輪詢負載OK

五、各種注冊中心對比

Nacos全景圖所示

Nacos和CAP

Nacos支持AP和CP模式的切換

curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

六、Nacos作為配置中心-基礎配置

新建:cloudalibaba-config-nacos-client3377

1、POM

<?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>cloud2020</artifactId>
        <groupId>com.atguigu.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloudalibaba-config-nacos-client3377</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <!--nacos-config-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--nacos-discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--web + actuator-->
        <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>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
pom文件

2、bootstrap.yml

server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.216.132:8848 #服務注冊中心地址
      config:
        server-addr: 192.168.216.132:8848 #配置中心地址
        file-extension: yaml #指定yaml格式的配置
  profiles:
    active: dev

這里file-extension: yaml,nacos配置中心所建文件后綴也是yaml;如果file-extension: yml,nacos配置中心所建文件后綴就是yml,但文件類型還是選擇yaml。

3、匹配規則

官網說明:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

4、配置新增

nacos-config-client-dev.yaml

公式:${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}

  • prefix默認為spring.application.name的值
  • spring.profile.active既為當前環境對應的profile,可以通過配置項spring.profile.active來配置
  • file-exetension為配置內容的數據格式,可以通過配置項spring.cloud.nacos.config.file-extension配置

5、測試

  • 啟動前需要在nacos客戶端-配置管理-配置管理欄目下有沒有對應的yaml配置文件
  • 運行cloud-config-nacos-client3377的主啟動類
  • 調用接口查看配置信息:http://localhost:3377/config/info

6、自帶動態刷新

修改下Nacos中的yaml配置文件,再次調用查看配置的接口,就會發現配置已經刷新。

七、Nacos作為配置中心-分類配置

1、多環境多項目管理問題

問題1:

實際開發中,通常一個系統會准備:dev開發環境,test測試環境,prod生產環境。如何保證指定環境啟動時服務能正確讀取到Nacos上相應環境的配置文件呢?

問題2:

一個大型分布式微服務系統會有很多微服務子頂目,每個微服務項目又都會有相應的開發環境、測環境、預發環境、正式環境......那怎么對這些微服務配置進行管理呢?

2、Nacos的圖形化管理界面

配置管理

命名空間

3、Namespace+Group+DataID三者關系?為什么這么設計?

(1)是什么?

類似Java里面的package名和類名。最外層的namespace是可以用於區分部署環境的,Group和DataID邏輯上區分兩個目標對象。

(2)三者情況?

默認情況:Namespace=public,Group=DEFAULT_GROUP,默認Cluster是DEFAULT

Nacos默認的命名空間是public,Namespace主要用來實現隔離。比方說我們現在有三個環境:開發、測試、生產環境,我們就可以創建三個Namespace,不同的Namespace之間是隔離的。

Group默認是DEFAULT_GROUP,Group可以把不同的微服務划分到同一個分組里面去。

Service就是微服務;一個Service可以包含多個Cluster(集群),Nacos默認的Cluster是DEFAULT,Cluster是對指定微服務的一個虛擬划分。

比方說為了容災,將Service微服務分別部署在了杭州機房和廣州機房,這時就可以給杭州機房的Service微服務起一個集群名稱(HZ),給廣州機房的Service微服務起一個集群名稱(GZ),還可以盡量讓同一個機房的微服務互相調用,以提升性能。

最后是Instance,就是微服務的實例。

4、DataID方案

指定spring.profile.active和配置文件的DataID來使不同環境下讀取不同的配置

默認空間+默認分組+新建dev和test兩個DataID

  • 新建dev配置DataID
  • 新建test配置DataID

通過spring.profile.active屬性就能進行多環境下配置文件的讀取

5、Group方案

通過Group實現環境區分,新建Group

在nacos圖形界面控制台上面新建配置文件DataID

bootstrap+application

在config下增加一條group的配置即可。可配置為DEV_GROUP或TEST_GROUP 

6、Namespace方案

新建dev/test的Namespace

回到服務管理-服務列表查看

按照域名配置填寫

bootstrap

server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.216.132:8848 #服務注冊中心地址
      config:
        server-addr: 192.168.216.132:8848 #配置中心地址
        file-extension: yaml #指定yaml格式的配置
        namespace: 4f3fb3a3-4fae-43e1-ae38-cdcc9457bb24
        group: DEV_GROUP
  profiles:
    active: dev

 


免責聲明!

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



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