当前位置: 首页 > article >正文

【实战案例】Nacos从安装到服务注册发现再到配置中心(附常见问题解决方案)

文章目录

  • 需要Nacos的缘由
  • 搭建Nacos
    • 命名空间和组
    • 依赖项导入
    • 注册发现服务
    • 配置中心
      • 配置文件种类
      • 特有配置
      • dataid
      • 公用配置
      • 配置优先级

需要Nacos的缘由

通常情况下,微服务项目中会存在多个模块,如果这种情况下前端直接请求微服务会存在一些不便之处,前端对于每个请求地址都需要配置绝对地址,不利于系统维护。这种情况下在系统中就可以采用网关来解决,有了网关,前端每次请求的时候只需要指定接口的相对路径就可以了,网关地址加接口地址,每一个请求都先到达网关,由网关将请求路由转发到具体的微服务。这样的好处是减少外界对接微服务的成本,如果一个微服务有多个实例的情况下也可以使用负载均衡算法进行路由,再者,网关还可以实现权限控制、限流等功能。

微服务项目中通常采用Spring Cloud Gateway作为网关,网关在请求路由时需要知道每个微服务实例的地址,此时就需要Nacos上场了,Nacos作为服务发现中心和配置中心,接管项目中所有微服务的注册,发现和配置,整体的架构图如下所示:
在这里插入图片描述
应用流程:

  1. 微服务启动,将自己注册到Nacos,Nacos记录了各微服务实例的地址。
  2. 网关从Nacos读取服务列表,包括服务名称、服务地址等。
  3. 请求到达网关,网关将请求路由到具体的微服务。

过程中Nacos主要有两个作用:

  • 服务发现中心:微服务将自身注册至Nacos,网关从Nacos获取微服务列表。
  • 配置中心:微服务众多,它们的配置信息也非常复杂,为了提供系统的可维护性,微服务的配置信息统一在Nacos配置。

搭建Nacos

命名空间和组

namespace:用于区分环境、比如:开发环境、测试环境、生产环境
group:用于区分项目,比如:effective-study项目、smart-hospital项目

点击左边菜单的“命名空间”新建命名空间:
在这里插入图片描述
同样,对于一个项目来说通常有开发、测试和生产三个版本,建立好命名空间参考如下:
在这里插入图片描述
上面的命名空间ID就是后续项目配置文件中的namespace项的值。

依赖项导入

哪个项目中用到了对应的nacos配置,就需要进行依赖项的导入

