• 微服务之SpringCloud AlibabaNacos服务注册和配置中心


    一、概述

    1.1注册中心原理

    在微服务远程调用的过程中,包括两个角色:

    • 服务提供者:提供接口供其它微服务访问,比如item-service

    • 服务消费者:调用其它微服务提供的接口,比如cart-service

    在大型微服务项目中,服务提供者的数量会非常多,为了管理这些服务就引入了注册中心的概念。注册中心、服务提供者、服务消费者三者间关系如下:

    流程如下:

    • 服务启动时就会注册自己的服务信息(服务名、IP、端口)到注册中心

    • 调用者可以从注册中心订阅想要的服务,获取服务对应的实例列表(1个服务可能多实例部署)

    • 调用者自己对实例列表负载均衡,挑选一个实例

    • 调用者向该实例发起远程调用

    当服务提供者的实例宕机或者启动新实例时,调用者如何得知呢?

    • 服务提供者会定期向注册中心发送请求,报告自己的健康状态(心跳请求)

    • 当注册中心长时间收不到提供者的心跳时,会认为该实例宕机,将其从服务的实例列表中剔除

    • 当服务有新实例启动时,会发送注册服务请求,其信息会被记录在注册中心的服务实例列表

    • 当注册中心服务列表变更时,会主动通知微服务,更新本地服务列表

    1.2Nacos注册中心

    一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

    • 做服务注册中心
    • 做服务配置中心和满足动态刷新广播通知

    官网https://nacos.io/

    1.3Nacos安装

    参考使用Docker-ompose快速构建Nacos服务

    首推官方

    docker run --name nacos-quick -e MODE=standalone -e JVM_XMS=256m -e JVM_XMX=256m -p 8848:8848 -p 9848:9848 -p 9849:9849 -p7848:7848  -d nacos/nacos-server:v2.2.3
    

    二、实战

    2.1 Nacos的服务提供者

    cloudalibaba-provider-payment9001
    pom.xml

    1. "1.0" encoding="UTF-8"?>
    2. "http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. 4.0.0
    6. com.atguigu.cloud
    7. mscloudV5
    8. 1.0-SNAPSHOT
    9. cloudalibaba-provider-payment9001
    10. 17
    11. 17
    12. UTF-8
    13. com.alibaba.cloud
    14. spring-cloud-starter-alibaba-nacos-discovery
    15. com.atguigu.cloud
    16. cloud-api-commons
    17. 1.0-SNAPSHOT
    18. org.springframework.boot
    19. spring-boot-starter-web
    20. org.springframework.boot
    21. spring-boot-starter-actuator
    22. cn.hutool
    23. hutool-all
    24. org.projectlombok
    25. lombok
    26. 1.18.28
    27. provided
    28. org.springframework.boot
    29. spring-boot-starter-test
    30. test
    31. org.springframework.boot
    32. spring-boot-maven-plugin

    yml配置

    1. server:
    2. port: 9001
    3. spring:
    4. application:
    5. name: nacos-payment-provider
    6. cloud:
    7. nacos:
    8. discovery:
    9. server-addr: localhost:8848 #配置Nacos地址

    主程序

    1. @SpringBootApplication
    2. @EnableDiscoveryClient
    3. public class Main9001
    4. {
    5. public static void main(String[] args)
    6. {
    7. SpringApplication.run(Main9001.class,args);
    8. }
    9. }

    业务类

    1. @RestController
    2. public class PayAlibabaController
    3. {
    4. @Value("${server.port}")
    5. private String serverPort;
    6. @GetMapping(value = "/pay/nacos/{id}")
    7. public String getPayInfo(@PathVariable("id") Integer id)
    8. {
    9. return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
    10. }
    11. }

    2.2基于Nacos的服务消费者

    配置项

    1. server:
    2. port: 83
    3. spring:
    4. application:
    5. name: nacos-order-consumer
    6. cloud:
    7. nacos:
    8. discovery:
    9. server-addr: localhost:8848
    10. #消费者将要去访问的微服务名称(nacos微服务提供者叫什么你写什么)
    11. service-url:
    12. nacos-user-service: http://nacos-payment-provider

    配置类

    1. @Configuration
    2. public class RestTemplateConfig
    3. {
    4. @Bean
    5. @LoadBalanced //赋予RestTemplate负载均衡的能力
    6. public RestTemplate restTemplate()
    7. {
    8. return new RestTemplate();
    9. }
    10. }

    控制类

    1. @RestController
    2. public class OrderNacosController
    3. {
    4. @Resource
    5. private RestTemplate restTemplate;
    6. @Value("${service-url.nacos-user-service}")
    7. private String serverURL;
    8. @GetMapping("/consumer/pay/nacos/{id}")
    9. public String paymentInfo(@PathVariable("id") Integer id)
    10. {
    11. String result = restTemplate.getForObject(serverURL + "/pay/nacos/" + id, String.class);
    12. return result+"\t"+" 我是OrderNacosController83调用者。。。。。。";
    13. }
    14. }

    2.3Nacos Config服务配置中心

    pom

    1. "1.0" encoding="UTF-8"?>
    2. "http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. mscloudV3
    6. com.atguigu.cloud
    7. 1.0-SNAPSHOT
    8. 4.0.0
    9. cloudalibaba-config-nacos-client3377
    10. 17
    11. 17
    12. org.springframework.cloud
    13. spring-cloud-starter-bootstrap
    14. com.alibaba.cloud
    15. spring-cloud-starter-alibaba-nacos-config
    16. com.alibaba.cloud
    17. spring-cloud-starter-alibaba-nacos-discovery
    18. org.springframework.boot
    19. spring-boot-starter-web
    20. org.springframework.boot
    21. spring-boot-starter-actuator
    22. org.projectlombok
    23. lombok
    24. true
    25. org.springframework.boot
    26. spring-boot-maven-plugin

    Nacos同Consul一样,在项目初始化时,要保证先从配置中心进行配置拉取,

    拉取配置之后,才能保证项目的正常启动,为了满足动态刷新和全局广播通知

     

    springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application

    1. # nacos配置
    2. spring:
    3. application:
    4. name: nacos-config-client
    5. cloud:
    6. nacos:
    7. discovery:
    8. server-addr: localhost:8848 #Nacos服务注册中心地址
    9. config:
    10. server-addr: localhost:8848 #Nacos作为配置中心地址
    11. file-extension: yaml #指定yaml格式的配置
    12. # nacos端配置文件DataId的命名规则是:
    13. # ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
    14. # 本案例的DataID是:nacos-config-client-dev.yaml
    1. server:
    2. port: 3377
    3. spring:
    4. profiles:
    5. active: dev # 表示开发环境
    6. #active: prod # 表示生产环境
    7. #active: test # 表示测试环境

    控制类

    1. @RestController
    2. @RefreshScope //在控制器类加入@RefreshScope注解使当前类下的配置支持Nacos的动态刷新功能。
    3. public class NacosConfigClientController
    4. {
    5. @Value("${config.info}")
    6. private String configInfo;
    7. @GetMapping("/config/info")
    8. public String getConfigInfo() {
    9. return configInfo;
    10. }
    11. }

    @RefreshScope

    @RefreshScope 是一个用于 Spring Cloud Config 的注解,它允许在不重启应用程序的情况下重新加载配置信息。当配置中心的配置信息发生变化时,使用 @RefreshScope 注解的类会自动刷新配置信息,使得应用程序能够实时获取到最新的配置信息。

    使用 @RefreshScope 注解的方法如下:

    1. 在需要刷新配置信息的类上添加 @RefreshScope 注解。
    2. 使用 @Value 或 @ConfigurationProperties 注解来注入配置信息。
    3. 调用 /actuator/refresh 端点(需要在项目中引入 Spring Boot Actuator)来触发配置刷新。

    在Nacos中添加配置信息(重点)

    Nacos中的dataid的组成格式及与SpringBooti配置文件中的匹配规则


     Nacos会记录配置文件的历史版本默认保留30天,此外还有一键回滚功能,回滚操作将会触发配置更新

    2.4Nacos数据模型之Namespace-Group-Datald

    背景

    问题1:

    实际开发中,通常一个系统会准备

    dev开发环境

    test测试环境

    prod生产环境。

    如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?

     

    问题2:

    一个大型分布式微服务系统会有很多微服务子项目,

    每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境......

    那怎么对这些微服务配置进行分组和命名空间管理呢?

    1 是什么
    类似Java里面的package名和类名,最外层的Namespace是可以用于区分部署环境的,
    Group和DataID逻辑上区分两个目标对象
    2 默认值
    默认情况:Namespace=public,Group=DEFAULT_GROUP
    Nacos默认的命名空间是public,Namespace主要用来实现隔离。比方说我们现在有三个环境
    :开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间
    是隔离的。Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分
    到同一个分组里面去
    Service就是微服务
    一个Service可以包含一个或者多个Cluster(集群),Nacos默认Cluster是DEFAULT,
    Cluster是对指定微服务的一个虚拟划分。见下一节:服务领域模型-补充说明

    DatalD方案

    指定spring.profile..active和配置文件的DatalD来使不同环境下读取不同的配置
     

    1. # nacos配置 第一种:默认空间+默认分组+新建DataID
    2. spring:
    3. application:
    4. name: nacos-config-client
    5. cloud:
    6. nacos:
    7. discovery:
    8. server-addr: localhost:8848 #Nacos服务注册中心地址
    9. config:
    10. server-addr: localhost:8848 #Nacos作为配置中心地址
    11. file-extension: yaml #指定yaml格式的配置
    12. # nacos端配置文件DataId的命名规则是:
    13. # ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
    14. # 本案例的DataID是:nacos-config-client-dev.yaml
    1. server:
    2. port: 3377
    3. spring:
    4. profiles:
    5. #active: dev # 表示开发环境
    6. active: test # 表示测试环境
    7. #active: prod # 表示生产环境

    Group方案

    默认空间public+新建PROD GROUP+新建DatalD

    Namespace方案

    三、快速入门

    服务注册到nacos

    1.引入依赖

    在父工程的pom文件中的中引入SpringCloudAlibaba的依赖:

    1. com.alibaba.cloud
    2. spring-cloud-alibaba-dependencies
    3. 2.2.6.RELEASE
    4. <type>pom
    5. import

    然后在user-service和order-service中的pom文件中引入nacos-discovery依赖:

    1. com.alibaba.cloud
    2. spring-cloud-starter-alibaba-nacos-discovery

    2.配置nacos地址

    在user-service和order-service的application.yml中添加nacos地址:

    1. spring:
    2. cloud:
    3. nacos:
    4. server-addr: localhost:8848

    服务分级存储模型

    一个服务可以有多个实例,例如我们的user-service,可以有:

    • 127.0.0.1:8081
    • 127.0.0.1:8082
    • 127.0.0.1:8083

    假如这些实例分布于全国各地的不同机房,例如:

    • 127.0.0.1:8081,在上海机房
    • 127.0.0.1:8082,在上海机房
    • 127.0.0.1:8083,在杭州机房

    Nacos就将同一机房内的实例 划分为一个集群

    也就是说,user-service是服务,一个服务可以包含多个集群,如杭州、上海,每个集群下可以有多个实例,形成分级模型,如图:

    微服务互相访问时,应该尽可能访问同集群实例,因为本地访问速度更快。当本集群内不可用时,才访问其它集群。例如:

    在这里插入图片描述

    杭州机房内的order-service应该优先访问同机房的user-service。


    给user-service配置集群

    修改user-service的application.yml文件,添加集群配置:

    1. spring:
    2. cloud:
    3. nacos:
    4. server-addr: localhost:8848
    5. discovery:
    6. cluster-name: HZ # 集群名称

    重启两个user-service实例后,我们可以在nacos控制台看到下面结果:

    我们再次复制一个user-service启动配置,添加属性:

    -Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH

    启动UserApplication3后再次查看nacos控制台:

    在这里插入图片描述

    同集群优先的负载均衡

    默认的ZoneAvoidanceRule并不能实现根据同集群优先来实现负载均衡

    因此Nacos中提供了一个NacosRule的实现,可以优先从同集群中挑选实例。

    1)给order-service配置集群信息

    修改order-service的application.yml文件,添加集群配置:

    1. spring:
    2. cloud:
    3. nacos:
    4. server-addr: localhost:8848
    5. discovery:
    6. cluster-name: HZ # 集群名称

    2)修改负载均衡规则

    修改order-service的application.yml文件,修改负载均衡规则:

    1. userservice:
    2. ribbon:
    3. NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则

    权重配置

    实际部署中会出现这样的场景:

    服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。

    但默认情况下NacosRule是同集群内随机挑选,不会考虑机器的性能问题。

    因此,Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。

    在nacos控制台,找到user-service的实例列表,点击编辑,即可修改权重:

    在这里插入图片描述

    在这里插入图片描述

    在弹出的编辑窗口,修改权重:

    在这里插入图片描述

    注意:如果权重修改为0,则该实例永远不会被访问

    环境隔离

    Nacos提供了namespace来实现环境隔离功能。

    • nacos中可以有多个namespace
    • namespace下可以有group、service等
    • 不同namespace之间相互隔离,例如不同namespace的服务互相不可见

    在这里插入图片描述

    创建namespace

    默认情况下,所有service、data、group都在同一个namespace,名为public:

    在这里插入图片描述

    我们可以点击页面新增按钮,添加一个namespace:

    在这里插入图片描述

    然后,填写表单:

    在这里插入图片描述

    就能在页面看到一个新的namespace:

    在这里插入图片描述


    给微服务配置namespace

    给微服务配置namespace只能通过修改配置来实现。

    例如,修改order-service的application.yml文件:

    1. spring:
    2. cloud:
    3. nacos:
    4. server-addr: localhost:8848
    5. discovery:
    6. cluster-name: HZ
    7. namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID

    重启order-service后,访问控制台,可以看到下面的结果:

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    此时访问order-service,因为namespace不同,会导致找不到userservice,控制台会报错:

    在这里插入图片描述

    Nacos的服务实例

    Nacos的服务实例分为两种l类型:

    • 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。
    • 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。

    配置一个服务实例为永久实例:

    1. spring:
    2. cloud:
    3. nacos:
    4. discovery:
    5. ephemeral: false # 设置为非临时实例

    Nacos和Eureka整体结构类似,服务注册、服务拉取、心跳等待,但是也存在一些差异:

    Nacos与Eureka的区别

    • Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
    • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
    • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
    • Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式

    Nacos做配置中心快速入门

    在这里插入图片描述

    Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。

    在nacos中添加配置文件

    如何在nacos中管理配置呢?

    在这里插入图片描述

    然后在弹出的表单中,填写配置信息:

    在这里插入图片描述

    注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。

    从微服务拉取配置

    微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。

    但如果尚未读取application.yml,又如何得知nacos地址呢?

    因此spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,流程如下:

    在这里插入图片描述

    1)引入nacos-config依赖

    首先,在user-service服务中,引入nacos-config的客户端依赖:

    1. <!--nacos配置管理依赖-->
    2. <dependency>
    3. <groupId>com.alibaba.cloud</groupId>
    4. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    5. </dependency>

    2)添加bootstrap.yaml

    然后,在user-service中添加一个bootstrap.yaml文件,内容如下:

    1. spring:
    2. application:
    3. name: userservice # 服务名称
    4. profiles:
    5. active: dev #开发环境,这里是dev
    6. cloud:
    7. nacos:
    8. server-addr: localhost:8848 # Nacos地址
    9. config:
    10. file-extension: yaml # 文件后缀名

    这里会根据spring.cloud.nacos.server-addr获取nacos地址,再根据

    spring.application.name−{spring.profiles.active}.

    本例中,就是去读取userservice-dev.yaml

    3)读取nacos配置

    在user-service中的UserController中添加业务逻辑,读取pattern.dateformat配置:

    在这里插入图片描述

    在页面访问,可以看到效果:

    在这里插入图片描述

    配置热更新

    我们最终的目的,是修改nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新

    要实现配置热更新,可以使用两种方式:

    方式一

    在@Value注入的变量所在类上添加注解@RefreshScope:

    方式二@ConfigurationProperties

    使用@ConfigurationProperties注解代替@Value注解。

    在user-service服务中,添加一个类,读取patterrn.dateformat属性:

    1. package cn.itcast.user.config;
    2. import lombok.Data;
    3. import org.springframework.boot.context.properties.ConfigurationProperties;
    4. import org.springframework.stereotype.Component;
    5. @Component
    6. @Data
    7. @ConfigurationProperties(prefix = "pattern")
    8. public class PatternProperties {
    9. private String dateformat;
    10. }

    @ConfigurationProperties 是 Spring Boot 提供的一个注解,用于将配置文件中的属性绑定到一个 Java 类上。这样,我们可以方便地在代码中使用这些属性,而不需要手动解析配置文件。使用 @ConfigurationProperties 注解时,需要在类上添加该注解,并指定配置文件的前缀。

    在UserController中使用这个类代替@Value:

    应用

    有很多的业务相关参数,将来可能会根据实际情况临时调整。例如购物车业务,购物车数量有一个上限,默认是10,对应代码如下:

    现在这里购物车是写死的固定值,我们应该将其配置在配置文件中,方便后期修改。

    但现在的问题是,即便写在配置文件中,修改了配置还是需要重新打包、重启服务才能生效。能不能不用重启,直接生效呢?

    这就要用到Nacos的配置热更新能力了,分为两步:

    • 在Nacos中添加配置

    • 在微服务读取配置

    添加配置到Nacos

    首先,我们在nacos中添加一个配置文件,将购物车的上限数量添加到配置中:

    注意文件的dataId格式:

    [服务名]-[spring.active.profile].[后缀名]

    文件名称由三部分组成:

    • 服务名:我们是购物车服务,所以是cart-service

    • spring.active.profile:就是spring boot中的spring.active.profile,可以省略,则所有profile共享该配置

    • 后缀名:例如yaml

    这里我们直接使用cart-service.yaml这个名称,则不管是dev还是local环境都可以共享该配置。

    配置内容如下:

    1. hm:
    2. cart:
    3. maxAmount: 1 # 购物车商品数量上限

    提交配置,在控制台能看到新添加的配置:

    配置热更新

    接着,我们在微服务中读取配置,实现配置热更新。

    cart-service中新建一个属性读取类:

    代码如下:

    1. package com.hmall.cart.config;
    2. import lombok.Data;
    3. import org.springframework.boot.context.properties.ConfigurationProperties;
    4. import org.springframework.stereotype.Component;
    5. @Data
    6. @Component
    7. @ConfigurationProperties(prefix = "hm.cart")
    8. public class CartProperties {
    9. private Integer maxAmount;
    10. }

    接着,在业务中使用该属性加载类:

    配置共享

    问题

    不过,现在依然还有几个问题需要解决:

    • 网关路由在配置文件中写死了,如果变更必须重启微服务

    • 某些业务配置在配置文件中写死了,每次修改都要重启服务

    • 每个微服务都有很多重复的配置,维护成本高

    这些问题都可以通过统一的配置管理器服务解决。而Nacos不仅仅具备注册中心功能,也具备配置管理的功能:

    微服务共享的配置可以统一交给Nacos保存和管理,在Nacos控制台修改配置后,Nacos会将配置变更推送给相关的微服务,并且无需重启即可生效,实现配置热更新。

    网关的路由同样是配置,因此同样可以基于这个功能实现动态路由功能,无需重启网关即可修改路由配置。

    添加共享配置

    以cart-service为例,我们看看有哪些配置是重复的,可以抽取的:

    首先是jdbc相关配置:

    然后是日志配置:

    然后是swagger以及OpenFeign的配置

    我们在nacos控制台分别添加这些配置。

    首先是jdbc相关配置,在配置管理->配置列表中点击+新建一个配置:

    在弹出的表单中填写信息:

    其中详细的配置如下:

    1. spring:
    2. datasource:
    3. url: jdbc:mysql://${hm.db.host:192.168.150.101}:${hm.db.port:3306}/${hm.db.database}?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
    4. driver-class-name: com.mysql.cj.jdbc.Driver
    5. username: ${hm.db.un:root}
    6. password: ${hm.db.pw:123}
    7. mybatis-plus:
    8. configuration:
    9. default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
    10. global-config:
    11. db-config:
    12. update-strategy: not_null
    13. id-type: auto

    注意这里的jdbc的相关参数并没有写死,例如:

    • 数据库ip:通过${hm.db.host:192.168.150.101}配置了默认值为192.168.150.101,同时允许通过${hm.db.host}来覆盖默认值

    • 数据库端口:通过${hm.db.port:3306}配置了默认值为3306,同时允许通过${hm.db.port}来覆盖默认值

    • 数据库database:可以通过${hm.db.database}来设定,无默认值

    然后是统一的日志配置,命名为shared-log.yaml,配置内容如下:

    1. logging:
    2. level:
    3. com.hmall: debug
    4. pattern:
    5. dateformat: HH:mm:ss:SSS
    6. file:
    7. path: "logs/${spring.application.name}"

     然后是统一的swagger配置,命名为shared-swagger.yaml,配置内容如下:

    1. knife4j:
    2. enable: true
    3. openapi:
    4. title: ${hm.swagger.title:黑马商城接口文档}
    5. description: ${hm.swagger.description:黑马商城接口文档}
    6. email: ${hm.swagger.email:zhanghuyi@itcast.cn}
    7. concat: ${hm.swagger.concat:虎哥}
    8. url: https://www.itcast.cn
    9. version: v1.0.0
    10. group:
    11. default:
    12. group-name: default
    13. api-rule: package
    14. api-rule-resources:
    15. - ${hm.swagger.package}

    注意,这里的swagger相关配置我们没有写死,例如:

    • title:接口文档标题,我们用了${hm.swagger.title}来代替,将来可以有用户手动指定

    • email:联系人邮箱,我们用了${hm.swagger.email:zhanghuyi@itcast.cn},默认值是zhanghuyi@itcast.cn,同时允许用户利用${hm.swagger.email}来覆盖。

    拉取共享配置

    接下来,我们要在微服务拉取共享配置。将拉取到的共享配置与本地的application.yaml配置合并,完成项目上下文的初始化。

    不过,需要注意的是,读取Nacos配置是SpringCloud上下文(ApplicationContext)初始化时处理的,发生在项目的引导阶段。然后才会初始化SpringBoot上下文,去读取application.yaml

    也就是说引导阶段,application.yaml文件尚未读取,根本不知道nacos 地址,该如何去加载nacos中的配置文件呢?

    SpringCloud在初始化上下文的时候会先读取一个名为bootstrap.yaml(或者bootstrap.properties)的文件,如果我们将nacos地址配置到bootstrap.yaml中,那么在项目引导阶段就可以读取nacos中的配置了。

    因此,微服务整合Nacos配置管理的步骤如下:

    1)引入依赖:

    在cart-service模块引入依赖:

    1. com.alibaba.cloud
    2. spring-cloud-starter-alibaba-nacos-config
    3. org.springframework.cloud
    4. spring-cloud-starter-bootstrap

    2)新建bootstrap.yaml

    在cart-service中的resources目录新建一个bootstrap.yaml文件:

    内容如下:

    1. spring:
    2. application:
    3. name: cart-service # 服务名称
    4. profiles:
    5. active: dev
    6. cloud:
    7. nacos:
    8. server-addr: 192.168.150.101 # nacos地址
    9. config:
    10. file-extension: yaml # 文件后缀名
    11. shared-configs: # 共享配置
    12. - dataId: shared-jdbc.yaml # 共享mybatis配置
    13. - dataId: shared-log.yaml # 共享日志配置
    14. - dataId: shared-swagger.yaml # 共享日志配置

    3)修改application.yaml

    由于一些配置挪到了bootstrap.yaml,因此application.yaml需要修改为:

    1. server:
    2. port: 8082
    3. feign:
    4. okhttp:
    5. enabled: true # 开启OKHttp连接池支持
    6. hm:
    7. swagger:
    8. title: 购物车服务接口文档
    9. package: com.hmall.cart.controller
    10. db:
    11. database: hm-cart

    重启服务,发现所有配置都生效了。

    配置共享的优先级

    当nacos、服务本地同时出现相同属性时,优先级有高低之分:

    在这里插入图片描述

  • 相关阅读:
    制作 java-sdk 的两种方式
    echarts 仪表盘统计图
    InstantMesh:利用稀疏视图大规模重建模型从单张图像高效生成3D网格
    maven - 分模块开发
    下拉框判断是否重复选中值
    Linux:进程的状态理解
    Eclipse的配置使用
    图片转文字怎么转?这些方法我只告诉你
    域名反查、权重查询以及ICP备案查询——ipInfoSearch
    2023-10-7
  • 原文地址:https://blog.csdn.net/qq_62377885/article/details/137973451