SpringCloud Alibaba入門之Nacos(SCA)

我也有夢想呀發表於2022-04-06

SpringCloud Alibaba

Spring Cloud Alibaba 致力於提供微服務開發 的一站式解決方案。此專案包含開發分散式應用微服務的必需元件,方便開發者通過 Spring Cloud 程式設計模型輕鬆使用這些元件來開發分散式應用服務。依託 Spring Cloud Alibaba,您只需要新增一些註解和少量配置,就可以將 Spring Cloud 應用接入阿里 微服務解決方案,通過阿里中介軟體來迅速搭建分散式應用系統。

SpringCloud Alibaba官方文件

1.SpringCloud Alibaba 之 Nacos

①Nacos 主要功能

  • 服務發現和服務健康監測
  • 動態配置服務
  • 動態DNS服務
  • 服務及其後設資料管理
    Nacos 可以說就是 註冊中心+配置中心 的組合,等價於:Nacos = Eureka+Config+Bus

②Nacos這麼強大,那具體怎麼使用呢?下面我們就一起探索

2.Nacos作為註冊中心

安裝Nacos方式一(windows):

1.下載:「nacos-server-1.1.4」https://www.aliyundrive.com/s/owtAZ27gNNd
點選連結儲存,或者複製本段內容,開啟「阿里雲盤」APP ,無需下載極速線上檢視,視訊原畫倍速播放。
我把安裝包放在了阿里雲盤大家可以自行下載,也可以去GitHub下載:https://github.com/alibaba/nacos/archive/1.1.4.tar.gz
2.解壓
3.啟動命令: cmd startup.cmd 或者雙擊 startup.cmd 執行檔案。

image

安裝Nacos方式二(linux):使用Docker的方式

1.拉取需要的nacos映象

docker pull nacos/nacos-server:【指定版本號】

image

2.在宿主機建立個docker資料夾專門來放docker容器相關的掛載資料

3.vim custom.properties編輯custom.properties檔案,加上以下內容

【management.endpoints.web.exposure.include=*】

4.啟動nacos容器:

docker run -d -p 8848:8848 -e MODE=standalone -v /docker/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties -v /docker/nacos/logs:/home/nacos/logs --restart always --name nacos nacos/nacos-server

image

註冊中心已經準備完畢,我們再基於 Nacos 註冊中心建立服務提供者和消費者。

這裡還是使用之前SpringCloud第一版一樣的案例,使用者微服務和電影微服務,查詢使用者資訊可以查詢電影資訊(遠端呼叫)

服務提供方

1.建立一個服務提供方電影微服務模組nacos-provider-movie6600

image

2.修改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>
    <groupId>com.qbb</groupId>
    <artifactId>nacos-provider-movie6600</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>nacos-provider-movie6600</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
        <spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>com.qbb</groupId>
            <artifactId>cloud-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </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>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.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.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.qbb.cloud2022.NacosProviderMovie6600Application</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

3.寫yml檔案

server:
  port: 6600

spring:
  application:
    name: nacos-provider-movie

  cloud:
    nacos:
      discovery:
        server-addr: 192.168.137.72:8848 #nacos服務端地址
  # 資料來源
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/qbbit3?serverTimezone=UTC
    username: root
    password: root

4.主啟動類

package com.qbb.cloud2022;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@MapperScan("com.qbb.cloud2022.mapper")
@EnableDiscoveryClient // 開啟Nacos客戶端服務
@SpringBootApplication
public class NacosProviderMovie6600Application {

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

}

5.業務

controller

package com.qbb.cloud2022.controller;

