Spring Cloud 使用 Nacos 作注册中心

文章 《Spring Cloud 使用 Nacos 作配置中心》 描述了如何在 Spring Cloud 使用 Nacos 作配置中心的使用方法,本文在此基础上,使用 Nacos 作为 Spring Cloud 的注册中心。

安装 Nacos

为简单起见,这里使用单机版本的 Nacos Server 作为注册中心,安装过程可以参考 《Spring Cloud 使用 Nacos 作配置中心》

服务提供者

服务提供者在文章 《Spring Cloud 使用 Nacos 作配置中心》 源代码 springcloudstudy 基础上进行开发。其中,springcloudstudy 作为父项目,服务提供者 nacosprovider 作为子项目。

添加 nacosprovider 的依赖:

1
2
3
4
5
6
7
8
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

其中,依赖 spring-cloud-starter-alibaba-nacos-discovery 用于连接 Nacos Server 注册中心。

bootstrap.yml 配置 Nacos Server 地址,以及服务名称:

1
2
3
4
5
6
7
8
9
10
11
server:
port: 8060

spring:
application:
name: nacos-provider

cloud:
nacos:
discovery:
server-addr: localhost:8868

spring.application.name 用于配置服务名称,这个名称会在 Nacos 控制台服务列表上展示。

在 Spring Boot 启动主类添加 @EnableDiscoveryClient 注解,开启服务注册功能:

1
2
3
4
5
6
7
@SpringBootApplication
@EnableDiscoveryClient
public class NacosproviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosproviderApplication.class, args);
}
}

增加 controller 接口:

1
2
3
4
5
6
7
@RestController
public class ProviderController {
@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
public String echo(@PathVariable String string) {
return "Hello Nacos Discovery " + string;
}
}

服务消费者

添加服务消费者 nacosconsumer 的依赖:

1
2
3
4
5
6
7
8
9
10
11
12
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

其中,依赖 spring-cloud-starter-openfeign 用于使用 feign 客户端调用服务接口。

nacosconsumerbootstrap.yml 配置:

1
2
3
4
5
6
7
8
9
10
11
server:
port: 8070

spring:
application:
name: nacos-consumer

cloud:
nacos:
discovery:
server-addr: localhost:8868

其中,服务名称 spring.application.name 配置为 nacos-consumer

调用服务提供者

在启动主类添加 @EnableFeignClients 注解启用 feign 客户端的使用,添加 @EnableDiscoveryClient 注解开启服务注册功能:

1
2
3
4
5
6
7
8
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class NacosconsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosconsumerApplication.class, args);
}
}

使用注解 @FeignClient 定义 feign 客户端,将远程服务 http://nacos-provider/echo/ 映射为本地方法调用:

1
2
3
4
5
@FeignClient("nacos-provider")
public interface ProviderClient {
@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
String echo(@PathVariable String string);
}

Feign 客户端能将服务名称 nacos-provider 映射为 nacosprovider 的地址,这是由于 nacosconsumernacosprovider 都已经连接上了 Nacos Server 注册中心,nacosconsumer 可以从注册中心获取 nacosprovider 的 ip 和端口。

nacosconsumer 提供 controller 接口,以测试调用 nacosprovider 接口:

1
2
3
4
5
6
7
8
9
10
@RestController
public class ConsumerController {
@Autowired
ProviderClient providerClient;

@RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
public String echo(@PathVariable String str) {
return providerClient.echo(str);
}
}

其中,通过 @Autowired 注解,使用上面定义的 feign 客户端。可以看到 ,通过 feign 客户端,调用远程服务接口就像调用本地方法一样。

启动 nacosconsumernacosprovider 后,可以看到 Nacos 控制台服务列表显示出两个服务:

调用接口 http://127.0.0.1:8070/echo/leehao.me,返回:

Hello Nacos Discovery leehao.me

附:源代码

完整的源代码请参考:

https://github.com/haozlee/springcloudstudy

参考资料