Spring-cloud 主键Nacos
一,下载nacos
Nacos(dynamic Naming and Configuration Service)

Nacos的安装
(1) Windows安装
默认是集群模式,我们要修改为单机模式

将集群模式变成单机模式bin/startup.cmd 右键在记事本上打开,修改配置保存

127.0.0.1:8848/nacos出现以下页面,说明启动成功

常见的问题:
①集群环境跟改为单机环境
②端口号被占用
netstat -ano|findstr 8848;--->>>找到进程id
taskkill /pid [进程id] -f ;->>>杀死进程
或者更改nacos的端口号配置。路径:conf/application.properties
(2) linux环境安装
①下载安装包
②解压安装包 apt-get install unzip
③启动 bash startup.sh -m standalone
④开放端口号
⑤启动测试http://[公网ip]:8848/nacos

二, Nacos使用
①引入Spring-cloud-alibaba
②引入Nacos依赖
③修改配置
④远程调用
⑤测试
在父工程的pom文件中的 <dependencyManagement>引入依赖
<properties><spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version></properties><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>
在order-service和product-service中引⼊nacos依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId></dependency>
修改配置
spring:application:name: order-servicecloud:nacos:discovery:server-addr: 39.102.210.73:8848
修改代码,修改为远程调用和负载均衡
package com.ABdolphin.order.service;@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;public OrderInfo selectOrderById(Integer orderId){OrderInfo orderInfo = orderMapper.selectOrderById(orderId);String url="http://product-service/product/"+orderInfo.getProductId();ProduceInfo produceInfo = restTemplate.getForObject(url, ProduceInfo.class);orderInfo.setProduceInfo(produceInfo);return orderInfo;}
}
package com.ABdolphin.order.config;@Configuration
public class BeanConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}


版本对应:版本发布说明-阿里云Spring Cloud Alibaba官网
https://sca.aliyun.com/docs/2022/overview/version-explain/
三, 服务下线


四, 权重的配置

通过修改这里的配置发现没有作用:
Nacos服务实例权重不影响流量分配的原因-微服务引擎-阿里云
https://help.aliyun.com/zh/mse/support/what-do-i-do-if-the-modified-weight-of-an-application-instance-does-not-take-effect-on-an-mse-nacos-instance
使用的应用框架有自身的负载均衡配置方式,不使用Nacos的权重属性进行负载均衡。这时就需要修改配置,增加nacos负载均衡策略
spring.nacos.loadbalancer.nacos.enabled = true
配置到order-Service里面,然后重启该项目,重新发送请求,可以发现结果符合请求

如果出现了以下错误:
报错信息:caused:errCode:500,errMsg:dometadataoperationfailed;caused: com.alibaba.nacos.consistency.exception.ConsistencyException: The Raft Group [naming_instance_metadata] did not find the Leader node;caused: The Raft Group [naming_instance_metadata] did not find the Leader node;
这是因为nacos会记录上一次集群或单机的ip地址,如果ip地址发生了改变,nacos就会报以上错误,解决方案删除nacos文件夹中data文件里面的protocol,即可解决
五, 同集群优先访问
在一定程度上也可以理解为同机房优先访问
如果不修改默认为默认集群,修改集群的方式为以下配置:
spring.cloud.nacos.discovery.cluster-name=[名称]
进行测试:
将product-Service分为不同的集群,分别为SH集群和BJ集群

将order-Service分为BJ集群

现在进行访问:可以看到只有集群BJ的实例收到了访问请求(和order-Service集群相同的实例)

这时如果将BJ的product-Service实例下线:这时就会将请求发送给其他集群的实例

六, nacos健康监测
客户端主动上报机制:
客户端通过心跳上报方式告知服务端(nacos注册中心)健康状态,默认心跳间隔5秒;
nacos会在超过15秒未收到心跳后将实例设置为不健康状态,超过30秒将实例删除
服务器反向探测机制
nacos主动探知客户端健康状态,默认间隔为20秒
健康检查失败后实例会被标记为不健康,不会被立即删除
客户端主动上报机制:针对是临时实例,而服务器反向探测机制针对的是非临时实例
Nacos服务实例类型不允许改变,如果为临时实例,不能修改为非临时实例。如果想要修改可以删除nacos/data/protocol/raft文件进行修改
① 停止nacos
②删除数据信息,即nacos/data/protocol/raft
③重启nacos
修改配置:spring.cloud.nacos.discovery.ephemeral=false

如果将order-Service线程关闭,如果下图所示,状态标记为false,但是不会立刻进行删除

七, 环境隔离
① 开发环境
② 测试环境
③ 预发布环境
④ 发布环境
开发环境的服务只能访问开发环境的。

