# SpringBoot 整合 Nacos 进行服务注册发现
我们首先看一下 nacos 的简单架构图:
参照上面的架构图,我们分别创建两个模块,分别是 cloud-producer-server(服务提供者)、cloud-consumer(服务消费者),职责如下:
cloud-producer-server:注册进入nacos-server,对外暴露 | |
服务cloud-consumer:注册进入nacos-server,调用 cloud-producer-server 的服务 |
创建这两个模块前,我们先声明项目的版本信息:
<properties>
<spring-boot.version>2.1.8.RELEASE</spring-boot.version>
<spring-cloud.version>Greenwich</spring-cloud.version>
<spring-cloud-alibaba.version>2.1.2.RELEASE</spring-cloud-alibaba.version>
</properties>
<!-- 只声明依赖,不引入依赖 -->
<dependencyManagement>
<dependencies>
<!-- 声明springBoot版本 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 声明springCloud版本 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 声明 springCloud Alibaba 版本 -->
<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>
</dependencies>
</dependencyManagement>
# 1、创建服务提供者 cloud-producer-server:
(1)引入 maven 依赖:
<!-- 引入阿里的nacos作为服务注册中心 --> | |
<dependency> | |
<groupId>com.alibaba.cloud</groupId> | |
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> | |
</dependency> |
如果爆红加入 <version>2.2.1.RELEASE</version>
(2)添加 nacos 相关的配置信息: 在 application.properties 配置文件指定服务名称、端口号、nacos-server 的地址信息,如下:
spring.application.name = cloud-producer-server | |
server.servlet.context-path = /${spring.application.name} | |
server.port=9000 | |
# nacos注册中心配置 | |
spring.cloud.nacos.discovery.server-addr = localhost:8848 | |
spring.cloud.nacos.discovery.namespace = d3a1cdf5-10de-4b72-9449-38b5cbe5c0d3 | |
spring.cloud.nacos.discovery.register-enabled = true |
(3)开启服务注册发现的功能: 在主 Application 启动类加入 @EnableDiscoveryClient
注解开启服务注册发现的功能,如下:
/** | |
* SpringBoot 启动类 | |
* @EnableDiscoveryClient 开启服务注册发现的功能 | |
*/ | |
@EnableDiscoveryClient | |
@SpringBootApplication | |
public class ProducerApplication { | |
public static void main(String[] args) { | |
SpringApplication.run(ProducerApplication.class, args); | |
} | |
} |
(4)实现个演示功能: cloud-producer-server 作为服务提供者注册到 nacos 中,肯定需要提供个服务来供消费者 cloud-consumer 调用,下面简单写一个演示接口:
@RestController | |
@RequestMapping(value = "/") | |
public class CloudController { | |
@PostMapping("getSum") | |
public String getSum(@RequestParam(value = "num1") Integer num1, @RequestParam(value = "num2") Integer num2) { | |
return "success:两数求和结果=" + (num1 + num2); | |
} | |
} |
(5)启动项目: 启动项目之后,我们进入 nacos 控制台,在 nacos 的 “服务管理 -> 服务列表” 的 “d3a1cdf5-10de-4b72-9449-38b5cbe5c0d3” 空间中将会发现注册进入的
cloud-producer-server 这个服务,如下图:(图中的 dreamland 就是,名字是上面配置自定义的,命名空间也是自己配置然后生成的。)
# 2、创建服务消费者 cloud-consumer
服务消费者的创建步骤与服务提供者基本一致
(1)引入 maven 依赖:
<!-- 引入阿里的nacos作为服务注册中心 --> | |
<dependency> | |
<groupId>com.alibaba.cloud</groupId> | |
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> | |
</dependency> |
(2)添加 nacos 相关的配置信息:
spring.application.name = cloud-consumer | |
server.port=9001 | |
# nacos注册中心配置 | |
spring.cloud.nacos.discovery.server-addr = localhost:8848 | |
spring.cloud.nacos.discovery.namespace = 91b5489b-d009-4725-86fa-534f760b4d04 | |
spring.cloud.nacos.discovery.register-enabled = true |
(3)开启服务注册发现的功能:
/** | |
* SpringBoot 启动类 | |
* @EnableDiscoveryClient 开启服务注册发现的功能 | |
*/ | |
@EnableDiscoveryClient | |
@SpringBootApplication | |
public class ConsumerApplication | |
{ | |
public static void main(String[] args) | |
{ | |
SpringApplication.run(ConsumerApplication.class, args); | |
} | |
} |
(4)调用服务提供方的演示功能:
cloud-producer-server 服务提供方提供一个演示功能,那我们如何调用该功能呢?其实 Nacos 集成了 Ribbon(有关 Ribbon 的详细介绍请参考这篇文章:跳转 )
,因此我们便能使用 Ribbon
的负载均衡来调用服务,步骤如下:
① 创建 RestTemplate,使用 @LoadBalanced 注解标注开启负载均衡:
@Configuration | |
public class RestConfig | |
{ | |
/** | |
* 创建 restTemplate 对象。 | |
* LoadBalanced 注解表示赋予 restTemplate 使用 Ribbon 的负载均衡的能力(一定要加上注解,否则无法远程调用) | |
*/ | |
@Bean | |
@LoadBalanced | |
public RestTemplate restTemplate(){ | |
return new RestTemplate(); | |
} | |
} |
② 通过 RestTemplate 请求远程服务地址并接收返回值
@RestController | |
@RequestMapping (value = "api/invoke") | |
public class InvokeController | |
{ | |
@Autowired | |
private RestTemplate restTemplate; | |
/** | |
* 使用 RestTemplate 进行远程服务调用,并且使用 Ribbon 进行负载均衡 | |
*/ | |
@ApiOperation (value = "RestTemplate", notes = "使用RestTemplate进行远程服务调用,并使用Ribbon进行负载均衡") | |
@GetMapping ("getByRestTemplate") | |
public String getByRestTemplate(Integer num1, Integer num2) | |
{ | |
// 第一个 cloud-producer-server 代表在 nacos 注册中心中的服务名,第二个 cloud-producer-server 代表 contextPath 配置的项目路径 | |
String url = "http://cloud-producer-server/cloud-producer-server/getSum"; | |
MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); | |
params.add("num1", num1); | |
params.add("num2", num2); | |
// 通过服务名的方式调用远程服务(非 ip 端口) | |
return restTemplate.postForObject(url, params, String.class); | |
} | |
} |
(5)启动测试,查看 nacos 注册中心控制面板情况
启动成功后将会在 nacos 中的服务列表中看到 cloud-consumer,如下图:
那么接下来就测试下服务能否调的通?访问服务消费方的 api/invoke/getByRestTemplate 接口,可以看到请求结果如下: