1 单机安装
1.1镜像下载
docker pull nacos/nacos-server
1.2服务启动
docker run --name nacos-standalone -e MODE=standalone -p 8848:8848 -d nacos/nacos-server:latest
# e 环境变量设置 MODE系统启动方式: (集群/单机 cluster/standalone默认 cluster)
1.3验证启动成功
访问 http://localhost:8848/nacos/index.htm 进入nacos登录页则启动成功
2 Nacos使用
2.1 项目父工程的pom文件中的<dependencyManagement>中引入SpringCloudAlibaba的依赖用于管理版本
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
2.2 子项目的的pom文件中引入nacos-discovery依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2.3 子项目配置nacos地址
spring:
cloud:
nacos:
server-addr: localhost:8848
2.4重启微服务
登录nacos管理页面可以查看微服务信息
3 服务分级存储模型
一个服务可以有多个实例,这些实例如果分部在不同的机房,nacos就将同一机房内的实例划分为一个集群。以user-service为例可以形成如下分级模型图:
微服务互相访问时应该尽可能访问同集群实例,因为本地访问速度更快,当本集群内不可用时才能访问其他集群以user-service 和 order-service 为例:
杭州机房内的order-service应该优先访问同机房的user-service。
3.1微服务集群配置
在微服务配置文件application.yml中添加集群配置
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: BJ # 集群名称
启动多个微服集群名为"BJ"或"HZ"查看nacos控制台查看效果
3.2同集群优先负载均衡配置
ribbon默认的ZoneAvoidanceRule并不能实现根据同集群优先来实现负载均衡。
因此Nacos中提供了一个NacosRule的实现,可以优先从同集群中挑选实例。
以order-service调用user-service为例。
1.配置集群信息 修改order-service的application.yml文件,添加集群配置:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: BJ # 集群名称
2 修改负载均衡策略
userservice: #user-service 服务名
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
这样order-service 会优先调用'BJ'集群的user-service ,当'BJ'集群的user-service 不可用时才会调用其他集群的user-service 并提示跨集群调用,信息如下:
WARN 20148 --- [nio-8088-exec-1] c.alibaba.cloud.nacos.ribbon.NacosRule : A cross-cluster call occurs,name = userservice, clusterName = BJ, instance = [Instance{instanceId='10.4.141.8#8081#HZ#DEFAULT_GROUP@@userservice', ip='10.4.141.8', port=8081, weight=1.0, healthy=true, enabled=true, ephemeral=true, clusterName='HZ', serviceName='DEFAULT_GROUP@@userservice', metadata={preserved.register.source=SPRING_CLOUD}}]
4 权重配置
实际部署中会出现这样的场景:
服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。
但默认情况下NacosRule是同集群内随机挑选,不会考虑机器的性能问题。
因此,Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。
在nacos控制台,找到user-service的实例列表,点击编辑,即可修改权重:
权重值是0~1之间的数字,如果修改成0则永远不会被访问。 在一定情况下利用权重值可以做到平滑上线,将一部分服务的权重值调成0进行上线部署,部署成功后缓慢的调整权重值验证是否存在问题,在确定不存在bug的情况下将其他未升级的服务权重值调成0。把已经上线过的服务权重值恢复,把剩余节点上线恢复权重值即可。
5 环境隔离
Nacos提供了namespace来实现环境隔离功能。
- nacos中可以有多个namespace
- namespace下可以有group、service等
- 不同namespace之间相互隔离,例如不同namespace的服务互相不可见
5.1创建namespace
默认情况下,所有service、data、group都在同一个namespace,名为public,我们可以点击页面新增按钮,添加一个namespace:
添加成功后如下图:
5.2给微服务配置namespace
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: BJ
namespace: d5168eff-eca7-4c98-9874-7bb689312a7f # 命名空间,填ID
启动服务后可以看到服务已经在dev命名空间下
此时如果微服务不在同一个命名空间则服务不可见,不能相互调用。
6 Nacos与Eureka的区别
Nacos的服务实例分为两种类型:
- 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。
- 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。 Nacos和Eureka整体结构类似,服务注册、服务拉取、心跳等待,但是也存在一些差异:
-
Nacos与eureka的共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
-
Nacos与Eureka的区别
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式