从零部署Nacos:替代Eureka的服务注册与服务发现基础教程
一、Nacos 简介
Nacos 是一个开源的动态服务发现、配置管理和服务管理平台,由阿里巴巴开发并贡献给开源社区。它支持服务注册与发现、动态配置管理、服务健康监测等功能,适用于微服务架构和云原生环境
核心功能
服务发现与注册
Nacos 允许服务实例注册到中心服务器,其他服务可以通过查询 Nacos 发现并调用这些实例。支持 DNS 和 RPC 两种服务发现模式
动态配置管理
提供配置中心功能,支持配置的发布、更新、删除和实时推送。配置变更时,客户端无需重启即可生效,适合多环境配置管理
服务健康监测
通过心跳机制检测服务健康状态,自动剔除异常实例,保证服务调用的可靠性
命名空间与分组
支持通过命名空间(Namespace)和分组(Group)隔离不同环境或业务的服务与配置,实现多租户管理
作为 Eureka 的替代,Nacos 可以说是目前国内开发者的首选
二、Nacos的安装
下载地址:https://github.com/alibaba/nacos/releases/tag/2.2.3
下载并解压上述红框内任意一个即可
2.1、Windows
2.1.1、解压
将下载好的压缩包解压至任意文件即可
目录介绍:
bin:
startup.cmd - Windows 平台启动脚本
startup.sh - Linux 平台启动脚本
shutdown.cmd - Windows 平台停止脚本
shutdown.sh - Linux 平台停止脚本
conf:
Nacos 配置文件目录
target:
存放Nacos应用 jar 包的目录
2.1.2、修改为单机模式
注意此模式下,是运行不了的,会一直闪退,所以我们把此处集群模式更改为单机模式
2.1.3、启动Nacos
修改为单机模式后尝试启动:
然后访问:http://127.0.0.1:8848/nacos/ 出现下图界面标识启动成功
启动 Nacos 后,系统会在当前目录下自动生成一个 logs 文件夹。错误日志的具体路径为:logs/nacos.log,可根据错误日志分辨失败的原因,主要有以下几种:
(1)未修改为单机模式
按照上方更改为单机模式即可
(2)8848端口号被占用
更改端口号或者杀掉端口号为8848的进程
修改文件:
${Nacos目录}/conf/application.properties
(3)未设置JAVA_HOME 环境变量
2.2、Linux
2.2.1、上传压缩包
创建好要上传的目录,直接将下载好的压缩包拖至Xshell命令台中,没有解压过文件的话,要先下载一下 unzip 命令:
apt-get install unzip
然后解压安装包并查看:
unzip nacos-server-2.2.3.zip
2.2.2、单机模式启动
进入/nacos/bin目录,运行下述指令(Ubuntu系统):
注意:运行前需要注意Nacos默认的启动端口号8848无其他进程占用,另外云服务器要对该端口号进行开放
bash startup.sh -m standalone//CenterOS使⽤: sh startup.sh -m standalone
启动成功后,访问Nacos链接: http://公网IP:8848/nacos 显示如下界面即启动成功
三、Nacos开箱即用
Nacos是Spring Cloud Alibaba 的核心组件,遵循Spring Cloud定义的服务注册与发现规范;因此从微服务架构的角度来看,使用Nacos与Eureka在功能上基本一致
两者的主要区别在于:
- 部署方式:Eureka需要自行搭建服务,而Nacos已提供完整的服务组件,开箱即用
- 技术栈:二者的依赖配置和参数设置存在差异
3.1、服务注册 / 服务发现
此处项目内容与上篇Eureka编写的项目无关,也无继续使用关系,系两个相同的初始文件
3.1.1、引入alibaba依赖
在父项目pom对应处,引入Spring Cloud Alibaba 依赖并刷新 maven
<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>
💡请注意:Spring Boot 和 Spring Cloud 版本存在对应关系。Spring Cloud Alibaba 同样遵循 Spring Cloud 的版本规范,引入依赖时务必确认各组件版本匹配
Spring Cloud Alibaba 与 Spring Cloud 的版本对应关系请参考官方文档:
https://sca.aliyun.com/zh-cn/docs/2022.0.0.0/overview/version-explain/
版本选择在兼容范围内可自由调整
3.1.2、引入Nacos依赖
在 order-service 和 product-service 中引入nacos依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
引入负载均衡(Load Balance)依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
3.1.3、修改配置
配置Nacos服务端地址和服务名(注意order-service项目中把name改为order-service):
springapplication:name: product-servicecloud:nacos:discovery:server-addr: 公网IP:8848
也可修改为本地Nacos服务器地址:127.0.0.1:8848
3.1.4、远程调用
@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();ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}
}
将订单服务调用商品信息的URL中写死的 127.0.0.1:9090 换成调用的服务名称 product_service
为 RestTemplate 添加负载均衡注解 @LoadBalanced
@Configuration
public class BeanConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}
@LoadBalanced 是Spring Cloud提供的一个注解,用于为RestTemplate添加客户端负载均衡能力。通过该注解,RestTemplate可以自动将请求分发到多个服务实例中,实现负载均衡
3.1.5、测试
启动两个服务后,在Nacos 管理界面可以观察到 order-service 和 product-service 均已成功注册
测试负载均衡:
按照相同步骤,创建第二个端口号为9092的程序,同时以上运行四个服务:
那么我们多次访问订单服务,观察请求会不会分配到不同的商品服务实例:127.0.0.1:8080/order/1
3.2、常见问题
3.2.1、java.net.UnknownHostException
检查是否已添加 LoadBalance 依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
3.2.2、服务注册失败
可能没有报错日志,需要检查Spring Cloud Alibaba版本是否正确
版本发布说明 | Spring Cloud Alibabahttps://sca.aliyun.com/zh-cn/docs/2022.0.0.0/overview/version-explain/
3.2.3、Client not connected, current status:STARTING
Nacos 2.0版本新增了gRPC通信支持,需要额外开放两个端口: (基于主端口8848的偏移量1000和1001)
9948端口:8848+1000
9949端口:8848+1001
另一种情况为,之前使用过Nacos并且进行远程调用,可能会导致3.2.3报错信息,导致注册的服务启动失败,此时我们尝试删除 /nacos/data/protocol 文件即可
本篇介绍了Nacos的下载方法、跨平台部署步骤、配置修改以及服务注册与实现等内容。在后续章节中,我们将继续深入探讨Nacos的内置功能特性