本章将介绍怎样在 Spring 中集成 Nacos 服务,并且开启服务发现功能。
创建一个简单的标准 WEB 项目(Maven),项目结构如下图:
上图是一个标准的 WEB 项目。版本信息:
Spring 3.2.18.RELEASE
JDK 1.8 64bit
Nacos 2.2.3
nacos-spring-context 1.1.1
Tomcat 8.5.32
注意:在开始运行项目前,请先启动 Nacos 服务(如何启动 Nacos 请参考 “Nacos 快速开始” 章节)。
为了 Nacos 与 Spring 集成,我们需要在项目中引入 nacos-spring-context 依赖,如下:
<dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-spring-context</artifactId> <version>1.1.1</version> </dependency>
上面依赖 1.1.1 版本的 nacos-spring-context,而该依赖自身依赖 3.2.18.RELEASE 版的 Spring。如下图:
因此,项目完整的依赖如下:
<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 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.hxstrive.nacos</groupId> <artifactId>nacos_spring</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <dependencies> <!-- 引入 nacos 依赖 --> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-spring-context</artifactId> <version>1.1.1</version> </dependency> <!-- 引入 spring 依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.2.18.RELEASE</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> </dependencies> <build> <finalName>nacos_spring</finalName> </build> </project>
传统 Spring MVC 项目,我们需要通过 XML 来进行部分配置,因此我们在 resources 目录下面创建 application-context.xml 配置文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--配置spring创建容器时要扫描的包--> <context:component-scan base-package="com.hxstrive.nacos" /> <!--配置spring开启注解mvc的支持 默认就是开启的 ,要想让其他组件(不包含映射器、适配器、处理器)生效就必须需要配置了--> <mvc:annotation-driven /> </beans>
为了正确启动 Spring MVC 项目,我们还需要在项目的 web.xml 中配置 org.springframework.web.servlet.DispatcherServlet 控制器,如下:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>nacos-spring</display-name> <!--配置前端控制器,对浏览器发送的请求进行统一处理--> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--加载springmvc.xml配置文件的位置和名称,配置的是Spring配置--> <init-param> <!--contextConfigLocation:上下文配置路径,固定值--> <param-name>contextConfigLocation</param-name> <!--classpath:类路径,值得是Java和resources文件夹--> <!--springmvc.xml:指的是配置文件的名称:需要配置springmvc.xml,在下面--> <param-value>classpath:application-context.xml</param-value> </init-param> <!--配置启动加载--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
使用 @Configuration 注解创建一个配置类,并且添加 @EnableNacosDiscovery 注解开启 Nacos Spring 的服务发现功能:
package com.hxstrive.nacos; import com.alibaba.nacos.api.annotation.NacosProperties; import com.alibaba.nacos.spring.context.annotation.discovery.EnableNacosDiscovery; import org.springframework.context.annotation.Configuration; /** * Nacos 配置 * @author hxstrive.com */ @Configuration // 通过添加 @EnableNacosDiscovery 注解开启 Nacos Spring 的服务发现功能 @EnableNacosDiscovery(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848")) public class NacosConfiguration { }
创建一个简单的控制器,使用 @NacosInjected 注入 Nacos 的 NamingService 实例。代码如下:
package com.hxstrive.nacos; import com.alibaba.nacos.api.annotation.NacosInjected; import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.pojo.Instance; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import java.util.List; import static org.springframework.web.bind.annotation.RequestMethod.GET; /** * 服务发现控制器 * @author hxstrive.com */ @Controller @RequestMapping("discovery") public class DiscoveryController { // 使用 @NacosInjected 注入 Nacos 的 NamingService 实 @NacosInjected private NamingService namingService; @RequestMapping(value = "/get", method = GET) @ResponseBody public List<Instance> get(@RequestParam String serviceName) throws NacosException { // 获取指定服务名的所有服务列表 return namingService.getAllInstances(serviceName); } }
通过 IDEA 配置一个 Tomcat,使用 Tomcat 启动项目。项目启动成功后,调用 Nacos 服务接口注册服务
方式一:使用 CURL 发起请求,如:curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'。
方式二:使用 ApiFox 类似的工具发起 POST 请求(参考 “Nacos 简单应用”)。
此时,打开 Nacos 查看服务列表信息,如下图:
最后,通过浏览器访问 http://localhost:8080/discovery/get?serviceName=nacos.naming.serviceName 地址,获取名称为 nacos.naming.serviceName 服务的信息,如下图:
注意,服务信息注册后过一段时间会自动删除,因此要在注册服务后立即获取服务信息。