Spring 开启 Nacos 服务发现

本章将介绍怎样在 Spring 中集成 Nacos 服务,并且开启服务发现功能。

准备工作

创建一个简单的标准 WEB 项目(Maven),项目结构如下图:

Spring 开启 Nacos 服务发现

上图是一个标准的 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。如下图:

Spring 开启 Nacos 服务发现

因此,项目完整的依赖如下:

<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>

配置 Nacos

使用 @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 查看服务列表信息,如下图:

Spring 开启 Nacos 服务发现

最后,通过浏览器访问 http://localhost:8080/discovery/get?serviceName=nacos.naming.serviceName  地址,获取名称为 nacos.naming.serviceName 服务的信息,如下图:

Spring 开启 Nacos 服务发现

注意,服务信息注册后过一段时间会自动删除,因此要在注册服务后立即获取服务信息。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号