本文使用Nacos来实现服务发现
文章目录
概述
本文的目的是对SpringBoot服务整合Nacos,实现服务调用。
下面会创建2个 SpringBoot 项目:
- service-provider
- service-consumer
都整合Nacos,启动后可以自动注册到 Nacos 服务注册中心。
然后在service-consumer的Controller中实现对service-provider的接口调用。
步骤:
(1)创建service-provider与service-consumer,整合Nacos
(2)service-provider 中添加测试接口 “/hello”,service-consumer 中调用其 “/hello” 接口
创建服务整合Nacos
service-provider
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<!-- spring boot 版本 -->
<version>2.2.5.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>service-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>service-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 加依赖 nacos-discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!-- 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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
重点是 SpringBoot、SpringCloud、SpringCloud Alibaba 这3者的版本问题,这里使用的版本为:
- SpringBoot 2.2.5.RELEASE
- SpringCloud Hoxton.SR3
- SpringCloud Alibaba 2.2.1.RELEASE
如何确定各自的版本呢?在 SpringCloud Alibaba 项目的 wiki 文档中有所说明,地址为:https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
页面效果:
添加好依赖之后,添加相关配置:
server:
port: 8081 # 端口
spring:
application:
name: service-provider # 服务名
cloud:
nacos:
discovery:
server-addr: localhost:8848 # nacos server 地址
然后在启动类中添加注解:
...
@SpringBootApplication
@EnableDiscoveryClient // 开启服务发现
public class ServiceProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceProviderApplication.class, args);
}
}
service-consumer
依赖于 service-provider 中一致,还有添加的注解也是一样的。
只是配置有点不同,需要使用不同的端口,以及服务名称:
server:
port: 8082 # 端口
spring:
application:
name: service-consumer # 服务名
cloud:
nacos:
discovery:
server-addr: localhost:8848 # nacos server 地址
启动测试
分别启动 service-provider 与 service-consumer,启动后即可在 Nacos 控制台的服务列表中看到:
说明整合Nacos成功。
服务调用
service-provider
在 service-provider 中添加一个测试接口 /hello:
...
@RestController
public class TestController {
@GetMapping("hello")
public String hello(@RequestParam String name){
return "hello " + name;
}
}
service-consumer
在 service-consumer 中进行调用,因为需要使用 RestTemplate,所以先配置一下:
...
@Configuration
public class ConsumerConfig {
// 定义 RestTemplate Bean
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
下面开始调用:
...
@RestController
public class TestController {
// 引入 RestTemplate 和 LoadBalancerClient
@Autowired
RestTemplate restTemplate;
@Autowired
LoadBalancerClient loadBalancerClient;
@GetMapping("hello")
public String hello(@RequestParam String name) {
String result = "";
// 根据服务名获取服务实例
ServiceInstance serviceInstance = loadBalancerClient.choose("service-provider");
// 发起调用,返回调用结果
return restTemplate.getForObject(serviceInstance.getUri() + "/hello?name=" + name, String.class);
}
}
启动测试
重启 service-provider、service-consumer,访问 service-consumer 的 /hello 接口,地址:
http://localhost:8082/hello?name=nacos
返回结果为 “hello nacos”,调用成功。
本文小结
本文简单使用Nacos和springboot整合来实现一个服务的注册和发现,创建了一个消费者和一个服务者。