目录一 Nacos服务发现1.安装2.使用二 Nacos负载均衡1.服务下线:2.权重配置(非严格):3.同集群优先访问三 Nacos健康检查1.两种健康检查机制:2.Nacos的服务实例类型:3.配置非临时实例:四 Nacos的环境隔离1.环境:2.隔离:3.实现:五 Nacos配置中心使用1.应用场景:2.使用:六 Nacos配置中心详解1.命名空间:2.DataID:3.常见问题:七 服务部署1.修改配置,进行本地测试2.打包,上传服务器3.重启nacos4.测试八 Eureka和Nacos的区别1.功能2.CAP原则3.服务发现一 Nacos服务发现1.安装地址:https://github.com/alibaba/nacos/releases/tag/2.2.3(1)下载,解压缩(2)单机情况需要修改startup.cmd/startup.sh--MODEstandalone(3)默认端口号8848若端口号被占用①杀死8848端口号(cmd)netstat -ano | findstr 8848 taskkill /pid 进程号 /f②config目录下修改application.propertiesserver.port其他端口号(4)启动startup.cmd/startup.sh,访问IP:端口号/nacosLinux下启动nacos命令:bash startup.sh -m standalone2.使用(1)引入SpringAlibaba的依赖properties spring-cloud-alibaba.version2022.0.0.0-RC2/spring-cloud-alibaba.version /properties dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-alibaba-dependencies/artifactId version${spring-cloud-alibaba.version}/version typepom/type scopeimport/scope /dependency(2)引入Nacos相关依赖dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependency使用过程中需要使用负载均衡,因此把它对应的依赖也加上dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-loadbalancer/artifactId /dependency(3)配置Nacos配置spring: application: name: product-service cloud: nacos: discovery: server-addr: 对应Nacos的ip和端口号(4)修改远程调用代码①将对应请求的uri改为应用名②给restTemplate对象加上负载均衡(5)测试3.常见问题:(1)UnkownHostException--通常是没有引入负载均衡依赖导致找不到当前服务(2)服务注册失败--版本对应问题,SpringAlibaba,SpringCloud,SpringBoot的版本对应问题二 Nacos负载均衡1.服务下线应用场景:当我们发现某个服务存在问题,应该先止损,再排查问题Nacos支持我们不改动代码直接对服务进行上线下线2.权重配置(非严格)(1)应用场景:当机器或服务刚刚上线时,不能确定其是否存在问题,不能对其加大流量,需要控制其流量(2)启用:如果当前使用的是其他框架的负载均衡策略,此时Nacos的负载均衡策略无法生效,此时要让Nacos的负载均衡策略生效需要引入配置#开启nacos的负载均衡策略 spring: cloud: loadbalancer: nacos: enabled: true(3)常见问题:集群环境下修改权重可能会报错Nacos会记录上次启动的ip,当ip不一致的,Nacos找不到leader时,此时就会报错解决方案:删除Nacos根目录下的data文件文件夹下的protocol文件夹即可(用于记录IP的)3.同集群优先访问(1)概念:Nacos把同一机房的实例称为一个集群,因此同集群优先访问也可以认为是同机房优先访问(2)使用场景:一个应用通常会部署在多个地方的机房中,我们通常更希望当前应用请求的时候能优先访问在同一个机房/地方的应用(3)实现:配置集群名称spring: application: name: product-service cloud: nacos: discovery: server-addr: 对应Nacos的ip和端口号 cluster-name: SH #集群名称: 上海集群 spring.cloud.nacos.discovery.cluster-nameBJ注意:2,3的实现都需要开启Nacos的负载均衡策略三 Nacos健康检查1.两种健康检查机制客户端主动上报机制:客户端每隔5秒以心跳上报的形式进行告知服务器,服务器15秒未收到心跳包实例会记录状态为不健康,30秒未收到心跳包就手动删除服务器端反向探测机制:服务器主动探测客户端的健康状况,间隔20秒,如果健康探测失败,实例会被标记为不健康,不会立即被删除注:Nacos的健康检查机制不能主动设置,而是与Nacos的实例类型强相关2.Nacos的服务实例类型临时实例:采用客户端主动上报机制,超过时间未上报就进行删除非临时实例(永久实例):采用服务器反向探测机制注:默认都是临时实例,非临时实例需要进行配置3.配置非临时实例spring: cloud: nacos: discovery: ephemeral: false # 设置为⾮临时实例存在问题:可能会设置失败原因:Nacos记录上次启动改实例的ip和端口号以及实例类型,不允许临时实例转换为非临时实例,也不允许非临时实例转为临时实例解决方案:仍为删除Nacos根目录下data文件夹的protocol文件夹具体:①停止Nacos进程②删除Nacos根目录下data文件夹的protocol文件夹③重启Nacos四 Nacos的环境隔离1.环境开发环境测试环境预发布环境发布环境注:预发布环境和发布环境都是正式环境,通常配置和连接的数据库是一样,区别是预发布环境不对外公开2.隔离开发环境只能访问开发环境,测试环境只能访问测试环境,不同环境之间不能互相访问3.实现(1)创建环境:命名空间中进行添加(2)给实例配置对应的环境(使用环境ID)spring: cloud: nacos: discovery: namespace: 环境ID五 Nacos配置中心使用1.应用场景当一个应用需要更改配置的时候,此时就需要在多台机器上重新部署,此时会麻烦而且容易遗漏可以利用Nacos对配置进行管理2.使用(1)添加配置Data ID要配置的应用名保持一致注:此处的环境与(2)引入依赖引入Nacos Config依赖dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-config/artifactId /dependency !-- SpringCloud 2020.*之后版本需要引⼊bootstrap-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-bootstrap/artifactId /dependency②配置bootstrap.yml微服务启动之后,会先读取nacos配置(bootstrap.yml),再加载application.yml,再将二者进行合并spring: application: name: product-service cloud: nacos: config: server-addr: 注册中心的ip:端口号注:配置中心和服务发现使用的可能不是同一个中心,因此需要单独进行配置(3)修改配置文件修改完配置后要立即生成需要在对应的Controller类上添加RefreshScope(配置热更新-配置实时生效)注:服务管理的命名空间不等于配置管理的命名空间六 Nacos配置中心详解前提:服务发现(服务管理)的配置都是在application.yml里进行的,配置中心(配置管理)的配置都是在bootstrap.yml里进行的1.命名空间(1)作用:指定当前配置从哪个空间读取,默认为public(2)对应yml配置:spring: application: name: product-service cloud: nacos: config: server-addr: 注册中心的ip:端口号 namespace: 环境ID2.DataID(1)完整格式:${prefix}-${spring.profiles.active}.${file-extension}对应关系:①prefix:默认是spring.application.name的值,也可以通过spring.cloud.nacos.config.prefix进行配置②spring.profiles.active:为spring.profiles.active的值,当其为空的时候dataId会变成${prefix}.${file-extension}具体配置:spring: profiles: active: dev③file-extension:通过spring.cloud.nacos.config.file-extension来进行配置,目前只支持yaml和properties两种类型spring: cloud: nacos: config: server-addr: 127.0.0.1:8848 file-extension:properties(2)匹配规则:dataId与bootstrap.yml配置的匹配得越多,就优先匹配和使用哪个例如:三个⽂件的优先级为: product-service-dev.properties product-service.properties productservice3.常见问题(1)读取不到配置--检查配置文件①检查dataId有没有拼写错误②配置文件写得是否有错误,格式是否正确③检查对应的命名空间④未引入依赖(bootstrap依赖)对应错误:No spring.config.import property has been defined原因:2020年后bootstrap被禁用了,但是我们Nacos的配置我们需要先读取bootstrap.yml,再与application.yml合并,因此不引入依赖不能用bootstrap报错(2)Nacos Service地址错误七 服务部署1.修改配置,进行本地测试注:没法在.yml里直接写profile.name解决:在build依赖里添加resources resource directorysrc/main/resources/directoryfilteringtrue/filtering includes incLude**/**/include /includes /resource /resources2.打包,上传服务器nohup java -jar product-service.jar --server.port9091 logs/product-service-9091.log 3.重启nacos4.测试八 Eureka和Nacos的区别1.功能Nacos除了提供服务发现,还提供了配置管理和DNS服务2.CAP原则Eureka使用AP原则Nacos可以AP与CP进行切换,默认是AP,根据配置查看当前是临时节点,则为AP,反之则为CP,二者可以混合存在3.服务发现Eureka基于拉模式,定期从Service拉去服务信息Nacos基于推送模式,只要服务列表有变化,其就会把变化推送给订阅者(客户端为订阅者)