SpringCloud系列 (十三)SCA Nacos 服务注册和配置中⼼

1,265 阅读7分钟

SCA Nacos 服务注册和配置中⼼

Nacos 介绍

Nacos (Dynamic Naming and Configuration Service)是阿⾥巴巴开源的⼀个针对微服务架构中服务发现、配置管理和服务管理平台。Nacos就是注册中⼼+配置中⼼的组合(Nacos=Eureka+Config+Bus)

官⽹:nacos.io 下载地址:github.com/alibaba/Nac…

Nacos功能特性

  • 服务发现与健康检查
  • 动态配置管理
  • 动态DNS服务
  • 服务和元数据管理(管理平台的⻆度,nacos也有⼀个ui⻚⾯,可以看到注册的
  • 服务及其实例信息(元数据信息)等),动态的服务权重调整、动态服务优雅下线,都可以去做

Nacos 单例服务部署

  • 打开GitHub地址,下载tagz包看,这里我们使用的是 1.2.0的版本

image.png

image.png

  • 下载解压安装包,执⾏命令启动(我们使⽤最近⽐较稳定的版本 nacos-server-1.2.0.tar.gz)
linux/mac:sh startup.sh -m standalone
windows:cmd startup.cmd 

image.png

image.png

Nacos 服务注册中⼼

服务提供者注册到Nacos(改造简历微服务)

  • 在⽗pom中引⼊SCA依赖
<dependencyManagement>
 <dependencies>
     <!--SCA -->
     <dependency>
         <groupId>com.alibaba.cloud</groupId>
         <artifactId>spring-cloud-alibaba-dependencies</artifactId>
         <version>2.1.0.RELEASE</version>
         <type>pom</type>
         <scope>import</scope>
     </dependency>
 </dependencies>
 <!--SCA -->
</dependencyManagement>
  • 添加简历微服务:lagou-service-resume-8082-nacos image.png

  • 在服务提供者⼯程中引⼊nacos客户端依赖(注释eureka客户端)

<dependency>
 <groupId>com.alibaba.cloud</groupId>
 <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  • application.yml修改,添加nacos配置信息,
 server:
  port: 8082
spring:
  application:
    name: lagou-service-resume
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/lagou?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&serverTimezone=GMT%2B8
    username: root
    password: root
  jpa:
    database: MySQL
    show-sql: true
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl  #避免将驼峰命名转换为下划线命名
  # nacos配置
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
management:
  endpoints:
    web:
      exposure:
        include: "*"

image.png

  • 启动简历微服务,观察nacos控制台

    • 在服务列表中出现了简历微服务 image.png

image.png

image.png

临时实例:客户端在一定时间没有进行心跳续约,服务端认为这个客户端不健康,一定时间会删除

持久化实例:不健康也不会从这里删除,主要场景是,Mysql主从节点,可以从Nacos中获取。服务端在一定时间内没有进行心跳,服务端会主动的去探测

服务端对于临时实例和持久化实例的对待方式是不一样的。

保护阈值:可以设置为0-1之间的浮点数,它其实是⼀个⽐例值(当前服务健康实例 数/当前服务总实例数)

场景: ⼀般流程下,nacos是服务注册中⼼,服务消费者要从nacos获取某⼀个服务的可⽤实例信息,对于服务实例有健康/不健康状态之分,nacos在返回给消费者实例信息的时候,会返回健康实例。这个时候在⼀些⾼并发、⼤流量场景下会存在⼀定的问题

如果服务A有100个实例,98个实例都不健康了,只有2个实例是健康的,如果nacos只返回这两个健康实例的信息的话,那么后续消费者的请求将全部被分配到这两个实例,流量洪峰到来,2个健康的实例也扛不住了,整个服务A 就扛不住,上游的微服务也会导致崩溃,产⽣雪崩效应。

保护阈值的意义

当服务A健康实例数/总实例数 < 保护阈值 的时候,说明健康实例真的不多了,这个时候保护阈值会被触发(状态true)

nacos将会把该服务所有的实例信息(健康的+不健康的)全部提供给消费者,消费者可能访问到不健康的实例,请求失败,但这样也⽐造成雪崩要好,牺牲了⼀些请求,保证了整个系统的⼀个可⽤

服务消费者从Nacos获取服务提供者(改造⾃动投递微服务)

  • 创建一个新项目

image.png

  • pom文件只保留必要依赖
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>

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

</dependencies>
  • application.yml
    • 配置nacos
    • 配置ribbon
    • 配置feign
    • 配置loging
    • 配置hystrix
server:
  port: 8097
spring:
  application:
    name: lagou-service-autodeliver
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
management:
  endpoints:
    web:
      exposure:
        include: "*"
  # 暴露健康接口的细节
  endpoint:
    health:
      show-details: always
#针对的被调用方微服务名称,不加就是全局生效
lagou-service-resume:
  ribbon:
    #请求连接超时时间
    ConnectTimeout: 2000
    #请求处理超时时间
    ##########################################Feign超时时长设置
    ReadTimeout: 3000
    #对所有操作都进行重试
    OkToRetryOnAllOperations: true
    ####根据如上配置,当访问到故障请求的时候,它会再尝试访问一次当前实例(次数由MaxAutoRetries配置),
    ####如果不行,就换一个实例进行访问,如果还不行,再换一次实例访问(更换次数由MaxAutoRetriesNextServer配置),
    ####如果依然不行,返回失败信息。
    MaxAutoRetries: 0 #对当前选中实例重试次数,不包括第一次调用
    MaxAutoRetriesNextServer: 0 #切换实例的重试次数
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #负载策略调整
logging:
  level:
    # Feign日志只会对日志级别为debug的做出响应
    com.lagou.edu.controller.service.ResumeServiceFeignClient: debug
