
2018年6月,Eureka2.0 宣布闭源(但是1.X版本仍然为活跃项目),同年7月份,阿里 Nacos 宣布开源,并快速成为国内最受关注开源产品。作为 Eureka 的替代,Nacos 已经成为了国内开发者的首选,目前 Nacos Star 已经突破 28K(Eureka12K)
Nacos(Dynamic Naming and Configuration Service)
在最初开源时,Nacos 选择进行内部三个产品合并统一开源(Configserver 非持久注册中心、VIPServer 持久化注册中心、Diamond 配置中心)。定位为:一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台。所以 Nacos 是一个注册中心组件,但它又不仅仅是注册中心组件。
截至目前,Nacos 几乎支持了所有的主流语言,比如 Java、Go、C++、Nodejs、Python、Scala 等。
下载地址:https://github.com/alibaba/nacos/releases
把压缩包解压到任意非中文的目录下

bin:Nacos 启停脚本startup.cmd:windows 平台的启动脚本shutdown.cmd:windows 平台的停止脚本startup.sh:Linux 平台的启动脚本shutdown.sh:Linux 平台的停止脚本conf:Nacos 配置文件target:存放 Nacos 应用的 jar 包Nacos 默认启动方式为集群,启动前需要修改配置为单机模式。
startup.cmdset MODE="cluster"
改为:
set MODE="standalone"启动非常简单,进入bin目录下,双击 startup.cmd 即可。访问 Nacos 主页 http://127.0.0.1:8848/nacos,出现以下界面,表示 Nacos 启动成功。

同理下载好压缩包,然后上传到服务器上某个目录中。
然后进入 nacos/bin 目录,输入命令:
bash startup.sh -m standalone启动成功后,像之前那样访问网站即可。
Nacos 是 SpringCloudAlibaba 的组件,SpringCloudAlibaba 遵循 SpringCloud 中定义的服务注册,服务发现规范。因此使用 Nacos 和使用 Eureka 对于微服务来说,并没有太大区别。
主要差异在于:
操作参考:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery
在父工程的 pom.xml 文件中的 <dependencyManagement> 中引入 SpringCloudAlibaba 依赖:
<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>💡 注意:SpringBoot 和 SpringCloud 的版本是有一定对应关系的。SpringCloudAlibaba 也遵循 SpringCloud 的标准,所以在引入依赖时一定要确认各个版本的对应关系。
SpringCloudAlibaba 和 SpringCloud 版本对应关系,参考官方文档,版本在一定范围内可以自由选择。
在 order-service 和 product-service 中引入 Nacos 依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>用 Nacos 时之所以要额外引入 spring-cloud-loadbalancer 依赖,是因为 Nacos 自己不提供客户端负载均衡能力。它只负责服务发现,不负责挑服务、轮询、权重策略这些 “选谁调用” 的逻辑。
因此在 Spring Boot 2.4+ 之后,必须引入:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>spring:
application:
name: product-service
cloud:
nacos:
discovery:
server-addr: 49.235.136.223:8848 # 配置nacos服务访问地址order-service 中代码修改 IP 为项目名(同前面)public OrderInfo selectOrderById(Integer orderId) {
OrderInfo orderInfo = orderMapper.selectOrderById(orderId);
String url = "http://product-service/product/"+ orderInfo.getProductId();
log.info("product-service url: " + url);
ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
orderInfo.setProductInfo(productInfo);
return orderInfo;
}2. 为 restTemplate 配置类添加负载均衡注解 @LoadBalance
@Configuration
public class BeanConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}启动一个 order-service 服务,再启动三个 product-service 服务,观察 Nacos 的管理界面,发现 order-service 和 product-service 都注册在 Nacos 上了:

测试接口:http://127.0.0.1:8080/order/1
生产环境相对是比较恶劣的,我们需要对服务的流量进行更加精细的控制。Nacos 支持多种负载均衡策略,包括权重、同机房、同地域、同环境等。
当某一个节点上接口的性能较差时,我们可以第一时间对该节点进行下线。
操作步骤:服务详情 -> 下线

点击下线后,再次请求接口,会发现该服务没有请求进来了。再次单击上线,该节点会继续收到请求。
除了下线之外也可以配置这个节点的流量权重
操作步骤:找到对应节点 -> 编辑 -> 在弹出的窗口修改权重值

每个节点默认权重为 1,修改为 0.1。
由于 SpringCloudLoadBalance 组件自身有负载均衡配置方式,所以不支持 Nacos 的权重属性配置。
我们需要开启 Nacos 的负载均衡策略,让权重配置生效。
# 开启nacos的负载均衡策略
spring:
cloud:
loadbalancer:
nacos:
enabled: true启动服务,访问多次接口,观察结果,会发现 9091 端口号的实例接收的请求明显比另外两个实例少。
注意:整体流量生效,局部流量不是严格按照设置的比例进行分配的。
Nacos 把同一个机房内的实例,划分为一个集群。所以同集群优先访问,在一定程度上也可以理解为同机房优先访问。
微服务架构中,一个服务通常有多个实例共同提供服务,这些实例可以部署在不同的机器上,这些机器可以分布在不同的机房,比如 product-service:

在微服务访问时,应尽量访问同机房的实例。当本机房内实例不可用时,才访问其他机房的实例。
比如 order-service 在上海机房,product-service 在北京和上海机房都有实例,那我们希望可以优先访问上海机房。如果上海机房没有实例,或者实例不可用,再访问北京机房的实例。通常情况下,因为同一个机房的机器属于一个局域网,局域网访问速度更快一点。

product-service 配置集群名称spring:
cloud:
nacos:
discovery:
server-addr: 49.235.136.223:8848
cluster-name: SH # 集群名称:上海集群
loadbalancer:
nacos:
enabled: true # 同样需要开启负载均衡策略重启服务,观察 Nacos 控制台,SH 集群下多了一个实例

复制 product-service 启动配置,添加 VMOption,设置 9091 和 9092 端口实例的机房为 BJ:
-Dserver.port=9091 -Dspring.cloud.nacos.discovery.cluster-name=BJ
-Dserver.port=9092 -Dspring.cloud.nacos.discovery.cluster-name=BJ观察 Nacos,在 BJ 集群下多了两个实例

2. 为 order-service 配置集群名称
spring:
cloud:
nacos:
discovery:
server-addr: 49.235.136.223:8848
cluster-name: SH # 集群名称: 上海集群
loadbalancer:
nacos:
enabled: true # 同样需要开启负载均衡策略
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。