项目父工程中添加如下依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>${spring-cloud-alibaba.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

涉及接口的工程中添加相应依赖,用于注册发现和配置

 <dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
 </dependency>
 <dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 </dependency>

注册发现服务

为了让对应的接口服务被nacos注册发现,在对应接口服务所属工程对应的配置文件中配置如下cloud内容:

spring:
  application:
    name: content-api
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        namespace: dev
        group: effective-study

重启项目可以发现控制台中有日志信息表明nacos一直在主动轮询获取服务,打开nacos控制台可见服务列表中也会出现相应的服务注册项,此时可以表明服务注册成功,且对应的IP及运行端口一致。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
至此,Nacos的服务发现中心完成微服务的发现注册。

配置中心

配置文件种类

Nacos作为配置中心的目的就是通过Nacos去管理项目中所有的配置。项目中通常存在多个微服务,每个服务都有自己的配置,所以在配置之前需要先弄清楚配置文件的种类,通常情况下分为两种:

  • 每个项目特有的配置
    是指该配置只在有些项目中需要配置,或者该配置在每个项目中配置的值不同。
    比如:spring.application.name每个项目都需要配置但值不一样,以及有些项目需要连接数据库而有些项目不需要,有些项目需要配置消息队列而有些项目不需要。

  • 项目所共用的配置
    是指在若干项目中配置内容相同的配置。
    比如:redis的配置,很多项目用的同一套redis服务所以配置也一样。

特有配置

dataid

为了便于Nacos定位具体的配置文件,官方有针对于Data ID的命名规则建议nacos配置中心dataid 命名规则建议
举例如下:
content-service-dev.yaml配置文件 由(content-service)-(dev). (yaml)三部分组成
content-service:第一部分,它是在application.yaml中配置的应用名,即spring.application.name的值。
dev:第二部分,它是环境名,通过spring.profiles.active指定。
yaml: 第三部分,它是配置文件 的后缀,目前nacos支持properties、yaml等格式类型,这里就选择yaml格式类型。

下述的案例背景是我有一个微服务项目,其中有一个content-service为内容服务模块,但开发中不添加启动类,仅在测试包中添加测试类,但测试类同样需要连接数据库,所以需要在配置内容中添加数据库连接相关内容。另外有一个接口API模块,其中含有启动类,需要除数据库连接及其他配置。
原有二者的配置文件如下所示:
application.yml(content-service的)

#微服务配置
spring:
  application:
    name: content-service
  cloud:
    nacos:
      server-addr: localhost:8848
      config:
        namespace: dev
        group: effective-study
        file-extension: yaml
        refresh-enabled: true
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/effective_study_content?serverTimezone=UTC&userUnicode=true&useSSL=false&
    username: ******
    password: ******
  #profiles默认为dev
  profiles:
    active: dev
# 日志文件配置路径
logging:
  config: classpath:log4j2-dev.xml

application.yml(content-api的)

server:
  servlet:
    context-path: /content
  port: 53040
#微服务配置
spring:
  application:
    name: content-api
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        namespace: dev
        group: effective-study
  #profiles默认为dev
  profiles:
    active: dev

  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/effective_study_content?serverTimezone=UTC&userUnicode=true&useSSL=false&
    username: ******
    password: ******
# 日志文件配置路径
logging:
  config: classpath:log4j2-dev.xml

swagger:
  title: "高效学习内容管理系统"
  description: "内容系统管理系统对课程相关信息进行管理"
  base-package: com.gavin.content
  enabled: true
  version: 1.0.0

首先将content-api中的配置放到nacos中
在这里插入图片描述
本地文件中留下如下部分:
在这里插入图片描述
重启服务后可以正常访问接口,证明nacos的配置生效。但这过程中可能出现的问题或者需要注意的点如下:

  1. dataid与本地文件中需要一一对应,否则运行项目的时候是找不到对应的配置内容的,三项分别为:spring.application.name+spring.profiles.active+spring.cloud.nacos.file-extension。
  2. 项目中依赖项要包含config及discovery,其中config中包含客户端可以从nacos服务中心拉取配置,discovery用于注册发现。相应的依赖如下
 <dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
 </dependency>
 <dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 </dependency>
  1. 项目中springboot springcloud 及 alibaba版本要适配,较高版本可能无法拉取配置,参考版本如下:
 <spring-boot.version>2.2.4.RELEASE</spring-boot.version>
 <spring-cloud.version>Hoxton.SR4</spring-cloud.version>
 <spring-cloud-alibaba.version>2.2.0.RELEASE</spring-cloud-alibaba.version>
  1. 本地配置文件名采用bootstrap.yml或者对应properties文件,经过实际测试,采用springboot.yml进行命名是无法加载配置的。
  2. 排查问题的过程中可以查看配置文件是否有被本机从服务中心拉取下来,目录位于C:\用户\User\nacos\config下,如图示,如果有可以证明配置文件被拉下来了,如果报错大概率是内容格式缩进等问题;如果压根没有拉下来,那可能是前面几点问题。
    在这里插入图片描述
    另外,一定要注意微服务项目中相应版本的管理!不要出现版本冲突!!!否则也是无法拉取nacos配置的(血泪教训)

在我的content-service中对应的nacos配置为

#微服务配置
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/effective_study_content?serverTimezone=UTC&userUnicode=true&useSSL=false&
    username: ******
    password: ******

本地文件如下:

#微服务配置
spring:
  application:
    name: content-service
  cloud:
    nacos:
      server-addr: localhost:8848
      config:
        namespace: dev
        group: effective-study
        file-extension: yaml
        refresh-enabled: true
  profiles:
    active: dev

# 日志文件配置路径
logging:
  config: classpath:log4j2-dev.xml

通过上述配置可见,接口模块中通常不直接对接数据库,依赖service模块的数据库连接配置,所以可以使用extension-configs扩展配置文件 的方式引用service工程所用到的配置文件。如下

#微服务配置
spring:
  application:
    name: content-api
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        namespace: dev
        group: effective-study
      config:
        namespace: dev
        group: effective-study
        file-extension: yaml
        refresh-enabled: true
        extension-configs:
          - data-id: content-service-${spring.profiles.active}.yaml
            group: effective-study
            refresh: true
  profiles:
    active: dev

若是依赖多个,集训并行添加即可

        extension-configs:
          - data-id: content-service-${spring.profiles.active}.yaml
            group: effective-study
            refresh: true
          - data-id: 填写文件 dataid
            group: xuecheng-plus-project
            refresh: true  

公用配置

除上述项目特有配置之外,nacos提供了shared-configs可以引入公用配置。在content-api中配置了swagger,所有的接口工程 都需要配置swagger,这里就可以将swagger的配置定义为一个公用配置,哪个项目用引入即可。如下
在这里插入图片描述
在这里插入图片描述
对应接口工程中本地文件配置如下:

#微服务配置
spring:
  application:
    name: content-api
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        namespace: dev
        group: effective-study
      config:
        namespace: dev
        group: effective-study
        file-extension: yaml
        refresh-enabled: true
        extension-configs:
          - data-id: content-service-${spring.profiles.active}.yaml
            group: effective-study
            refresh: true
        shared-configs:
          - data-id: swagger-${spring.profiles.active}.yaml
            group: effective-study-common
            refresh: true
          - data-id: logging-${spring.profiles.active}.yaml
            group: effective-study-common
            refresh: true

  profiles:
    active: dev

配置完成后重启可见接口服务和日志服务正常启用。

配置优先级

到目前为止已将所有微服务的配置统一在nacos进行配置,用到的配置文件有本地的配置文件 bootstrap.yaml和nacos上的配置文件,SpringBoot读取配置文件 的顺序如下:
在这里插入图片描述
引入配置文件的形式有:
1、以项目应用名方式引入
2、以扩展配置文件方式引入
3、以共享配置文件 方式引入
4、本地配置文件
各配置文件 的优先级:项目应用名配置文件 > 扩展配置文件 > 共享配置文件 > 本地配置文件。

如果想让本地最优先,可以在nacos配置文件 中配置如下即可实现:

#配置本地优先
spring:
 cloud:
  config:
    override-none: true

http://www.kler.cn/news/354791.html

相关文章:

  • 前端开发设计模式——状态模式
  • 【AIGC】寻找ChatGPT最佳推理步骤:CoT思维链技术的探索与应用
  • C# 将PDF文档转换为Markdown文档
  • Go语言Gin框架调用企业微信接口根据手机号获取userid
  • 滚雪球学Redis[7.3讲]:Redis在排行榜系统中的应用:高效构建与优化
  • 【C++刷题】力扣-#136-只出现一次的数字
  • FPGA基于SRIO Auraro 三速以太网 IIC SPI等多协议的高速传输处理项目
  • AOT漫谈专题(第三篇): 如何获取C#程序的CPU利用率
  • 前端常用算法和数据结构
  • 推动实验室数字化,LIMS主要功能及优势
  • k8s中的微服务
  • 【C语言】递归函数变量的作用域
  • Elasticsearch(二)集成Spring Boot 基本的API操作
  • oracle实例宕机,虚拟机磁盘精简配置模式,磁盘无法扩展
  • C++ 内存管理 对比C语言动态内存管理;operator new和delete
  • 洛谷 P1803:凌乱的yyy / 线段覆盖 ← 贪心算法
  • (C/C++)文件
  • 鼠标市场洞察:数据分析揭示消费趋势!
  • 如何解决MQ的重复消费问题?Kafka、ActiveMQ、RabbitMQ有什么区别?
  • 低功耗 ARMxy工业计算机:工业场景的绿色新选择