Nacos基本配置
为什么需要服务注册中心?
微服务时代的服务管理
在微服务时代,我们所有的服务都被劲量拆分成最小的粒度,原先所有的服务都在混在1个server里,现在就被按照功能或者对象拆分成N个服务模块,这样做的好处是深度解耦,1个模块只负责自己的事情就好,能够实现快速的迭代更新。坏处就是服务的管理和控制变得异常的复杂和繁琐,人工维护难度变大。还有排查问题和性能变差(服务调用时的网络开销)文章来源地址:https://www.yii666.com/blog/390499.html
什么是注册中心?
注册中心的作用一句话概括就是存放和调度服务,实现服务和注册中心,服务和服务之间的相互通信。注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用。
如果没有注册中心?会怎样
在不用服务注册之前,怎么去维护这种复制的关系网络呢?答案就是:写死!。
- 将其他模块的ip和端口写死在自己的配置文件里,甚至写死在代码里,每次要去新增或者移除1个服务的实例的时候,就得去通知其他所有相关联的服务去修改。
- 随之而来的就是各个项目的配置文件的反复更新、每隔一段时间大规模的ip修改和机器裁撤,非常的痛苦。
而有了注册中心之后,每个服务在调用别人的时候只需要服务的名称就好,调用时会通过注册中心根据服务编码进行具体服务地址进行调用。
服务注册中心的作用就是【服务的注册】和【服务的发现】
- 服务注册,就是将提供某个服务的模块信息(通常是这个服务的ip和端口)注册到1个公共的组件上去(比如: zookeeper\consul)。
- 服务发现,就是新注册的这个服务模块能够及时的被其他调用者发现。不管是服务新增和服务删减都能实现自动发现。
服务发现是怎么回事?
- 微服务启动的时候将service_name,IP,port,status发送到Nacos服务注册中心,Nacos保存这些数据。
- 消费者本地缓存服务信息,并且定时同步,所以就算Nacos宕机了也不怕不能调用
- 服务提供者每5秒发送心跳给服务发现组件,当一段时间没收到心态,服务发现组件标记服务状态为宕机。15秒无心跳则认为实例不健康,30秒健康检查失败则剔除实例。
- 这样的好处:
- 不用每次都请求服务发现组件,提升了性能
- 服务发现组件崩溃,不影响正常调用
整合Nacos 服务中心
nacos 下载地址 :https://github.com/alibaba/nacos/releases
nacos 搭建参考文档地址:https://nacos.io/zh-cn/docs/quick-start.html
下载那一个包?如何解决兼容性问题?技巧如下:
打开idea进入pom.xml 文件,打开spring-cloud-alibaba-dependencies 找到Nacos-client的版本
加依赖
<!--nacos 注册中心--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
写配置
spring: application: name: shopping-account-service cloud: nacos: discovery: server-addr: localhost:8848
写注解(开发)
//早期版本需要在启动类上加本注解,现在已经不是必须的了 @EnableDiscoveryClient
根据service-name获取在nacos中注册的实例信息:
DiscoveryClient 可以操作Nacos元数据
DiscoveryClient由SpringCloud提供,不只是可以查询Nacos。
元数据有什么用?
列如:有服务器A版本为V1.0,有服务器B版本为V1.0,有服务器C版本为V2.0,有服务器D版本为V2.0,可以做到V1.0的服务只调用V1.0,V2.0只调用V2.0。
服务发现的领域模型
- Namespace 命名空间(实现隔离、默认是public) 对应不同的环境(dev、prot、test)
- group 分组对应不同的节点(不同的微服务分在在同一个分组)
- service 服务 对应不同的集群服务
- cluster:(集群-对应服务器)对指定微服务的一个虚拟划分,默认DEFAULT
- instance:微服务实列
为什么要实现配置管理?
不同的环境不同的配置
如:dev和prod环境的数据库地址和密码肯定不一样的
配置属性动态刷新
如:双十一需要修改数据库连接池,我需要在不重启服务的情况下修改
配置动态刷新
动态刷新的几种方式
方式一:yaml中开启 refresh-enabled=true 时(默认开启),通过applicationContext.getEnvironment.getProperty 直接获取
方式二:standalone使用,@NacosValue获取最新值nacos配置信息需要写在配置类上
方式三:结合springcloud ,@Value获取最新值一定要加@RefreshScope注解,配置文件中配置refresh: true
Spring boot 启动或者更改配置后控制台打印配置信息
# 日志级别,可以指定到具体类 logging: level: # 3、在任意格式的配置文件中将该包路径的日志设置为 ERROR 或者 WARN 级别即可 # Nacos 注册中心客户端心跳日志禁用 get changedGroupKeys:[] 刷屏 com: alibaba: cloud: nacos: DEBUG
配置共享
其他配置方式中可以查看
配置优先级
其他配置方式中可以查看
数据持久化
服务发现组件(所有配置文件存放的位置)
数据持久化默认位置:~/nacos/naming
配置服务器
配置数据:$NACOS_HOME/data/derby-data
在nacos控制台修改的配置都在此数据库中做持久化
derby-data:不适合生产环境配置,内嵌(只能单机)数据库不能做高可用。
需要停止nacos才能查看。
快照:
保存位置:~/nacos/config
里面主要是在nacos中设置的内容,快照可以提升性能以及做容灾
加依赖
<!--nacos 注册中心--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
写配置
spring: cloud: nacos: discovery: #Nacos的地址,如果是集群的话使用,号隔开 如:localhost1,localhost2 server-addr: 127.0.0.1:8848 file-extension: yaml application: name: shopping-trade-service profiles: #以什么结尾的文件 shopping-trade-service-dev.yml active: dev #读取Nacos上的shopping-trade-service-dev.yml配置文件
写注解(开发)
无
其他配置方式
bootstrap.xml文件
# bootstrap 会在加载application.yml之前先连接nacos,获取远程的配置,然后再进行初始化 # 因此bootstrap要配置的重点就是 # 1. nacos的地址: 获取配置的入口 # 2. application的name: 根据SpringCloud的约定,是根据name-{profile}.yaml去读取远程配置文件的 spring: application: name: snapex-account-service cloud: nacos: config: #NACOS_HOST 是环境变量 #默认配置会默认自动刷新 #当配置了环境变量时使用环境变量,如果没有配置时使用:后面的地址 server-addr: ${NACOS_HOST:192.168.199.57:8848} #命名空间,和Nacos控制台的命名空间一致 #此处的命名空间指的是Nacos控制台创建命名空间时命名空间ID namespace: ${NACOS_NAMESPACE:dev} file-extension: yaml group: DEFAULT_GROUP extension-configs: #配置中心配置的公共配置文件,yml后缀不能少,只支持yaml/properties #越靠后,优先级越高,优先级 database.yaml > commons.yaml - data-id: commons.yaml #commons.yaml所在的group group: DEFAULT_GROUP #是否动态的刷新 refresh: true - data-id: database.yaml group: DEFAULT_GROUP #是否动态的刷新 refresh: true discovery: server-addr: ${NACOS_HOST:192.168.199.57:8848} namespace: ${NACOS_NAMESPACE:dev2-dzq} group: DEFAULT_GROUP
application.xml文件
spring: profiles: #以什么结尾的文件 shopping-trade-service-dev.yml active: ${SPRING_PROFILES_ACTIVE:dev}
部分理论参考: 微服务:注册中心的作用 (yii666.com)