一、前言

Nacos 是阿里巴巴于2018年7月推出来的一个开源项目,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Nacos 提供了一组简单易用的特性集,帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管理。

其关键特性如下:

  • 服务发现和服务健康监测
  • 动态配置服务
  • 动态 DNS 服务
  • 服务及其元数据管理
  • ...

Nacos 的功能包含 Spring Cloud 组件中的 Spring Cloud EurekaSpring Cloud Config,本篇章先介绍 Nacos 的服务注册与发现功能。

二、搭建环境

Nacos 作为服务注册发现中心,其运行原理与 Spring Cloud Eureka 大致相同,都由注册中心,服务提供者,服务消费者 3 部分组成和运作。如下图:

Spring Cloud Eureka 不同的是,Nacos 服务无需开发者引入 Jar 依赖搭建,只需下载 官网 提供的安装包,解压启动即可。

强调一下,安装Nacos服务需要满足一下条件:

  1. 64 bit OS
  2. 64 bit JDK 1.8+
  3. Maven 3.2.x+

Nacos官方提供 2 种安装方式:① GitHub 上下载源码,编译安装启动,② 直接下载编译好的安装包。

笔者选择第二种,点击 Nacos releases 选择 1.4.1 版本的 .zip 文件下载。

本地解压,如下图:

执行如下命令:

1
2
3
4
5
6
7
cd nacos/bin

# windows 单机模式启动
./startup.cmd -m standalone

# linux/mac
./startup.sh -m standalone

启动成功后,打开浏览器输入 http://localhost:8848/nacos 可以访问Nacos后台管理界面,默认账户 nacos/nacos,如下图:

Nacos服务注册中心环境搭建成功。

三、实战演练

注册中心服务搭建完成,现在开始搭建服务提供者和服务消费者。我们搭建如下 3 个项目:

项目名称端口号描述
nacos-discoverypom 类型的父项目
nacos-discovery-provider18081子项目,服务提供者
nacos-discovery-consumer18082子项目,服务消费者

3.1 搭建父工程

创建名为 nacos-discovery 的 Maven 项目,修改 pom.xml 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<packaging>pom</packaging>

<dependencyManagement>
<dependencies>
<!-- spring boot 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>

<!-- spring cloud 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>

<!-- spring cloud alibaba 依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

3.2 搭建服务提供者

创建名为 nacos-discovery-provider 的 Maven 项目。

  • 修改 pom.xml 文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- nacos 服务注册与发现依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
  • 创建 application.properties:
1
2
3
4
5
6
7
8
server.port=18081
# 应用名
spring.application.name=nacos-provider
# 注册中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 连接注册中心的账号和密码
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos
  • 编写提供接口:
1
2
3
4
5
6
7
8
@RestController
public class ProviderController {

@RequestMapping("hello/{content}")
public String hello(@PathVariable("content") String content) {
return "hello, " + content;
}
}
  • 修改启动类:
1
2
3
4
5
6
7
8
@EnableDiscoveryClient
@SpringBootApplication
public class ProviderApplication {

public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}

在启动类上添加@EnableDiscoveryClient注解。

运行服务提供者,再次访问 http://localhost:8848/nacos ,效果图如下:

服务注册成功。

3.3 搭建服务消费者

创建名为 nacos-discovery-consumer 的 Maven 项目。

  • 修改 pom.xml 文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- ribbon 依赖,实现客户端负载均衡 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>

<!-- nacos 服务注册与发现依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

注意:SpringCloudAlibaba 依然采用 Ribbon 作为负载均衡客户端访问远程服务。

  • 创建 application.properties:
1
2
3
4
5
6
7
8
server.port=18082
# 应用名
spring.application.name=nacos-consumer
# 注册中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 连接注册中心的账号和密码
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos
  • 创建消费接口:
1
2
3
4
5
6
7
8
9
10
11
12
@RestController
public class ConsumerController {

@Autowired
private RestTemplate restTemplate;

@RequestMapping(value = "{content}")
public String hello(@PathVariable String content) {
// url = http://服务提供者的应用名称/接口名称/参数
return restTemplate.getForObject("http://nacos-provider/hello/" + content, String.class);
}
}
  • 修改启动类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerApplication {

public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}

@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}

在启动类上添加@EnableDiscoveryClient注解,同时创建RestTemplate实例并配置负载均衡。

启动后,我们访问消费端接口 http://localhost:18082/Nacos ,结果如下图:

消费者通过Nacos注册中心获取服务提供者的信息,成功调用其接口。

更多详细资料请点击下方的链接进行查看。

四、参考资料

  1. Nacos 官网
  2. Nacos discovery wiki