SpringCloudConfig 的作用是可以进行配置的更新处理,这个的确是很好,但是原始的SpringCloudNetflix 架构所提供的动态的抓取配置实在是太繁琐了,包括还要使用到SpringCloudBus进行Actuator处理
SpringCloudAlibaba套件之中是基于Nacos 实现的服务管理,Nacos里面有一个动态的监听配置,只要你在Nacos之中定义了配置项,那么就可以在程序里面动态抓取(不再需要config-server,不再需要springcloudbus)。
1.1、【microcloud项目】创建“provider-message-8201”模块
build.gradle
project(":provider-message-8201") { // 消息微服务
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
implementation(libraries.'spring-boot-admin-starter-client')
// 以下的依赖库为Nacos注册中心所需要的依赖配置
implementation('com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery') {
exclude group: 'com.alibaba.nacos', module: 'nacos-client' // 移除旧版本的Nacos依赖
}
implementation('com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config') {
exclude group: 'com.alibaba.nacos', module: 'nacos-client' // 移除旧版本的Nacos依赖
}
implementation(libraries.'nacos-client') // 引入与当前的Nacos匹配的依赖库
}
}
1.2、【provider-message-8201】配置文件
application.yml
server: # 服务端配置
port: 8201 # 8201端口
spring:
application: # 配置应用信息
name: message.provider # 是微服务的名称
cloud: # Cloud配置
nacos: # Nacos注册中心配置
discovery: # 发现服务
weight: 80
service: ${spring.application.name} # 使用微服务的名称作为注册的服务名称
server-addr: nacos-server:8848 # Nacos服务地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanCluster # 配置集群名称
metadata: # 根据自身的需要配置元数据
version: 1.0 # 自定义元数据项
register-enabled: true
bootstrap.yml
spring: # Spring配置项
application:
name: message.provider # 应用名称
cloud: # SpringCloud配置项
nacos: # Nacos注册中心的配置
config: # gRPC通讯配置
server-addr: nacos-server:8848 # Nacos地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanCluster # 配置集群名称
discovery: # 发现服务
weight: 80
service: ${spring.application.name} # 使用微服务的名称作为注册的服务名称
server-addr: nacos-server:8848 # Nacos服务地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanCluster # 配置集群名称
metadata: # 根据自身的需要配置元数据
version: 1.0 # 自定义元数据项
1.3、【provider-message-8201】MessageAction
package com.yootk.provider.action;
import com.yootk.provider.vo.MessageConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/provider/message/*")
public class MessageAction {
@Autowired
private MessageConfig messageConfig;
@RequestMapping("config")
public Object config() {
Map<String, Object> result = new HashMap<>();
result.put("flag", this.messageConfig.getFlag());
result.put("content", this.messageConfig.getContent());
return result;
}
}
1.4、【provider-message-8201】MessageConfig
package com.yootk.provider.vo;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
@Data
@Component // 必须添加为Bean
@RefreshScope // 动态加载
public class MessageConfig {
@Value("${yootk.message.flag}") // 配置文件的加载KEY
private String flag;
@Value("${yootk.message.content}") // 配置文件的加载KEY
private String content;
}
1.5、【provider-message-8201】StartMessageApplication
package com.yootk.provider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class StartMessageApplication {
public static void main(String[] args) {
SpringApplication.run(StartMessageApplication.class, args);
}
}
2、【Nacos控制台】既然现在不再通过GITLab存储了,那么就可以将所有的存储项保存在Nacos里面
message.provider-dev.yml
yootk:
message:
flag: dev
content: yootk111
message.provider-test.yml
yootk:
message:
flag: test
content: yootk222
message.provider-prod.yml
yootk:
message:
flag: prod
content: yootk333
3、【provider-message-8201子模块】修改bootstrap.yml配置文件:
spring.cloud.nacos.config.file-extension
speing.peofiles.active
spring: # Spring配置项
application:
name: message.provider # 应用名称
profiles:
active: dev # 使用的profile配置项
cloud: # SpringCloud配置项
nacos: # Nacos注册中心的配置
config: # gRPC通讯配置
server-addr: nacos-server:8848 # Nacos地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanCluster # 配置集群名称
file-extension: yml # 配置文件类型
discovery: # 发现服务
weight: 80
service: ${spring.application.name} # 使用微服务的名称作为注册的服务名称
server-addr: nacos-server:8848 # Nacos服务地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanCluster # 配置集群名称
metadata: # 根据自身的需要配置元数据
version: 1.0 # 自定义元数据项
程序启动日志
此时通过日志信息可以发现,指定的配置项已经开启了订阅,那么就意味着只要修改了Nacos里面的配置项的内容,当前的消息服务就可以获取到最新的配置了。
当Nacos里面成功的修改了配置项的内容之后,对应的微服务的后台会有日志信息的输出:
Refresh keys changed: [yootk.message.content]
这个时候不再需要繁琐的ConfigServer加载,也不再需要各种的Actuator处理操作,更不需要使用到消息组件,而整个的配置可以通过可视化的环境进行方便的维护,所以技术不能够停止更新,哪怕现在技术已经跑通了,也不要停止思考。