从零部署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定义的服务注册与发现规范;因此从微服务架构的角度来看,使用NacosEureka在功能上基本一致

两者的主要区别在于:

  1. 部署方式:Eureka需要自行搭建服务,而Nacos已提供完整的服务组件,开箱即用
  2. 技术栈:二者的依赖配置和参数设置存在差异

3.1、服务注册 / 服务发现

此处项目内容与上篇Eureka编写的项目无关,也无继续使用关系,系两个相同的初始文件

3.1.1、引入alibaba依赖

在父项目pom 对应处,引入Spring Cloud Alibaba 依赖并刷新 maven

XML 复制代码
<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-serviceproduct-servic e 中引入nacos依赖

XML 复制代码
<dependency><groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

引入负载均衡Load Balance)依赖

XML 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
3.1.3、修改配置

配置Nacos 服务端地址和服务名(注意order-service 项目中把name 改为order-service):

XML 复制代码
spring
  application:
    name: product-service
  cloud:
    nacos:
      discovery:
        server-addr: 公网IP:8848

也可修改为本地Nacos 服务器地址:127.0.0.1:8848

3.1.4、远程调用
java 复制代码
@Service
public class OrderService {
    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private 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

java 复制代码
@Configuration
public class BeanConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

@LoadBalanced 是Spring Cloud提供的一个注解,用于为RestTemplate添加客户端负载均衡能力。通过该注解,RestTemplate可以自动将请求分发到多个服务实例中,实现负载均衡

3.1.5、测试

启动两个服务后,在Nacos 管理界面可以观察到 order-serviceproduct-service 均已成功注册

测试负载均衡:

按照相同步骤,创建第二个端口号为9092的程序,同时以上运行四个服务:

那么我们多次访问订单服务,观察请求会不会分配到不同的商品服务实例:127.0.0.1:8080/order/1

3.2、常见问题

3.2.1、java.net.UnknownHostException

检查是否已添加 LoadBalance依赖

XML 复制代码
<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的内置功能特性