目录
3. 微服务组件Feign
这里没有说明的配置,在上一篇《Nacos集群搭建(Windows+Linux)&Ribbon负载均衡》
Feign 概述
Feign是一个伪 Java Http 请求的轻量级客户端框架,它不做任何的请求处理。Feign通过 接口+注解 的方式,生成 Request 模板,从而简化 Http API 的开发,它允许开发人员面向接口编程,而不像Java中通过封装 HTTP 请求报文的方式直接调用。服务消费方拿到服务提供方的接口,然后像调⽤本地接⼝⽅法⼀样去调⽤,实际发出的是远程的请求
在发送 HTTP Request 之前,Feign 会通过处理注解的方式替换掉我们 Request 模板中的参数(就像我们使用 RestTemplate 模板一样),生成真正的Request对象,并交由Java Http 客户端去处理。利用这种方式,开发者只需要关注 Feign 注解模板的开发,而不用关注 Http 请求本身,简化了Http请求的过程,使得请求变得简单很容易理解
Feign
是一个声明式的Web Service
客户端,它的目的就是让Web Service
调用更加简单。Feign
提供了HTTP
请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP
请求的参数、格式、地址等信息
实现过程
- 首先通过 @EnableFeignClients 注解开启 FeignClient 的功能。只有这个注解存在,才会在程序启动时开启对 @FeignClient 注解的包扫描
- 根据 Feign 的规则实现接口,并在接口上面加上 @FeignClient 注解
- 程序启动后,会进行包扫描,扫描所有的 @FeignClient 的注解的类,并将这些信息注入IoC容器中
- 当接口的方法被调用时,通过JDK的代理来生成具体的 RequestTemplate 模板对象
- 根据 RequestTemplate 再生成 Http 请求的 Request 对象
- Request 对象交给 Client 去处理,其中Client的网络请求框架可以是 HttpURLConnection、HttpClient 和 OkHttp
- 最后 Client 被封装到 LoadBalanceClient 类,这个类结合 Ribbon 做到了负载均衡
Spring Cloud Alibaba 整合 OpenFeign
- 在springcloud-api、springcloud-consumer-dept-80模块中添加依赖
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 在springcloud-api模块下创建一个
DeptClientService.class
接口,该接口的所有方法都与springcloud-consumer-dept-80模块中的对应的Controller接口一一对应
/**
* name:指定调用rest接口所对应的服务名
* path:指定调用rest接口所在的Controller指定的@RequestMapping
* value/name:指定提供者的微服务名称
* url:直接指定请求的路径地址
* decode404:是否应该编码或者抛出FeignException异常
* configuration:配置feign.codec.Decoder、feign.codec.Encoder、feign.Contract
* fallback:指定发送异常调用或者超时时应该调用那个类来执行备用方法
* fallbackFactory:提供统一的异常熔断处理,避免重复代码的编写
* path:当服务提供者使用了server.context.path时。
* contextId:用来唯一标识当一个微服务中存在多个FeignClient接口调用同一个服务提供者时的场景(若是不提供该属性值,则在程序启动时会启动失败,并提示相同的feign进行注册(就像相同的bean注册,虽然bean注册时会进行覆盖,但是feign不会覆盖,直接报错)
*/
@FeignClient(name = "springcloud-provider-dept", path = "/dept")
public interface DeptClientService {
//与Mybatis一样,通过动态代理的模式进行调用方法
//声明需要调用的rest接口对应的方法
@GetMapping("/msg")
String getMessage();
}
-
复制模块springcloud-consumer-dept-80,取名为 springcloud-consumer-dept-feign-80
-
修改 springcloud-consumer-dept-feign-80 模块下的
DeptController.class
@RestController
@RequestMapping("/consumer")
@SuppressWarnings("all")
public class DeptController {
//注入我们的feign接口类
@Autowired
private DeptClientService clientService;
@GetMapping("/dept/msg")
public String getMessage(){
return this.clientService.getMessage();
}
}
- 在springcloud-consumer-dept-feign-80 模块的启动类加上注解
@EnableFeignClients(basePackages = "com.vinjcent.springcloud")
@SpringBootApplication
@EnableFeignClients(basePackages = "com.vinjcent.springcloud")
public class SpringCloud_Consumer_Feign_80 {
public static void main(String[] args) {
SpringApplication.run(SpringCloud_Consumer_Feign_80.class,args);
}
}
- 测试
1)启动 springcloud-consumer-dept-feign-80
2)启动 springcloud-provider-dept-8001
3)启动 springcloud-provider-dept-8002
4)启动 springcloud-provider-dept-8003
5)访问 http://localhost/consumer/dept/msg,看结果能不能访问成功
3.1 Feign的自定义配置及使用
Feign 提供了很多的扩展机制,让用户更加灵活的使用
(一)日志配置
有时候遇到Bug,比如接口调用失败、参数接受失败等问题,或者想看看调用的性能,就需要配置Feign的日志
全局配置
1)在模块 springcloud-consumer-dept-feign-80 中定义一个配置类,指定日志级别
注意选择的 Level 是 feign.logger 包下的
- 通过源码可以看到日志等级有4中
- NONE 【性能最佳,适用于生产】:不记录任何日志(默认值)
- BASIC 【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及执行时间
- HEADERS 在BASIC级别的基础上,记录请求和响应的Header
- FULL 【比较适用于开发测试环境定位问题】:记录请求的相应的header、body和元数据
2)在模块springcloud-consumer-dept-feign-80下的application.yml
增加以下字段
# springboot默认的日志级别是info,feign的debug日志级别就不会输入
logging:
level:
# 选择一个包下的feign进行日志输出,如果设置logging.level=true,则会出现所有的日志进行输出
com.vinjcent.springcloud.service: debug
3)测试
- 启动 springcloud-consumer-dept-feign-80
- 访问 http://localhost/consumer/dept/msg,回到控制面板
- 查看
局部配置
-
将 springcloud-consumer-dept-feign-80 模块下的 FeignConfig.class 的
@Configuration
注解注释掉,同时将该模块下的 pom.xml 文件下的springcloud-api
依赖移除 -
在 springcloud-api 模块的
service
包移动到 springcloud-consumer-dept-feign-80 模块下 -
在 springcloud-consumer-dept-feign-80 模块下修改 DeptClientService.class 接口(在注释中添加
configuration
参数)
/**
* name 指定调用rest接口所对应的服务名
* path 指定调用rest接口所在的Controller指定的@RequestMapping
*/
@FeignClient(name = "springcloud-provider-dept",path = "/dept",configuration = FeignConfig.class)
public interface DeptClientService {
//与Mybatis一样,通过动态代理的模式进行调用
//声明需要调用的rest接口对应的方法
@GetMapping("/msg")
String getMessage();
}
- 在主启动类上对
@EnableFeignClients
的注解后面的参数进行删除 - 测试
1)重新启动 springcloud-consumer-dept-feign-80
2)访问 http://localhost/consumer/dept/msg,回到控制面板
3)查看
这里的全局配置和局部配置看起来都一样,但是本质还是有区别的
- 全局配置是对所有的包下接口进行日志输出(这里我没有在 springcloud-api 模块下多写几个 feign 接口,所以效果不明显)
- 局部配置则是对指定接口进行日志输出,在我们移动并且修改
DeptClientService.class
接口时,在注释中添加configuration参数
根据 application.yml 文件进行配置
- 在 springcloud-consumer-dept-feign-80 中修改 DeptClientService.class 接口文件
- 在
application.yml
文件中添加feign日志局部配置
server:
port: 80
spring:
application:
name: springcloud-consumer-dept-feign
# 配置nacos
cloud:
nacos:
# nacos 服务地址
server-addr: 192.168.159.100:7070,192.168.159.100:7080,192.168.159.100:7090
discovery:
username: nacos # nacos用户名
password: nacos
namespace: public # 分隔开发环境和测试环境使用
# 调用的服务提供方
springcloud-provider-dept:
ribbon:
# 复制NacosRule类的引用路径
NFLoadBalancerRuleClassName: com.vincjent.ribbon.MyRibbon
ribbon:
eager-load:
# 开启饥饿加载
enabled: true
# 配置服务名为springcloud-provider-dept使用ribbon饥饿加载,多个服务可以使用","分隔
clients: springcloud-provider-dept
# springboot默认的日志级别是info,feign的debug日志级别就不会输入
logging:
level:
# 选择一个包下的feign进行日志输出,如果设置logging.level=true,则会出现所有的日志进行输出
com.vincjent.springcloud.service: debug
# feign日志局部配置
feign:
client:
config:
# 提供者服务名
springcloud-provider-dept:
loggerLevel: BASIC
- 测试
1)重新启动 springcloud-consumer-dept-feign-80
2)访问 http://localhost/consumer/dept/msg,回到控制面板
3)查看
(二)契约配置
Spring Cloud 在 Feign 的基础上做了扩展,使用 Spring MVC 的注解完成 Feign 的功能。原生的 Feign 不支持 Spring MVC 注解,原生的 Feign 使用原生的注解方式来定义消费者客户端也是可以的,通过配置契约来改变这个配置
方式一(通过配置类注入)
- 在 springcloud-consumer-dept-feign-80 模块下的配置类 FeignConfig 中配置 Feign 的原生类
@Configuration
public class FeignConfig {
@Bean
public Logger.Level feignLogger(){
return Logger.Level.FULL;
}
/**
*修改契约配置,支持Feign原生的注解
*/
@Bean
public Contract feignContract(){
return new Contract.Default();
}
}
【注意】使用了 feign 原生注解之后,接口的调用不再支持 Spring MVC 的注解,需要使用 Feign 的原生注解,不然就会报错
即
@GetMapping("/dept/msg") ===> @RequestLine("GET /dept/msg")
@PathVariable("id") ===> @Param("id")
方式二(application.yml 文件)
在 springcloud-consumer-dept-feign-80 模块下的application.yml
文件添加一下字段
# feign日志局部配置
feign:
client:
config:
# 提供者服务名
springcloud-provider-dept:
loggerLevel: BASIC
contract: feign.Contract.Default #设置为默认的契约,还原原生注解
【注意】修改 Controller 中 Spring MVC 的接口注解
(三)超时时间
方式一(通过配置类注入)
在 springcloud-consumer-dept-feign-80 模块下的配置类 FeignConfig 中配置
@Configuration
public class FeignConfig {
@Bean
public Logger.Level feignLogger(){
return Logger.Level.FULL;
}
/**
*超时时间配置
*/
@Bean
public Request.Options options(){
return new Request.Options(5000,10000);
}
}
方式二(application.yml 配置文件)
# feign日志局部配置
feign:
client:
config:
# 提供者服务名
springcloud-provider-dept:
loggerLevel: BASIC
contract: feign.Contract.Default #设置为默认的契约,还原原生注解
# 连接超时时间,默认2s A =请求=> B
connectTimeout: 5000
# 请求处理超时时间,默认5s
readTimeout: 3000
(四)Feign自定义拦截器
方式一(通过配置类注入)
- 在 springcloud-consumer-dept-feign-80 模块下编写一个 FeignInterceptor 类实现接口 RequestInterceptor
public class FeignInterceptor implements RequestInterceptor {
//记录当前类的信息
Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public void apply(RequestTemplate requestTemplate) {
// TODO
requestTemplate...
logger.info("自定义Feign拦截器");
}
}
- 在配置类中注入我们自定义的拦截器类
@Configuration
public class FeignConfig {
@Bean
public Logger.Level feignLogger(){
return Logger.Level.FULL;
}
@Bean
public Request.Options options(){
return new Request.Options(5000,10000);
}
/**
* 自定义拦截器
*/
@Bean
public FeignInterceptor feignInterceptor(){
return new FeignInterceptor();
}
}
方式二(application.yml 配置文件)
# feign日志局部配置
feign:
client:
config:
# 提供者服务名
springcloud-provider-dept:
loggerLevel: BASIC
contract: feign.Contract.Default #设置为默认的契约,还原原生注解
# 连接超时时间,默认2s A =请求=> B
connectTimeout: 5000
# 请求处理超时时间,默认5s
readTimeout: 3000
requestInterceptors[0]:
com.vincjent.springcloud.interceptor.FeignInterceptor # 自定义拦截器的完整类路径
4. Nacos配置中心使用
官方文档:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config
Nacos 提供用于存储配置和其它元数据的 key/value 存储,为分布式系统中的外部配置提供服务器端和客户端的支持。使用 SpringCloud Alibaba Nacos Config,可以在Nacos Server 集中管理 Spring Cloud 应用的外部属性配置
- 维护性
- 时效性
- 安全性
springcloud config 对比
三大优势:
- springcloud config 大部分场景结合 git 使用,动态变更还需要Spring Cloud Bus 消息总线来通过所有的客户端变化
- springcloud config 不提供可视化界面
- nacos config 使用长轮询更新配置,一旦配置有变动后,通知 Provider 的过程非常的迅速,从速度上秒杀 springcloud 原来的 config 几条街
对比项目/配置中心 | springcloud config | apollo | nacos |
---|---|---|---|
开源时间 | 2014.9 | 2016.5 | 2018.6 |
配置实时推送 | 支持(Spring Cloud Bus) | 支持(Http 长轮询1s内) | 支持(Http 长轮询1s内) |
版本管理 | 支持(Git) | 自动管理 | 自动管理 |
配置回滚 | 支持(Git) | 支持 | 支持 |
灰度发布 | 支持 | 支持 | 待支持 |
权限管理 | 支持 | 支持 | 待支持 |
多集群多环境 | 支持 | 支持 | 支持 |
监听查询 | 支持 | 支持 | 支持 |
多语言 | 只支持Java | Go,C++,Python,Java,net,OpenAPI | Python,Java,Nodejs,OpenAPI |
分布式高可用 | Config-Server*2 + Git + MQ | Config2 + Admin3 + Portal*2 + MySQL =8 | Nacos*3 + MySQL = 4 |
配置格式校验 | 不支持 | 支持 | 支持 |
通信协议 | HTTP 和 AMQP | HTTP | HTTP |
数据一致性 | Git 保证数据一致性,Config-Server从 Git 读取数据 | 数据库模拟消息队列,Apollo定时读消息 | HTTP异步通知 |
单机读(tps) | 7(限流所制) | 9000 | 15000 |
单机写(tps) | 5(限流所制) | 1100 | 1800 |
3节点读 | 21(限流所制) | 27000 | 45000 |
3节点写 | 5(限流所制) | 3300 | 5600 |
- Namespace:代表不同环境,如开发、测试、生产。用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离
- Group:代表项目,如XX销售项目、医疗项目。Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP
- DataId:每个项目下往往有若干个模块,每个配置集(DataId)是一个模块的主配置文件。Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制
要使 Nacos 服务与发现中的权限管理生效,需要在application.properties修改内容
- 启动权限:修改
application.properties
4.1 Nacos权限管理(在 profile 中推荐使用)
登录 vinjcent (自己创建的用户信息)用户
因为给该角色的用户设置只读,所以在 Nacos 服务中心很多功能无法实现
【注】需要在Nacos配置文件application.properties
中设置了
nacos.core.auth.enabled=true
权限管理才会生效
配置官网:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config
4.2 在服务中心配置Nacos文件
-
新建一个 springcloud-provider-dept-config-nacos-8004 模块
-
导入依赖
<dependencies>
<!--Nacos Config依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
- 编写配置文件
application.yml
,bootstrap.yml
- application.yml
server:
port: 8004
- bootstrap.yml
spring:
application:
# 会自动根据服务名获取DataId对应的配置文件 如果DataId跟服务名不一致 就需要手动指定DataId
name: com.vinjcent.provider
cloud:
nacos:
# 配置Nacos服务地址
server-addr: 192.168.159.100:7070
config:
namespace: public
- 在 Linux 中启动一个 nacos 服务集群
访问http://192.168.159.100:7070/nacos/index.html#/
- 设置启动类,并运行
@SpringBootApplication
public class Springcloud_Config_Nacos_8004 {
public static void main(String[] args) throws InterruptedException {
ConfigurableApplicationContext applicationContext = SpringApplication.run(Springcloud_Config_Nacos_8004.class, args);
while (true) {
String userName = applicationContext.getEnvironment().getProperty("user.username");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.err.println("user name :" + userName + "; age: " + userAge);
//动态实时监听
TimeUnit.SECONDS.sleep(1);
}
// nacos 客户端 每10ms去注册中心进行判断,根据MD5判断客户端与注册中心是否一致
}
}
- 修改
bootstrap.yml
spring:
application:
# 会自动根据服务名获取DataId对应的配置文件 如果DataId跟服务名不一致 就需要手动指定DataId
name: com.vinjcent.provider
cloud:
nacos:
# 配置Nacos服务地址
server-addr: 192.168.159.100:7070
username: nacos
password: nacos
# 解决控制台循环打印ClientWorker日志
# config:
# namespace: public
重新启动
扩展配置
1)支持自定义 namespace 的配置
概念
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等
在没有明确指定 ${spring.cloud.nacos.config.namespace}
配置的情况下, 默认使用的是 Nacos 上 Public 这个namespase
【注】该配置必须放在 bootstrap.properties
文件中。此外 spring.cloud.nacos.config.namespace
的值是 namespace 对应的 id,id 值可以在 Nacos 的控制台获取。并且在添加配置时注意不要选择其他的 namespase,否则将会导致读取不到正确的配置
2)可支持profile粒度的配置 (不建议使用)
spring-cloud-starter-alibaba-nacos-config 在加载配置的时候,不仅仅加载了以 dataid 为 ${spring.application.name}.${file-extension:properties}
为前缀的基础配置,还加载了dataid为 ${spring.application.name}-${profile}.${file-extension:properties}
的基础配置。在日常开发中如果遇到多套环境下的不同配置,可以通过Spring 提供的 ${spring.profiles.active}
这个配置项来配置
spring.profiles.active=develop
【注】${spring.profiles.active}
当通过配置文件来指定时必须放在 bootstrap.properties
文件中
3)支持自定义 Group 的配置
在没有明确指定 ${spring.cloud.nacos.config.group}
配置的情况下, 默认使用的是 DEFAULT_GROUP 。如果需要自定义自己的 Group,可以通过以下配置来实现
spring.cloud.nacos.config.group=DEVELOP_GROUP
【注】该配置必须放在 bootstrap.properties
文件中。并且在添加配置时 Group 的值一定要和 spring.cloud.nacos.config.group
的配置值一致
4)支持自定义扩展的 Data Id 配置
Spring Cloud Alibaba Nacos Config 从 0.2.1 版本后,可支持自定义 Data Id 的配置
spring.application.name=opensource-service-provider
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# config external configuration
# 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新
spring.cloud.nacos.config.extension-configs[0].data-id=ext-config-common01.properties
# 2、Data Id 不在默认的组,不支持动态刷新
spring.cloud.nacos.config.extension-configs[1].data-id=ext-config-common02.properties
spring.cloud.nacos.config.extension-configs[1].group=GLOBALE_GROUP
# 3、Data Id 既不在默认的组,也支持动态刷新
spring.cloud.nacos.config.extension-configs[2].data-id=ext-config-common03.properties
spring.cloud.nacos.config.extension-configs[2].group=REFRESH_GROUP
spring.cloud.nacos.config.extension-configs[2].refresh=true
- 通过
spring.cloud.nacos.config.extension-configs[n].data-id
的配置方式来支持多个 Data Id 的配置 - 通过
spring.cloud.nacos.config.extension-configs[n].group
的配置方式自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP - 通过
spring.cloud.nacos.config.extension-configs[n].refresh
的配置方式来控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的
【注】
多个 Data Id 同时配置时,他的优先级关系是 spring.cloud.nacos.config.extension-configs[n].data-id
其中 n 的值越大,优先级越高
spring.cloud.nacos.config.extension-configs[n].data-id
的值必须带文件扩展名,文件扩展名既可支持 properties
,又可以支持 yaml/yml
。 此时 spring.cloud.nacos.config.file-extension
的配置对自定义扩展配置的 Data Id 文件扩展名没有影响
通过自定义扩展的 Data Id 配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件
为了更加清晰的在多个应用间配置共享的 Data Id ,你可以通过以下的方式来配置:
# 配置支持共享的 Data Id
spring.cloud.nacos.config.shared-configs[0].data-id=common.yaml
# 配置 Data Id 所在分组,缺省默认 DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[0].group=GROUP_APP1
# 配置Data Id 在配置变更时,是否动态刷新,缺省默认 false
spring.cloud.nacos.config.shared-configs[0].refresh=true
- 通过
spring.cloud.nacos.config.shared-configs[n].data-id
来支持多个共享 Data Id 的配置 - 通过
spring.cloud.nacos.config.shared-configs[n].group
来配置自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP - 通过
spring.cloud.nacos.config.shared-configs[n].refresh
来控制该Data Id在配置变更时,是否支持应用中动态刷新,默认false
5)配置的优先级
Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置
- A: 通过
spring.cloud.nacos.config.shared-configs[n].data-id
支持多个共享 Data Id 的配置 - B: 通过
spring.cloud.nacos.config.extension-configs[n].data-id
的方式支持多个扩展 Data Id 的配置 - C: 通过内部相关规则(应用名、应用名+ Profile )自动生成相关的 Data Id 配置
当三种方式共同使用时,他们的一个优先级关系是:A < B < C
- application.yml
server:
port: 8004
spring:
profiles:
active: dev
# 在配置中心,可以通过profile进行设置
# 只有默认的配置文件才能结合profile进行使用
# 对应的 DataId:${spring.application.name}-${profile}.${file-extension:properties}
# profile的后缀必须跟随默认配置文件的格式来
- bootstrap.yml
spring:
application:
# 会自动根据服务名获取DataId对应的配置文件 如果DataId跟服务名不一致 就需要手动指定DataId
# 跟服务名相同的DataId的配置文件,称之为默认的配置文件
# 除了默认的配置文件,其它配置文件必须写上后缀
name: com.vinjcent.provider
cloud:
nacos:
# 配置Nacos服务地址
server-addr: 192.168.159.100:7070
username: nacos
password: nacos
# 配置Nacos配置中心
config:
# 关闭动态刷新,客户端将无法感知配置的变化 (一般不需要配置)
#refresh-enabled: false
# 支持自定义 namespace 的配置,默认是public (根据Nacos配置中心中的命名空间ID修改)
namespace: dd3358a9-058e-47d7-8470-7decd2b0c639
# Nacos客户端 默认是properties的文件扩展名,只针对默认配置文件和profile
file-extension: yaml
# 默认是DEFAULT_GROUP
# group: DEFAULT_GROUP
# 共享配置
shared-configs:
- dataId: com.vinjcent.provider.properties # 下标[0]
refresh: true
# 默认为group: DEFAULT_GROUP
- dataId: com.vinjcent.provider02.properties # 下标[1]
refresh: true
# 单个模块拓展配置
extension-configs[0]:
dataId: com.vinjcent.provider03.properties
refresh: true
# 配置文件的优先级 (优先级大的会覆盖优先级小的,并且会形成互补)
# profile > 配置文件 > extension-configs(相同情况下,下标越大,优先级越大) >shared-configs (相同情况下,下标越大,优先级越大)
- public环境
- dev环境
6)Nacos-config-@RefreshScope
- 导入 web 依赖
<dependencies>
<!--Nacos Config依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
- 在模块 springcloud-provider-dept-config-nacos-8004 编写一个 DeptController.class
@RestController
@RequestMapping("/dept")
public class DeptController {
@Value("${user.username}")
private String username;
@RequestMapping("/show")
public String show() {
return username;
}
}
-
启动主启动类
-
访问 http://localhost:8004/dept/show
-
修改Nacos配置中心对应的文件属性字段
user.username
可以看到服务并没有实现配置和实例刷新的
- 在 DeptController.class 加上注解
@RefreshScope
@RestController
@RequestMapping("/dept")
@RefreshScope
public class DeptController {
@Value("${user.username}")
private String username;
@RequestMapping("/show")
public String show() {
return username;
}
}
- 重新启动 springcloud-provider-dept-config-nacos-8004,再次访问http://localhost:8004/dept/show
下一篇文章《微服务分布式组件—Sentinel》