import com.qbb.cloud2022.com.qbb.springcloud.entity.Movie;
import com.qbb.cloud2022.service.MovieService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author QiuQiu&LL (個人部落格:https://www.cnblogs.com/qbbit)
 * @version 1.0
 * @date 2022-04-02  22:42
 * @Description:
 */
@RestController
@RequestMapping("/movie")
@Slf4j
public class MovieController {

    @Autowired
    private MovieService movieService;

    @Value("${server.port}")
    private String port;

    @GetMapping("/findById/{id}")
    public Movie findById(@PathVariable("id") Integer id) {
        log.info("port:{}", port);
        return movieService.findById(id);
    }
}

service

package com.qbb.cloud2022.service.impl;

import com.qbb.cloud2022.com.qbb.springcloud.entity.Movie;
import com.qbb.cloud2022.mapper.MovieMapper;
import com.qbb.cloud2022.service.MovieService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author QiuQiu&LL (個人部落格:https://www.cnblogs.com/qbbit)
 * @version 1.0
 * @date 2022-04-02  22:45
 * @Description:
 */
@Service
public class MovieServiceImpl implements MovieService  {

    @Autowired
    private MovieMapper movieMapper;

    @Override
    public Movie findById(Integer id) {
        return movieMapper.findById(id);
    }
}

mapper

package com.qbb.cloud2022.mapper;

import com.qbb.cloud2022.com.qbb.springcloud.entity.Movie;
import org.apache.ibatis.annotations.Select;

/**
 * @author QiuQiu&LL (個人部落格:https://www.cnblogs.com/qbbit)
 * @version 1.0
 * @date 2022-04-02  22:46
 * @Description:
 */
public interface MovieMapper {
    @Select("select * from movie where id=#{id}")
    Movie findById(Integer id);
}

測試一下:
image

服務消費方

1.建立一個服務消費方電影微服務模組nacos-provider-movie6600

2.修改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>
    <groupId>com.qbb</groupId>
    <artifactId>nacos-consumer-user6700</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>nacos-consumer-user6700</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
        <spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.qbb</groupId>
            <artifactId>cloud-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </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>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.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.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.qbb.cloud2022.NacosConsumerUser6700Application</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

3.寫yml檔案

server:
  port: 6700

spring:
  application:
    name: nacos-consumer-user

  cloud:
    nacos:
      discovery:
        server-addr: 192.168.137.72:8848
  # 資料來源
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/qbbit3?serverTimezone=UTC
    username: root
    password: root

4.主啟動類

package com.qbb.cloud2022;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@MapperScan("com.qbb.cloud2022.mapper")
@EnableDiscoveryClient // 開啟nacos註冊中心支援
@SpringBootApplication
public class NacosConsumerUser6700Application {

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

}

5.業務

controller

package com.qbb.cloud2022.controller;

import com.qbb.cloud2022.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

/**
 * @author QiuQiu&LL (個人部落格:https://www.cnblogs.com/qbbit)
 * @version 1.0
 * @date 2022-04-03  13:31
 * @Description:
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/findUserAndMovie/{id}")
    public Map findUserAndMovie(@PathVariable("id") Integer id) {
        Map<String, Object> map = userService.findUserAndMovie(id);
        return map;
    }

}

service

package com.qbb.cloud2022.service.impl;

import com.qbb.cloud2022.com.qbb.springcloud.entity.User;
import com.qbb.cloud2022.mapper.UserMapper;
import com.qbb.cloud2022.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * @author QiuQiu&LL (個人部落格:https://www.cnblogs.com/qbbit)
 * @version 1.0
 * @date 2022-04-03  13:32
 * @Description:
 */
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public Map<String, Object> findUserAndMovie(Integer id) {
        User user = userMapper.findById(id);
        Map<String, Object> map = new HashMap<>();
        map.put("user", user);
        map.put("movie", null);
        return map;
    }
}

mapper

package com.qbb.cloud2022.mapper;

import com.qbb.cloud2022.com.qbb.springcloud.entity.User;
import org.apache.ibatis.annotations.Select;

/**
 * @author QiuQiu&LL (個人部落格:https://www.cnblogs.com/qbbit)
 * @version 1.0
 * @date 2022-04-03  13:48
 * @Description:
 */
public interface UserMapper {
    @Select("select * from user where id=#{id}")
    User findById(Integer id);
}

測試一下:
image

Nacos註冊中心的服務資訊:
image

上面我們是沒有進行遠端呼叫查詢電影資訊的,那麼接下來我們可以使用OpenFeign實現遠端的呼叫

1.匯入OpenFeign的依賴

 <dependency>
	 <groupId>org.springframework.cloud</groupId>
	 <artifactId>spring-cloud-starter-openfeign</artifactId>
	 <version>2.2.2.RELEASE</version>
</dependency>

2.主啟動類上加註解

@EnableFeignClients // 開啟Feign遠端呼叫支援

3.建立遠端呼叫的介面FeignMovieService

package com.qbb.cloud2022.feign;

import com.qbb.cloud2022.com.qbb.springcloud.entity.Movie;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * @author QiuQiu&LL (個人部落格:https://www.cnblogs.com/qbbit)
 * @version 1.0
 * @date 2022-04-03  19:56
 * @Description:
 */
@FeignClient(value = "nacos-provider-movie") // value屬性指定被呼叫服務的在註冊中心的服務名
public interface FeignMovieService {

    @GetMapping("/movie/findById/{id}")
    public Movie findById(@PathVariable("id") Integer id);
}

測試一下:
image

我們檢視Nacos的依賴會發現匯入Nacos依賴也會同時匯入Ribbon的依賴,所以可以說Nacos天生就自帶負載均衡策略

image

我們將電影微服務copy兩份,測試一下負載均衡效果,Ribbon預設是輪訓的策略進,看看Nacos中是否也是

右鍵電影微服務,選擇Copy Configuration

image

修改相關引數

image

執行相關的四個微服務
image

遠端呼叫測試一下
image

可以看出的確是輪訓的方式,那麼我想修改負載均衡策略該怎麼辦呢?

Nacos為我們提供了兩種凡是實現負載均衡策略

方式一:和原來一樣,整一個配置類提供相應的IRule實現類物件

package com.qbb.cloud2022.config;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author QiuQiu&LL (個人部落格:https://www.cnblogs.com/qbbit)
 * @version 1.0
 * @date 2022-04-03  20:22
 * @Description:
 */
@Configuration
public class IRuleConfig {
    
    @Bean
    public IRule iRule(){
        return new RandomRule(); // 使用隨機的負載均衡策略
    }
}

方式二:yml配置檔案方式(當然也可以自定義的)

stock-service:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule  #指定使用Nacos提供的負載均衡策略(優先呼叫同一叢集的例項,基於隨機&權重)
    eager-load:
      enabled: true #開啟ribbon飢餓載入
      clients: stock-service  #配置stock-service使用ribbon飢餓載入,多個使用逗號分隔

接下來我們使用Nacos整合一下Hystrix,實現服務熔斷,降級,限流

匯入Hystrix依賴

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
	<version>2.2.2.RELEASE</version>
</dependency>

主啟動上加入註解

@EnableCircuitBreaker // 開啟Hystrix

建立一個兜底的處理器,實現遠端呼叫的方法進行兜底

package com.qbb.cloud2022.handler;

import com.qbb.cloud2022.com.qbb.springcloud.entity.Movie;
import com.qbb.cloud2022.feign.FeignMovieService;
import org.springframework.stereotype.Component;

/**
 * @author QiuQiu&LL (個人部落格:https://www.cnblogs.com/qbbit)
 * @version 1.0
 * @date 2022-04-03  20:42
 * @Description:
 */
@Component
public class FeignMovieServiceExceptionHandler implements FeignMovieService {


    @Override
    public Movie findById(Integer id) {
        Movie movie = new Movie();
        movie.setId(-1);
        movie.setName("網路故障,請稍後再試");
        return movie;
    }
}

注意別忘記在yml檔案中配置

feign:
  hystrix:
    enabled: true # 開啟feign對hystrix的支援

修改服務端程式碼,關閉所有的服務端和重啟消費端,測試一下
image

image

image

Nacos 與其他服務註冊中心對比

image

3.Nacos中的資料模型

Namespace 名稱空間、Group 分組、叢集這些都是為了進⾏歸類管理,把服務和配置⽂件進⾏歸類,歸類之後就可以實 現⼀定的效果, ⽐如,對於服務來說,不同名稱空間中的服務不能夠互相訪問調⽤。

image

  • Namespace:名稱空間,對不同的環境進⾏隔離,⽐如隔離開發環境、測試環境和⽣產環境
  • Group:分組,將若⼲個服務或者若⼲個配置集歸為⼀組,通常習慣⼀個系統歸為⼀個組
  • Service:某⼀個服務,⽐如簡歷微服務
  • DataId:配置集或者可以認為是⼀個配置⽂件

推薦用法:
image

服務的分級儲存模型

image

每個服務也可以組成多個叢集,多個叢集又包含了多個例項.並且微服務互相訪問時,應該儘可能訪問同叢集例項,因為本地訪問速度更快。當本叢集內不可用時,才訪問其它叢集。

如何給服務分配叢集呢?
image

重啟微服務:
image

訪問:http://localhost:6700/user/findUserAndMovie/1 發現,預設的ZoneAvoidanceRule並不能實現根據同叢集優先來實現負載均衡, 因此 Nacos 中提供了一個 NacosRule的實現,可以優先從同叢集中挑選例項。

nacos-provider-movie: #被呼叫方在nacos註冊中心的服務名
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

權重配置:
image

如果權重修改為 0,則該例項永遠不會被訪問,可以實現無縫上線應用

環境隔離

同一個名稱空間下的服務是可以相互呼叫的,反之則不能

我現在修改nacos-provider-movie6600的namespace

namespace: 3ad61d82-3435-4729-86e2-57f828280e9f # 修改namespace環境

重啟測試:
image

注意在Nacos分為兩種例項,臨時例項和永久例項(eureka只有臨時例項),臨時例項採用心跳模式,非臨時例項採用主動檢測模式

修改yml配置檔案可以將例項設定為永久例項.這樣即使例項當機了,Nacos服務端也不會將其剔除,等當機的服務重新啟動了,又會自動註冊進註冊中心

ephemeral: true # 將此服務設定為永久例項

Nacos沒有永久例項時,遵循AP(可用性,分割槽容錯性!eureka也是如此),有永久例項時,遵循CP(強一致性,分割槽容錯性)

image

當我把服務nacos-provider-movie6600關掉,會發現Nacos並不會將服務剔除掉

4.Nacos作為配置中心

Nacos 除了可以做註冊中心,同樣可以做配置管理來使用。nacos 作為配置中心可以做到系統配置的集中管理(編輯、 儲存、分發)、動態更新不重啟、回滾配置(變更管理、歷史版本管理、變更審計)等所有與配置相關的活動。有 Nacos 之後,分散式配置就簡單很多 Github 不需要了(配置資訊直接配置在 Nacos server 中),Bus 也不需要了(依然可 以完成配置檔案的熱更新, 及時通知微服務)。如果微服務架構中沒有使用統一配置中心時,所存在的問題:

  • 配置檔案分散在各個專案⾥,微服務例項的數量達到上百個的時候,實在是不方便維護
  • 配置內容安全與許可權
  • 更新配置後,專案需要重啟,即使不需要重啟也需要運維人員使用curl傳送請求執行更新

image

新增配置檔案

image

注意dataId格式
image

1.prefix 預設為所屬工程配置spring.application.name 的值(nacos-provider-movie*),也可以通過配置項 spring.cloud.nacos.config.prefix來配置。
2.spring.profile.active 即為當前環境對應的 profile,詳情可以參考 Spring Boot文件。 注意:當 spring.profile.active 為 空時,對應的連線符 - 也將不存在,dataId 的拼接格式變成 ${prefix}.${file-extension}
3.file-exetension 為配置內容的資料格式,可以通過配置項spring.cloud.nacos.config.file-extension 來配置。目前只支援 properties 和 yaml 型別。

上面我們在Nacos中建立了一個配置檔案,接下來我們怎麼在微服務中使用呢?

1.匯入Nacos作為配置中心的依賴
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2.在bootstrap.yml檔案中新增如下配置

spring:
  cloud:
    nacos:
      server-addr: 192.168.137.72:8848
      config:
        file-extension: yml # 配置檔案預設的字尾是properties檔案,如果是yml,必須指定
  profiles:
    active: dev

3.編寫測試程式碼

package com.qbb.cloud2022.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author QiuQiu&LL (個人部落格:https://www.cnblogs.com/qbbit)
 * @version 1.0
 * @date 2022-04-06  18:49
 * @Description:
 */
@RestController
public class HelloController {
    @Value("${user.age}")
    private Integer age;

    @GetMapping("/hello")
    public Integer hello() {
        return age;
    }
}

4.結果

image

5.那如何實現修改配置中心的檔案實現熱載入呢?

只需要在指定位置加上註解@RefreshScope 實現自動更新

@RefreshScope

名稱空間切換環境

建立兩個環境分別為dev和test

image

將public中的配置檔案clone到dev和test環境

image

修改dev和test環境配置檔案的內容

image

配置namespace

namespace: c6ab48bd-2159-450e-aef8-65095e015036 # 指定環境變數的唯一標識

image

測試一下

image

配置檔案回滾到某個歷史版本

image

image

載入多配置檔案

在dev名稱空間下建立mysql.yml,redis.yml
image

image

修改bootstrap.yml

 extension-configs:
          - dataId: mysql.yml
            refresh: true
          - dataId: redis.yml
            refresh: true

修改controller層程式碼

package com.qbb.cloud2022.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author QiuQiu&LL (個人部落格:https://www.cnblogs.com/qbbit)
 * @version 1.0
 * @date 2022-04-06  18:49
 * @Description:
 */
@RestController
@RefreshScope
public class HelloController {


    @Value("${user.age}")
    private Integer age;

    @Value("${mysql.port}")
    private Integer mysqlPort;

    @Value("${redis.port}")
    private Integer redisPort;

    @GetMapping("/hello1")
    public String hello1() {
        return "age:" + age + "=mysql:" + mysqlPort + "=redis:" + redisPort;
    }

    @GetMapping("/hello")
    public Integer hello() {
        return age;
    }
}

測試一下:
image

我們還可以給配置檔案新增group

group: order # 用於區分業務

由於我們nacos配置中心並沒有order這個組,所以啟動報錯了
image

我們新增一個order組試試
image

修改兩個order組的配置檔案內容,具體內容大家自行修改就好了,直接測試
image

相關文章