通过更改配置,修改环境:spring.cloud.nacos.discovery.namespace=【命名空间的ID】
将order-Service修改为dev环境,但是其他的product-Service还是在public(默认环境)下的,所以就会报出来找不到product-Service错误

将product-Service修改为dev环境.就可以访问到了
八, nacos配置中心
给不同的环境进行不同的配置. 当前的代码都在代码中,如果要修改配置,还需要重新打包上线,这是一个机械化重复的步骤,这时就需要借助配置中心了
服务管理的命名空间,并不等于配置中心的命名空间
① 添加配置
② 引入相关依赖
③ 修改配置文件
(1)添加配置



1. DataID设置为项目名称
2. 配置内容的数据格式,目前只支持properties和yaml
3. 设置配置内容
(2) 添加依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- SpringCloud 2020.*之后版本需要引⼊bootstrap--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency>
(3) 修改配置文件
创建一个新的配置文件bootstrap.yml(Nacos要求 必须使用bootstrap.properties配置文件来配置NacosServer地址。先扫描bootstrap.yml配置文件再扫描application,yml配置文件,然后将两个配置文件进行整合)
spring.application.name=product-service【与DataID名称保持一致】
spring.cloud.nacos.config.server-addr=39.102.210.73:8848
spring:application:name: product-servicecloud:nacos:config:server-addr: 39.102.210.73:8848
(4) 测试
由于nacos配置文件中并没有设置命名空间,所以这里访问的默认是public下面的(但命名空间里面配置的是dev,但是这里访问的是public,由此再次证实 “服务管理的命名空间,并不等于配置中心的命名空间”)
@RefreshScope
@RestController
public class NacosController {@Value("${nacos.config}")private String config;@RequestMapping("/getConfig")public String getConfig(){return "从nacos获取配置项nacos.config:"+config;}
}

加上@RefleshScore注解,配置热更新。就可以对配置nacos配置中心里面的配置实时更新


设置命名空间:spring.cloud.nacos.config.namespace=【命名空间ID】

九. 配置中心详解
Data ID;
Nacos 融合 Spring Cloud,成为注册配置中心 | Nacos 官网
https://nacos.io/docs/v2/ecology/use-nacos-with-spring-cloud/?spm=5238cd80.2ef5001f.0.0.3f613b7ceWVn9x
微服务启动时,会从Nacos读取多个配置⽂件:
${prefix}-${spring.profiles.active}.${file-extension}
${prefix}.${file-extension}
${prefix}

判断一下这三个配置文件的优先级:

由此可见${prefix}-${spring.profiles.active}.${file-extension}优先级最高,${prefix}.${file-extension}次之.${prefix}最低
十, nacos服务部署
修改本地的配置:
首先在order-service和product-service的pom文件中增加:
<profiles><profile><id>dev</id><properties><profile.name>dev</profile.name></properties></profile><profile><id>prod</id><properties><profile.name>prod</profile.name></properties></profile></profiles>

在product-service的配置文件中,由于先读取先扫描bootstrap.yml配置文件再扫描application,yml配置文件,然后将两个配置文件进行整合。所以可以删除两文件中相同的代码,由于bootstrap.yml存在spring.profiles.active所以也可以不单独写一个总的application,yml
spring:application:name: product-serviceprofiles:active: @profile.name@cloud:nacos:config:server-addr: 39.102.210.73:8848
# namespace: 4ce3624f-bd7e-4c10-a829-684d441bf51d
server:port: 9090
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_product?characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=falseusername: rootpassword: "0304"driver-class-name: com.mysql.cj.jdbc.Drivercloud:nacos:discovery:server-addr: 39.102.210.73:8848
mybatis:configuration:map-underscore-to-camel-case: true #配置驼峰⾃动转换
server:port: 9090
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_product?characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=falseusername: rootpassword: "****"driver-class-name: com.mysql.cj.jdbc.Drivercloud:nacos:discovery:server-addr: 39.102.210.73:8848
mybatis:configuration:map-underscore-to-camel-case: true #配置驼峰⾃动转换
十一,nacos和eureka区别
①Nacos除了服务发现和注册之外,还提供了配置中⼼,流量管理和DNS服务等功能
②Eureka遵循AP原则,Nacos可以切换AP和CP模式,默认AP.
Nacos根据配置识别CP或者AP模式.如果注册Nacos的Client的节点是临时节点,那么Nacos对这个 Client节点的效果就是AP,反之是CP.AP和CP可以同时混合存在③服务发现:
Eureka:基于拉模式.EurekaClient会定期从Server拉取服务信息,有缓存,默认每30秒拉取⼀次.Nacos:基于推送模式.服务列表有变化时实时推送给订阅者,服务端和客⼾端保持⼼跳连接.
十二,完整代码链接
海豚/SpringCloud 完整代码
https://gitee.com/ABdolphin/spring-cloud/tree/master/spring-cloud-nacos