# 开启Feign的熔断功能
feign:
  hystrix:
    enabled: false
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            ##########################################Hystrix的超时时长设置
            timeoutInMilliseconds: 15000
  • 启动项目,发现已经注册到了nacos中 image.png

  • 测试可用性 image.png

  • 测试完成后,查看订阅者列表,这是新版本才有的功能,得输入服务提供者的名称或者分组,然后才可以查询 image.png

负载均衡

Nacos客户端引⼊的时候,会关联引⼊Ribbon的依赖包,我们使⽤OpenFiegn的时候也会引⼊Ribbon的依赖,Ribbon包括Hystrix都按原来⽅式进⾏配置即可此处,我们将简历微服务,⼜启动了⼀个8083端⼝,注册到Nacos上,便于测试负载均衡,我们通过后台也可以看出。

  • 再新建一个简历微服务

image.png

  • 注册到nacos上

image.png

  • 进行多次测试,发现输出8082 8083

image.png

image.png

  • 我们可以对某一个服务实例进行上下线 image.png

  • 我们还能够对服务实例的权重进行编辑,如果一个A实例设置为1,B实例设置为0,相当于就是给B下线了

image.png

Nacos Server 数据持久化

Nacos 默认使⽤嵌⼊式数据库进⾏数据存储,它⽀持改为外部Mysql存储

  • 新建数据库nacos,并且执行nacos的建表脚本 image.png

  • 修改nacos的配置文件 image.png

  • 把数据库注释解开,修改本机的配置信息 image.png

  • 重新启动nacos即可完成数据持久化

Nacos Server 集群

  • 安装3个或3个以上的Nacos 复制解压后的nacos⽂件夹,分别命名为nacos-01、nacos-02、nacos-03

image.png

  • 修改配置⽂件

    • 同⼀台机器模拟,将上述三个⽂件夹中application.properties中的 server.port分别改为 8848、8849、8850 同时给当前实例节点绑定ip,因为服务器可能绑定多个ip
    nacos.inetutils.ip-address=127.0.0.1
    
    • 复制⼀份conf/cluster.conf.example⽂件,命名为cluster.conf在配置⽂件中设置集群中每⼀个节点的信息
    # 集群节点配置
    127.0.0.1:8848
    127.0.0.1:8849
    127.0.0.1:8850
    
  • 启动三个实例 image.png

  • 服务器集群列表 image.png

  • 当一个服务挂了之后,剩下的两个节点,会自动进行选举 image.png

Nacos 配置中⼼

  • 添加命名空间 image.png

  • Nacos server 添加配置集 添加命名空间之后,就能在各自的命名空间下,添加一个配置集,其实就是添加一个配置文件

image.png

DataId就是配置文件名称 image.png

微服务接入Nacos

Nacos 服务端已经搭建完毕,那么我们可以在我们的微服务中开启 Nacos 配置管理

  • 添加依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  • 微服务中如何锁定 Nacos Server 中的配置⽂件(dataId) 通过 Namespace + Group + dataId 来锁定配置⽂件,Namespace不指定就默认public,Group不指定就默认 DEFAULT_GROUP

dataId 的完整格式如下:

 ${prefix}-${spring.profile.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项spring.cloud.nacos.config.prefix 来配置。
  • spring.profile.active 即为当前环境对应的 profile。 注意:当spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 prefix.{prefix}.{file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension 来配置。⽬前只⽀持properties 和 yaml 类型。
server:
  port: 8082
spring:
  application:
    name: lagou-service-resume 

  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/lagou?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&serverTimezone=GMT%2B8
    username: root
    password: root
  jpa:
    database: MySQL
    show-sql: true
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl  #避免将驼峰命名转换为下划线命名
  # nacos配置
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      
management:
  endpoints:
    web:
      exposure:
        include: "*"

这个配置对应的名称为:lagou-service-resume.yaml

  • 启动项目时,发现报错了,反复对比了配置文件,都是报这个错误。

image.png

  • 搞了半天,结果是配置文件名称的问题,把appcliation.yaml 变成 boostrap.yaml

image.png

在spring cloud config client中就只能用bootstrap.yml来获取config server的配置。

  • 如果想加载自定义的配置文件,可以通过 ext-config 进行配置

先在配置文件中增加abc.yaml文件 image.png

增加一个简单的配置 image.png

然后在配置文件中增加ext-config数组配置,这里也配置的是abc.yaml

      config:
        server-addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850
        namespace: 76bd1a7b-c306-4d49-8c0d-e4e2cb5248a7
        group: DEFAULT_GROUP
        file-extension: yaml
        ## dataId: lagou-service-resume.yaml
        ext-config[0]:
          data-id: abc.yaml
          group: DEFAULT_GROUP
          refresh: true  #开启扩展dataId的动态刷新

image.png

  • 配置文件的顺序问题 如果在几个配置文件中,都具有相同名称的key,那么优先加载的顺序是

直接默认的配置文件> 扩展配置1 > 扩展配置2