SpringCloud Alibaba【微服务组件Feign&Nacos配置中心使用】

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

  1. springcloud-apispringcloud-consumer-dept-80模块中添加依赖
        <!--openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
  1. 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();

}
  1. 复制模块springcloud-consumer-dept-80,取名为 springcloud-consumer-dept-feign-80

  2. 修改 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();
    }

}
  1. 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. 测试

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)测试

  1. 启动 springcloud-consumer-dept-feign-80
  2. 访问 http://localhost/consumer/dept/msg,回到控制面板
  3. 查看

在这里插入图片描述

局部配置

  1. springcloud-consumer-dept-feign-80 模块下的 FeignConfig.class@Configuration注解注释掉,同时将该模块下的 pom.xml 文件下的springcloud-api依赖移除

  2. springcloud-api 模块的service包移动到 springcloud-consumer-dept-feign-80 模块下

  3. 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();

}
  1. 在主启动类上对@EnableFeignClients的注解后面的参数进行删除
  2. 测试

1)重新启动 springcloud-consumer-dept-feign-80

2)访问 http://localhost/consumer/dept/msg,回到控制面板

3)查看

在这里插入图片描述

这里的全局配置和局部配置看起来都一样,但是本质还是有区别的

  • 全局配置是对所有的包下接口进行日志输出(这里我没有在 springcloud-api 模块下多写几个 feign 接口,所以效果不明显)
  • 局部配置则是对指定接口进行日志输出,在我们移动并且修改DeptClientService.class接口时,在注释中添加configuration参数

根据 application.yml 文件进行配置

  1. springcloud-consumer-dept-feign-80 中修改 DeptClientService.class 接口文件

在这里插入图片描述

  1. 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. 测试

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自定义拦截器

在这里插入图片描述

方式一(通过配置类注入)

  1. 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拦截器");
    }
}
  1. 在配置类中注入我们自定义的拦截器类
@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 应用的外部属性配置

  1. 维护性
  2. 时效性
  3. 安全性

在这里插入图片描述

springcloud config 对比

三大优势:

  • springcloud config 大部分场景结合 git 使用,动态变更还需要Spring Cloud Bus 消息总线来通过所有的客户端变化
  • springcloud config 不提供可视化界面
  • nacos config 使用长轮询更新配置,一旦配置有变动后,通知 Provider 的过程非常的迅速,从速度上秒杀 springcloud 原来的 config 几条街
对比项目/配置中心springcloud configapollonacos
开源时间2014.92016.52018.6
配置实时推送支持(Spring Cloud Bus)支持(Http 长轮询1s内)支持(Http 长轮询1s内)
版本管理支持(Git)自动管理自动管理
配置回滚支持(Git)支持支持
灰度发布支持支持待支持
权限管理支持支持待支持
多集群多环境支持支持支持
监听查询支持支持支持
多语言只支持JavaGo,C++,Python,Java,net,OpenAPIPython,Java,Nodejs,OpenAPI
分布式高可用Config-Server*2 + Git + MQConfig2 + Admin3 + Portal*2 + MySQL =8Nacos*3 + MySQL = 4
配置格式校验不支持支持支持
通信协议HTTP 和 AMQPHTTPHTTP
数据一致性Git 保证数据一致性,Config-Server从 Git 读取数据数据库模拟消息队列,Apollo定时读消息HTTP异步通知
单机读(tps)7(限流所制)900015000
单机写(tps)5(限流所制)11001800
3节点读21(限流所制)2700045000
3节点写5(限流所制)33005600

在这里插入图片描述

  • 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文件

  1. 新建一个 springcloud-provider-dept-config-nacos-8004 模块

  2. 导入依赖

<dependencies>
    <!--Nacos Config依赖-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
</dependencies>
  1. 编写配置文件application.ymlbootstrap.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
  1. 在 Linux 中启动一个 nacos 服务集群

访问http://192.168.159.100:7070/nacos/index.html#/

在这里插入图片描述

在这里插入图片描述

  1. 设置启动类,并运行
@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
  1. 导入 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>
  1. 在模块 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;
    }

}
  1. 启动主启动类

  2. 访问 http://localhost:8004/dept/show

在这里插入图片描述

在这里插入图片描述

可以看到服务并没有实现配置和实例刷新的

  1. DeptController.class 加上注解@RefreshScope
@RestController
@RequestMapping("/dept")
@RefreshScope
public class DeptController {

    @Value("${user.username}")
    private String username;

    @RequestMapping("/show")
    public String show() {
        return username;
    }

}
  1. 重新启动 springcloud-provider-dept-config-nacos-8004,再次访问http://localhost:8004/dept/show

在这里插入图片描述

下一篇文章微服务分布式组件—Sentinel

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naijia_OvO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值