我们在上一篇《Nacos入门指南之配置管理》介绍了使用Nacos进行配置信息的管理。下面将通过简单的示例说明如何完成服务的注册与发现。
Nacos Server
Nacos Server的部署方式,详见Nacos入门指南系列的另一篇《Nacos入门指南之部署Nacos服务端》。
服务注册与发现
接下来我们要准备两个Spring Boot应用,分别作为服务的提供者和消费者,它们在启动时,在Nacos中进行注册,服务消费者根据服务名称调用服务提供者的接口,完成服务间调用。
服务提供者(Provider)
引入依赖
首先为我们的工程引入spring-cloud-starter-alibaba-nacos-discovery
依赖。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
应用配置
然后,在bootstrap.yaml
配置文件中加入nacos server的地址。同时,在应用启动类中,需要添加@EnableDiscoveryClient
注解,以启用服务发现特性,这样在应用启动时,当前应用便可以将自己注册到注册中心,为其他微服务提供服务。
spring:
application:
name: alibaba-nacos-service-consumer
cloud:
nacos:
discovery:
server-addr: 192.168.3.201:8848
服务示例
接下来,我们添加一个获取当前日期时间的接口,以供服务消费者调用。
@RestController
public class TimeController {
@GetMapping("/now")
public String now() {
return LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME);
}
}
服务消费者(Consumer)
引入依赖
在服务消费者的pom.xml
配置中,我们除了需要添加spring-cloud-starter-alibaba-nacos-discovery
,还要加入openfeign
的依赖,通过feign client来完成服务调用。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
应用配置
与服务提供者相同,我们要在应用配置中添加nacos server的地址,并指定应用名称。
spring:
application:
name: alibaba-nacos-service-consumer
cloud:
nacos:
discovery:
server-addr: 192.168.3.201:8848
服务示例
在服务消费者中,定义TimeService接口,通过@FeignClient
注解指定该接口对应的服务名称。
@FeignClient("alibaba-nacos-service-provider")
public interface TimeService {
@RequestMapping("/now")
String now();
}
在Controller中便可以注入TimeService,通过方法调用的方式完成REST请求,极大的简化了开发。
@RestController
public class FeignController {
private TimeService timeService;
@Autowired
public void setTimeService(TimeService timeService) {
this.timeService = timeService;
}
@RequestMapping("/feign/now")
public Map<String, String> now() {
HashMap<String, String> map = new HashMap<>(2);
map.put("userId", userId);
map.put("time", timeService.now());
return map;
}
}
验证
分别启动Provider和Consumer,查看Nacos Server控制台,在服务管理->服务列表
中可以看到我们的服务已经被注册。
我们试着访问服务消费者的接口,可以看到其中的time字段其实是从服务提供者获取的。