Nacos快速入门(三):Spring Cloud Alibaba Nacos实现服务注册与发现

1、前言

Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案,目前已经加入Spring Cloud项目,跟随Spring Cloud一起维护。集成Nacos需要使用Spring Cloud Alibaba Nacos模块。

拓展阅读:Spring Cloud 加盟重量级成员Spring Cloud Alibaba,打造更符合中国国情的微服务体系

2、启动nacos服务

在上文《Nacos快速入门(二):Nacos集群安装部署》谈的了nacos的集群部署,如果你没有那么多linux机器来搭建集群,可以本地启动非集群模式nacos服务:

  • Linux/Unix/Mac:sh startup.sh -m standalone
  • Windows:cmd startup.cmd -m standalone

Windows下可以直接双击nacos/bin目录下的startup.cmd

3、搭建服务接入nacos注册中心

搭建spring boot项目nacos-spring-cloud-discovery-example,编辑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
<properties>
<spring-boot.version>2.0.4.RELEASE</spring-boot.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
<spring-cloud-alibaba.version>0.2.2.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

附录:Spring Cloud Alibaba & Spring Cloud & Spring Boot兼容版本

Spring Cloud Alibaba依赖坐标的groupId有两个,对应的版本是不一样的

  • 项目孵化期间,使用的groupIdorg.springframework.cloud,兼容版本:
Spring Boot Spring Cloud Spring Cloud Alibaba
2.1.x Greenwich 0.9.x
2.0.x Finchley 0.2.x
1.5.x Edgware 0.1.x
1.5.x Dalston 0.1.x
  • 项目孵化之后,使用的groupIdcom.alibaba.cloud,兼容版本:
Spring Cloud Version Spring Cloud Alibaba Version Spring Boot Version
-------- -------- --------
Spring Cloud Greenwich 2.1.x.RELEASE 2.1.x.RELEASE
Spring Cloud Finchley 2.0.x.RELEASE 2.0.x.RELEASE
Spring Cloud Edgware 1.5.x.RELEASE 1.5.x.RELEASE

拓展阅读:Spring Cloud Alibaba 发布第一个正式版本,顺利完成孵化!

3.1、服务创建者

第一步: 在nacos-spring-cloud-discovery-example下新建mavem模块nacos-spring-cloud-provider-example,编辑pom.xml,加入nacos服务注册发现模块依赖

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

第二步: 创建提供者应用主类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}
@Value("${server.port}")
private String port ;
@RestController
class EchoController {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {
// 返回服务端口
return "service provider,port:" + port;
}
}
}

第三步:application.properties中配置应用名称和nacos注册中心地址

1
2
3
4
server.port=8080
spring.application.name=service-provider
# nacos注册中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

第四步: 我们启动两个服务实例,启动第一个实例后,我们修改server.port=8081,然后再启动一个实例

如果不想修改配置,可以在启动参数中添加-Dserver.port=8081参数来启动

登录nacos控制台,查看服务列表:

service-provider.png

进入服务详情:
service-provider-detail.png

3.2、服务消费者

第一步: 在nacos-spring-cloud-discovery-example下新建mavem模块nacos-spring-cloud-consumer-example,编辑pom.xml,加入nacos服务注册发现模块依赖

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

第二步: 创建消费者应用主类

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
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
@RestController
public class TestController {
private final RestTemplate restTemplate;
@Autowired
public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {
// 调用服务提供者接口
return restTemplate.getForObject("http://service-provider/hello", String.class);
}
}

第三步:application.properties中配置应用名称和nacos注册中心地址

1
2
3
4
server.port=8090
spring.application.name=service-consumer
# nacos注册中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

第四步: 启动服务,查看注册中心,消费者也注册上来了

service-consumer.png

到此,服务已经全部搭建好了,完整项目结构:

nacos-discovery-project.png

4、测试

消费者调用提供者接口测试

访问消费者接口:http://127.0.0.1:8090/hello,多次访问,调用的服务提供者实例是不同的

invoke1.png

invoke2.png

服务下线测试

把8081端口的服务提供者下线,再次请求接口,只会调用8080端口服务提供者
service-provider-down.png

nacos这里做的是不很友好,服务下线成功与否控制台界面看不出来,相比之下eureka会友好些。