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的版本
- 下载解压安装包,执⾏命令启动(我们使⽤最近⽐较稳定的版本 nacos-server-1.2.0.tar.gz)
linux/mac:sh startup.sh -m standalone
windows:cmd startup.cmd
- 访问nacos管理界⾯:http://127.0.0.1:8848/nacos/#/login (默认端⼝8848,账号和密码 nacos/nacos)
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
-
在服务提供者⼯程中引⼊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: "*"
-
启动简历微服务,观察nacos控制台
- 在服务列表中出现了简历微服务
- 在服务列表中出现了简历微服务
临时实例:客户端在一定时间没有进行心跳续约,服务端认为这个客户端不健康,一定时间会删除
持久化实例:不健康也不会从这里删除,主要场景是,Mysql主从节点,可以从Nacos中获取。服务端在一定时间内没有进行心跳,服务端会主动的去探测
服务端对于临时实例和持久化实例的对待方式是不一样的。
保护阈值:可以设置为0-1之间的浮点数,它其实是⼀个⽐例值(当前服务健康实例 数/当前服务总实例数)
场景: ⼀般流程下,nacos是服务注册中⼼,服务消费者要从nacos获取某⼀个服务的可⽤实例信息,对于服务实例有健康/不健康状态之分,nacos在返回给消费者实例信息的时候,会返回健康实例。这个时候在⼀些⾼并发、⼤流量场景下会存在⼀定的问题
如果服务A有100个实例,98个实例都不健康了,只有2个实例是健康的,如果nacos只返回这两个健康实例的信息的话,那么后续消费者的请求将全部被分配到这两个实例,流量洪峰到来,2个健康的实例也扛不住了,整个服务A 就扛不住,上游的微服务也会导致崩溃,产⽣雪崩效应。
保护阈值的意义
当服务A健康实例数/总实例数 < 保护阈值 的时候,说明健康实例真的不多了,这个时候保护阈值会被触发(状态true)
nacos将会把该服务所有的实例信息(健康的+不健康的)全部提供给消费者,消费者可能访问到不健康的实例,请求失败,但这样也⽐造成雪崩要好,牺牲了⼀些请求,保证了整个系统的⼀个可⽤
服务消费者从Nacos获取服务提供者(改造⾃动投递微服务)
- 创建一个新项目
- 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中
-
测试可用性
-
测试完成后,查看订阅者列表,这是新版本才有的功能,得输入服务提供者的名称或者分组,然后才可以查询
负载均衡
Nacos客户端引⼊的时候,会关联引⼊Ribbon的依赖包,我们使⽤OpenFiegn的时候也会引⼊Ribbon的依赖,Ribbon包括Hystrix都按原来⽅式进⾏配置即可此处,我们将简历微服务,⼜启动了⼀个8083端⼝,注册到Nacos上,便于测试负载均衡,我们通过后台也可以看出。
- 再新建一个简历微服务
- 注册到nacos上
- 进行多次测试,发现输出8082 8083
-
我们可以对某一个服务实例进行上下线
-
我们还能够对服务实例的权重进行编辑,如果一个A实例设置为1,B实例设置为0,相当于就是给B下线了
Nacos Server 数据持久化
Nacos 默认使⽤嵌⼊式数据库进⾏数据存储,它⽀持改为外部Mysql存储
-
新建数据库nacos,并且执行nacos的建表脚本
-
修改nacos的配置文件
-
把数据库注释解开,修改本机的配置信息
-
重新启动nacos即可完成数据持久化
Nacos Server 集群
- 安装3个或3个以上的Nacos 复制解压后的nacos⽂件夹,分别命名为nacos-01、nacos-02、nacos-03
-
修改配置⽂件
- 同⼀台机器模拟,将上述三个⽂件夹中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 -
启动三个实例
-
服务器集群列表
-
当一个服务挂了之后,剩下的两个节点,会自动进行选举
Nacos 配置中⼼
-
添加命名空间
-
Nacos server 添加配置集 添加命名空间之后,就能在各自的命名空间下,添加一个配置集,其实就是添加一个配置文件
DataId就是配置文件名称
微服务接入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 的拼接格式变成 {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
- 启动项目时,发现报错了,反复对比了配置文件,都是报这个错误。
- 搞了半天,结果是配置文件名称的问题,把appcliation.yaml 变成 boostrap.yaml
在spring cloud config client中就只能用bootstrap.yml来获取config server的配置。
- 如果想加载自定义的配置文件,可以通过 ext-config 进行配置
先在配置文件中增加abc.yaml文件
增加一个简单的配置
然后在配置文件中增加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的动态刷新
- 配置文件的顺序问题 如果在几个配置文件中,都具有相同名称的key,那么优先加载的顺序是
直接默认的配置文件> 扩展配置1 > 扩展配置2