一、概述
服务注册中心: 存储服务实例和服务负载均衡策略的数据库
本文通过案例来演示Nacos服务注册与发现功能如何在Spring Cloud项目中的使用流程,下图为本文案例主要流程示意图:
二、服务提供者(nacos-provider)
服务提供方: 是指提供可复用和可调用服务的应用方
2.1、新建一个Spring Boot项目,pom.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zhoumo</groupId>
<artifactId>nacos-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
<spring-cloud-alibaba.verion>0.9.0.RELEASE</spring-cloud-alibaba.verion>
</properties>
<dependencyManagement>
<dependencies>
<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.verion}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Spring Boot Start -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Spring Boot End -->
<!-- Nacos Start -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Nacos End -->
</dependencies>
</project>
2.2、配置文件内容如下(application.yml):
server:
port: 8070
spring:
# 配置服务名称
application:
name: service-provider
# 配置 Nacos Server的地址
cloud:
nacos:
discovery:
server-addr: 192.168.145.129:8848
2.3、启动类内容如下(Application):
通过注解 @EnableDiscoveryClient
开启Nacos的服务注册与发现功能:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}
}
2.4、前端控制器内容如下(Controller):
编写一个 RestController
提供 RESTFul API 用于测试:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/provider")
public class ProviderController {
@RequestMapping("/hello")
public String Hello(){
return "Hello, This is Nacos provider!";
}
}
2.5、启动项目验证是否注册成功:
通过浏览器访问Nacos Server:http://192.168.145.129:8848/nacos;然后点击服务列表,即可查看到该服务已注册到Nacos Server上:
2.6、浏览器访问测试接口:
三、服务消费者(nacos-consumer)
服务消费方: 是指会发起对某个服务调用的应用方
由于是Spring Boot项目,所以此处在消费者端使用RestTemplate来对服务提供者
进行调用。
3.1、新建一个Spring Boot项目,pom.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zhoumo</groupId>
<artifactId>nacos-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
<spring-cloud-alibaba.verion>0.9.0.RELEASE</spring-cloud-alibaba.verion>
</properties>
<dependencyManagement>
<dependencies>
<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.verion}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Spring Boot Start -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Spring Boot End -->
<!-- Nacos Start -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Nacos End -->
</dependencies>
</project>
3.2、配置文件内容如下(application.yml):
server:
port: 8071
spring:
# 配置服务名称
application:
name: service-consumer
# 配置 Nacos Server的地址
cloud:
nacos:
discovery:
server-addr: 192.168.145.129:8848
3.3、启动类内容如下(Application):
通过注解 @EnableDiscoveryClient
开启Nacos的服务注册与发现功能:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
}
3.4、配置类内容如下(Configuration):
RestTemplate是 Spring 提供的用于访问 Rest 服务的客户端,它简化了与HTTP服务的通信方式,统一了 RESTful 的标准,封装了HTTP链接,只需传入url及返回值类型即可。相较于之前常用的HttpClient,RestTemplate是一种更优雅的调用RESTful服务的方式。
在配置类中注入RestTemplate,即可在项目中使用:
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfigure {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
3.5、前端控制器内容如下(Controller):
在Controller中,通过RestTemplate去访问服务提供者,并使用服务提供者在 Nacos Server 中注册的服务名进行访问,即可测试消费者能否以服务名通过 Nacos Server 发现服务提供者。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
private final RestTemplate restTemplate;
@Autowired
public ConsumerController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@RequestMapping("/hello")
public String Hello(){
// 使用服务名称调用服务提供者
return restTemplate.getForObject("http://service-provider/provider/hello", String.class);
}
}
3.6、启动项目验证是否注册成功:
通过浏览器访问Nacos Server:http://192.168.145.129:8848/nacos;然后点击服务列表,即可查看到该服务已注册到Nacos Server上:
3.7、浏览器访问测试接口:
四、总结
本文通过编写服务提供者(provider)和服务消费者(consumer)模块,并将其注册到 Nacos Server 服务上,最后在服务消费者(consumer)中使用RestTemplate去调用服务提供者(provider)这一流程案例,来更好的理解Nacos的注册与发现功能,以及在项目中的使用。