SpringCloud Alibaba
Spring Cloud Alibaba 致力於提供微服務開發 的一站式解決方案。此專案包含開發分散式應用微服務的必需元件,方便開發者通過 Spring Cloud 程式設計模型輕鬆使用這些元件來開發分散式應用服務。依託 Spring Cloud Alibaba,您只需要新增一些註解和少量配置,就可以將 Spring Cloud 應用接入阿里 微服務解決方案,通過阿里中介軟體來迅速搭建分散式應用系統。
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 執行檔案。
安裝Nacos方式二(linux):使用Docker的方式
1.拉取需要的nacos映象
docker pull nacos/nacos-server:【指定版本號】
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
註冊中心已經準備完畢,我們再基於 Nacos 註冊中心建立服務提供者和消費者。
這裡還是使用之前SpringCloud第一版一樣的案例,使用者微服務和電影微服務,查詢使用者資訊可以查詢電影資訊(遠端呼叫)
服務提供方
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-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);
}
測試一下:
服務消費方
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);
}
測試一下:
Nacos註冊中心的服務資訊:
上面我們是沒有進行遠端呼叫查詢電影資訊的,那麼接下來我們可以使用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);
}
測試一下:
我們檢視Nacos的依賴會發現匯入Nacos依賴也會同時匯入Ribbon的依賴,所以可以說Nacos天生就自帶負載均衡策略
我們將電影微服務copy兩份,測試一下負載均衡效果,Ribbon預設是輪訓的策略進,看看Nacos中是否也是
右鍵電影微服務,選擇Copy Configuration
修改相關引數
執行相關的四個微服務
遠端呼叫測試一下
可以看出的確是輪訓的方式,那麼我想修改負載均衡策略該怎麼辦呢?
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的支援
修改服務端程式碼,關閉所有的服務端和重啟消費端,測試一下
Nacos 與其他服務註冊中心對比
3.Nacos中的資料模型
Namespace 名稱空間、Group 分組、叢集這些都是為了進⾏歸類管理,把服務和配置⽂件進⾏歸類,歸類之後就可以實 現⼀定的效果, ⽐如,對於服務來說,不同名稱空間中的服務不能夠互相訪問調⽤。
- Namespace:名稱空間,對不同的環境進⾏隔離,⽐如隔離開發環境、測試環境和⽣產環境
- Group:分組,將若⼲個服務或者若⼲個配置集歸為⼀組,通常習慣⼀個系統歸為⼀個組
- Service:某⼀個服務,⽐如簡歷微服務
- DataId:配置集或者可以認為是⼀個配置⽂件
推薦用法:
服務的分級儲存模型
每個服務也可以組成多個叢集,多個叢集又包含了多個例項.並且微服務互相訪問時,應該儘可能訪問同叢集例項,因為本地訪問速度更快。當本叢集內不可用時,才訪問其它叢集。
如何給服務分配叢集呢?
重啟微服務:
訪問:http://localhost:6700/user/findUserAndMovie/1 發現,預設的ZoneAvoidanceRule
並不能實現根據同叢集優先來實現負載均衡, 因此 Nacos 中提供了一個 NacosRule
的實現,可以優先從同叢集中挑選例項。
nacos-provider-movie: #被呼叫方在nacos註冊中心的服務名
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
權重配置:
如果權重修改為 0,則該例項永遠不會被訪問,可以實現無縫上線應用
環境隔離
同一個名稱空間下的服務是可以相互呼叫的,反之則不能
我現在修改nacos-provider-movie6600的namespace
namespace: 3ad61d82-3435-4729-86e2-57f828280e9f # 修改namespace環境
重啟測試:
注意在Nacos分為兩種例項,臨時例項和永久例項(eureka只有臨時例項),臨時例項採用心跳模式,非臨時例項採用主動檢測模式
修改yml配置檔案可以將例項設定為永久例項.這樣即使例項當機了,Nacos服務端也不會將其剔除,等當機的服務重新啟動了,又會自動註冊進註冊中心
ephemeral: true # 將此服務設定為永久例項
Nacos沒有永久例項時,遵循AP(可用性,分割槽容錯性!eureka也是如此),有永久例項時,遵循CP(強一致性,分割槽容錯性)
當我把服務nacos-provider-movie6600關掉,會發現Nacos並不會將服務剔除掉
4.Nacos作為配置中心
Nacos 除了可以做註冊中心,同樣可以做配置管理來使用。nacos 作為配置中心可以做到系統配置的集中管理(編輯、 儲存、分發)、動態更新不重啟、回滾配置(變更管理、歷史版本管理、變更審計)等所有與配置相關的活動。有 Nacos 之後,分散式配置就簡單很多 Github 不需要了(配置資訊直接配置在 Nacos server 中),Bus 也不需要了(依然可 以完成配置檔案的熱更新, 及時通知微服務)。如果微服務架構中沒有使用統一配置中心時,所存在的問題:
- 配置檔案分散在各個專案⾥,微服務例項的數量達到上百個的時候,實在是不方便維護
- 配置內容安全與許可權
- 更新配置後,專案需要重啟,即使不需要重啟也需要運維人員使用curl傳送請求執行更新
新增配置檔案
注意dataId格式
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.結果
5.那如何實現修改配置中心的檔案實現熱載入呢?
只需要在指定位置加上註解@RefreshScope 實現自動更新
@RefreshScope
名稱空間切換環境
建立兩個環境分別為dev和test
將public中的配置檔案clone到dev和test環境
修改dev和test環境配置檔案的內容
配置namespace
namespace: c6ab48bd-2159-450e-aef8-65095e015036 # 指定環境變數的唯一標識
測試一下
配置檔案回滾到某個歷史版本
載入多配置檔案
在dev名稱空間下建立mysql.yml,redis.yml
修改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;
}
}
測試一下:
我們還可以給配置檔案新增group
group: order # 用於區分業務
由於我們nacos配置中心並沒有order這個組,所以啟動報錯了
我們新增一個order組試試
修改兩個order組的配置檔案內容,具體內容大家自行修改就好了,直接測試