前置文章:
Spring Cloud-Erueka服务注册
零、本文纲要
- 一、安装Nacos
- 二、Nacos服务注册&发现
- 三、Nacos服务集群&负载均衡
- 四、Nacos服务权重&命名空间
- 五、Nacos服务实例
- 六、对比Nacos和Eureka
tips:Ctrl + F快速定位所需内容进行阅读吧。
一、安装Nacos
Nacos 快速开始
- 1、Linux系统安装Nacos
1.1 Java环境准备
①下载JDK:Java Archive Downloads - Java SE 8 (oracle.com),根据自己的Linux系统实际位数下载对应压缩包即可。
②上传JDK压缩包至Linux系统,比如:/usr/local/。
③然后解压:tar -xvf jdk-8u202-linux-x64.tar.gz,重命名解压后目录文件夹名为java
# 如需复制命令,请复制此处:
tar -xvf jdk-8u202-linux-x64.tar.gz
mv jdk-8u202-linux-x64 java
④配置环境变量
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
# 如需复制命令,请复制此处:
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
⑤设置环境变量:
source /etc/profile
1.2 安装Nacos
①下载Nacos
https://github.com/alibaba/nacos/releases
②上传Nacos压缩包至Linux系统,比如:/usr/local/src/。
③解压&删除压缩包
tar -xvf nacos-server-1.4.1.tar.gz
rm -rf nacos-server-1.4.1.tar.gz
④启动Nacos
进入bin目录,启动Nacos(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
- 2、Windows系统安装Nacos
①下载Nacos压缩包
②解压Nacos压缩包
③启动Nacos
进入bin目录,启动Nacos(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
- 3、Nacos控制页面
Nacos Console: http://192.168.2.105:8848/nacos/index.html
Nacos控制页面——默认账户:nacos,默认密码:nacos
二、Nacos服务注册&发现
- 1、服务模块搭建
1.1 spring_cloud_orderservice模块:
①mapper-[I接口]OrderMapper
②pojo-[C类]Order
③service-[I接口]OrderService-[C类]OrderServiceImpl
④web-[C类]OrderController
⑤启动类-[C类]SpringCloudOrderserviceApplication
1.2 spring_cloud_userservice模块:
①mapper-[I接口]UserMapper
②pojo-[C类]User
③service-[I接口]UserService-[C类]UserServiceImpl
④web-[C类]UserController
⑤启动类-[C类]SpringCloudUserserviceApplication - 2、pom.xml配置相关依赖
顶级父模块配置依赖管理,添加spring-cloud-alibaba-dependencies相关依赖。
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2.2.5.RELEASE
pom
import
各个服务添加nacos相关依赖,spring-cloud-starter-alibaba-nacos-discovery。
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
- 3、application.yml配置nacos服务
配置order服务和user服务的application.yml文件,添加nacos服务的相关配置。其他关于server-port、datasource、application-name、mybatis、logging的配置与之前Eureka的内容一致。
# server-port
server:
port: 8081
# datasource
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
# application name
application:
name: userservice
# nacos server
cloud:
nacos:
server-addr: 127.0.0.1:8848 #nacos server address
# mybatis
mybatis:
type-aliases-package: com.stone.pojo
configuration:
map-underscore-to-camel-case: true
# logging
logging:
level:
com.stone: debug
pattern:
dateformat: yyyy-MM-dd HH:mm:ss:SSS
所以,此处我们只需将eureka-server的内容替换成nacos-server的配置即可。
- 4、启动服务模块
此时我们就可以通过Nacos控制台来查看我们启动的服务,如下:
三、Nacos服务集群&负载均衡
- 1、集群模拟
集群模拟与Eureka集群模拟一样,通过IDEA的copy configuration来配置server.port来配置不同端口的服务即可。
- 2、服务分级存储
①user服务配置集群
通过配置服务集群,来给服务进行分级存储。
Ⅰ 模拟上海(ShangHai)地区配置集群:
spring:
cloud:
nacos:
# server address
server-addr: 127.0.0.1:8848
discovery:
# cluster
cluster-name: ShangHai
Ⅱ 模拟杭州(HangZhou)地区配置集群:
spring:
cloud:
nacos:
server-addr: 127.0.0.1:8848
discovery:
cluster-name: HangZhou
②order服务配置负载均衡策略
NacosRule负载均衡策略:
Ⅰ 优先选择本地:优先选择配置指定的集群,如果指定集群未有有效可使用的服务,则使用其他集群可用服务。
Ⅱ 本地内随机。
# user-service ribbon rule
userservice:
ribbon:
# 优先选择本地,在本地内随机
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
③order服务配置服务发现集群
spring:
cloud:
nacos:
server-addr: 127.0.0.1:8848
discovery:
cluster-name: HangZhou
此时如果发生了跨集群的调用,日志内会有相应记录:A cross-cluster call occurs。
2022-03-06 16:20:15:571 WARN 36360 --- [nio-8082-exec-6] c.alibaba.cloud.nacos.ribbon.NacosRule : A cross-cluster call occurs,name = userservice, clusterName = HZ, instance = [Instance{instanceId='192.168.2.105#8084#SH#DEFAULT_GROUP@@userservice', ip='192.168.2.105', port=8084, weight=0.1, healthy=true, enabled=true, ephemeral=true, clusterName='SH', serviceName='DEFAULT_GROUP@@userservice', metadata={preserved.register.source=SPRING_CLOUD}}, Instance{instanceId='192.168.2.105#8081#SH#DEFAULT_GROUP@@userservice', ip='192.168.2.105', port=8081, weight=1.0, healthy=true, enabled=true, ephemeral=true, clusterName='SH', serviceName='DEFAULT_GROUP@@userservice', metadata={preserved.register.source=SPRING_CLOUD}}, Instance{instanceId='192.168.2.105#8083#SH#DEFAULT_GROUP@@userservice', ip='192.168.2.105', port=8083, weight=0.1, healthy=true, enabled=true, ephemeral=true, clusterName='SH', serviceName='DEFAULT_GROUP@@userservice', metadata={preserved.register.source=SPRING_CLOUD}}]
四、Nacos服务权重&命名空间
- 1、服务权重
服务权重一般配置在0-1之间,0表示无权重,则默认不会调用该服务;
使用场景:服务升级,将集群中某部分服务权重先调整为0,而后停用重启新服务。
- 2、命名空间
①数据模型
可以先看下Nacos数据模型,如下:
Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。
实际开发中,Namespace可能根据开发、测试、生产做不同划分,服务不可以跨Namespace进行调用。
②命名空间设置
命名空间ID可以不做设置,系统会默认生成UUID。
③服务模块配置指定命名空间
namespace的配置使用命名空间ID即可,不能填写自己的命名空间名(如:dev)。
spring:
cloud:
nacos:
server-addr: 127.0.0.1:8848
discovery:
cluster-name: HZ
namespace: 15740536-b11b-4e42-9f85-31686f5fb8c6
五、Nacos服务实例
Nacos一般我们仅需配置临时实例即可,以下做下了解。
- 1、临时实例
通过心跳监测,如果服务宕机不可用,则会被Nacos注册中心从服务列表中剔除; - 2、非临时实例
Nacos注册中心会主动询问,如果服务宕机不可用,不会被剔除(会等待直至服务恢复正常,或者手动被删除)。
application.yml中配置ephemeral属性,来控制临时/非临时实例,如下:
spring:
cloud:
nacos:
server-addr: 127.0.0.1:8848
discovery:
cluster-name: HZ
namespace: 15740536-b11b-4e42-9f85-31686f5fb8c6
ephemeral: false #默认为true,即为临时实例
六、对比Nacos和Eureka
- 1、共同点
①都支持 服务注册 & 服务拉取
②都支持 服务提供者 心跳方式健康检测 - 2、不同点
①Nacos支持服务端主动检测提供者状态:临时实例-心跳方式、非临时实例-主动检测;
②Nacos临时实例-异常剔除、非临时实例-不主动剔除;
③Nacos支持服务列表变更推送,服务列表及时更新;
④Nacos集群默认采用AP模式,存在非临时实例采用CP模式、
Eureka采用AP模式。
七、结尾
以上即为服务注册和发现的基础内容,感谢阅读。