??視頻地址:微服務(SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式)?
?Nacos配置管理-Nacos實現配置管理(P24、P25)
Nacos除了可以做注冊中心,同樣可以做配置管理來使用。
當微服務部署的實例越來越多,達到數十、數百時,逐個修改微服務配置就會讓人抓狂,而且很容易出錯。我們需要一種統一配置管理方案,可以集中管理所有實例的配置。
Nacos一方面可以將配置集中管理,另一方可以在配置變更時,及時通知微服務,實現配置的熱更新。
如何在nacos中管理配置呢?
然后在彈出的表單中,填寫配置信息:
注意:項目的核心配置,需要熱更新的配置才有放到nacos管理的必要。基本不會變更的一些配置還是保存在微服務本地比較好。
?Nacos配置管理-微服務配置拉取(P26)
獲取配置文件(單yml文件)步驟如下:
微服務要拉取nacos中管理的配置,并且與本地的application.yml配置合并,才能完成項目啟動。
但如果尚未讀取application.yml,又如何得知nacos地址呢?
因此spring引入了一種新的配置文件:bootstrap.yaml文件,會在application.yml之前被讀取,流程如下:
1)引入nacos-config依賴
首先,在user-service服務中,引入nacos-config的客戶端依賴:
<!--nacos配置管理依賴-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2)添加bootstrap.yaml
然后,在user-service中添加一個bootstrap.yaml文件,內容如下:
spring:application:name: userservice # 服務名稱profiles:active: dev #開發環境,這里是dev cloud:nacos:server-addr: localhost:8848 # Nacos地址config:file-extension: yaml # 文件后綴名
這里會根據spring.cloud.nacos.server-addr獲取nacos地址,再根據
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
作為文件id,來讀取配置。
本例中,就是去讀取userservice-dev.yaml
:
3)讀取nacos配置
在user-service中的UserController中添加業務邏輯,讀取pattern.dateformat配置:
完整代碼:
package cn.itcast.user.web;
?
import cn.itcast.user.pojo.User;
import cn.itcast.user.service.UserService;
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.*;
?
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
?
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
?@Autowiredprivate UserService userService;
?@Value("${pattern.dateformat}")private String dateformat;@GetMapping("now")public String now(){return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));}// ...略
}
在頁面訪問,可以看到效果:
?總結:
?Nacos配置管理-配置熱更新(P27)
我們最終的目的,是修改nacos中的配置后,微服務中無需重啟即可讓配置生效,也就是配置熱更新。
要實現配置熱更新,可以使用兩種方式:
方式一
在@Value注入的變量所在類上添加注解@RefreshScope:
方式二
使用@ConfigurationProperties注解代替@Value注解。
在user-service服務中,添加一個類,讀取patterrn.dateformat屬性:
package cn.itcast.user.config;
?
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
?
@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {private String dateformat;
}
在UserController中使用這個類代替@Value:
完整代碼:
package cn.itcast.user.web;
?
import cn.itcast.user.config.PatternProperties;
import cn.itcast.user.pojo.User;
import cn.itcast.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
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.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
?
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
?@Autowiredprivate UserService userService;
?@Autowiredprivate PatternProperties patternProperties;
?@GetMapping("now")public String now(){return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));}
?// 略
}
總結:?
?Nacos配置管理-多環境配置共享(P28)
其實微服務啟動時,會去nacos讀取多個配置文件,例如:
-
[spring.application.name]-[spring.profiles.active].yaml
,例如:userservice-dev.yaml -
[spring.application.name].yaml
,例如:userservice.yaml
而[spring.application.name].yaml
不包含環境,因此可以被多個環境共享。
下面我們通過案例來測試配置共享
1)添加一個環境共享配置
我們在nacos中添加一個userservice.yaml文件:
2)在user-service中讀取共享配置
在user-service服務中,修改PatternProperties類,讀取新添加的屬性:
在user-service服務中,修改UserController,添加一個方法:
3)運行兩個UserApplication,使用不同的profile
修改UserApplication2這個啟動項,改變其profile值:
?
這樣,UserApplication(8081)使用的profile是dev,UserApplication2(8082)使用的profile是test。
啟動UserApplication和UserApplication2
訪問http://localhost:8081/user/prop,結果:
訪問http://localhost:8082/user/prop,結果:
可以看出來,不管是dev,還是test環境,都讀取到了envSharedValue這個屬性的值。
4)配置共享的優先級
當nacos、服務本地同時出現相同屬性時,優先級有高低之分:
總結:
?Nacos配置管理-Nacos集群搭建(P29)
?鏈接:nacos集群搭建