本文介绍如何基于 Spring Cloud Gateway 和 Spring Cloud Netflix Zuul 使用 Nacos 从零搭建应用的服务网关。

服务网关为什么使用 EDAS 注册中心

EDAS 服务注册中心提供了开源 Nacos Server 的正式商用版本,使用开源版本 Spring Cloud Alibaba Nacos Discovery开发的应用可以直接使用 EDAS 提供的商业版服务注册中心。

商业版的 EDAS 服务注册中心,与开源版本的 Nacos、Eureka 和 Consul 相比,还具有以下优势:

  • 共享组件,节省了您部署运维 Nacos、Eureka 或 Consul 的成本。
  • 在服务注册和发现的调用中都进行了链路加密,保护您的服务,无需再担心服务被未授权的应用发现。
  • EDAS 服务注册中心与 EDAS 其他组件紧密结合,为您提供一整套的微服务解决方案,包括环境隔离、平滑上下线、灰度发布等。

准备工作

  • 下载 Maven 并设置环境变量。(已经操作的可略过)
  • 下载最新版本下载地址 Nacos Server。(已经操作的可以略过)
  • 启动 Nacos Server

    解压下载的 Nacos Server 压缩包,并切换到 nacos/bin 目录。

    Linux/Unix/Mac 类系统执行如下命令 sh startup.sh -m standalone,Windows 系统则cmd startup.cmd或者 双击 startup.cmd 运行文件

  • Demo 应用

    本地开发中主要描述开发中涉及的关键信息,如果您想了解完整的 Spring Cloud 程序,可下载 spring-cloud-gateway-nacosspring-cloud-zuul-nacosnacos-service-provider

  • 在本地开发应用时,可以使用 Alibaba Cloud Toolkit 插件实现本地应用和部署在 EDAS 中的应用的相互调用,即端云互联,而无需搭建 VPN,帮助您提升开发效率。详情请参见为 EDAS 应用设置端云互联

基于 Spring Cloud Gateway 搭建服务网关

介绍如何使用 Nacos 基于 Spring Cloud Gateway 从零搭建应用的服务网关。

  1. 创建服务网关。
    1. 创建命名为spring-cloud-gateway-nacos 的Maven 工程。
    2. pom.xml文件中添加 Spring Boot 和 Spring Cloud 的依赖。

      以 Spring Boot 2.1.4.RELEASE 和 Spring Cloud Greenwich.SR1 版本为例。

       <parent>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-parent</artifactId>
           <version>2.1.4.RELEASE</version>
           <relativePath/>
       </parent>
      
       <dependencies>
           <dependency>
               <groupId>org.springframework.cloud</groupId>
               <artifactId>spring-cloud-starter-gateway</artifactId>
           </dependency>
           <dependency>
               <groupId>com.alibaba.cloud</groupId>
               <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
               <version>2.1.1.RELEASE</version>
           </dependency>
       </dependencies>
      
       <dependencyManagement>
           <dependencies>
               <dependency>
                   <groupId>org.springframework.cloud</groupId>
                   <artifactId>spring-cloud-dependencies</artifactId>
                   <version>Greenwich.SR1</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>                                
    3. 开发服务网关启动类GatewayApplication
          @SpringBootApplication
          @EnableDiscoveryClient
          public class GatewayApplication {
              public static void main(String[] args) {
                  SpringApplication.run(GatewayApplication.class, args);
              }
          }                                
    4. application.yaml中添加如下配置,将注册中心指定为 Nacos Server 的地址。

      其中127.0.0.1:8848为 Nacos Server 的地址。如果您的 Nacos Server 部署在另外一台机器,则需要修改成对应的地址。

      其中 routes 配置了 Gateway 的路由转发策略,这里我们配置将所有前缀为/provider1/的请求都路由到服务名为service-provider的后端服务中。

          server:
       port: 15012
      
          spring:
       application:
              name: spring-cloud-gateway-nacos
       cloud:
              gateway: # config the routes for gateway
                routes:
                - id: service-provider          # 将 /provider1/ 开头的请求转发到 provider1
                  uri: lb://service-provider
                  predicates:
                  - Path=/provider1/**
                  filters:
                  - StripPrefix=1               # 表明前缀 /provider1 需要截取掉
              nacos:
                discovery:
                  server-addr: 127.0.0.1:8848                                
    5. 执行启动类GatewayApplication中的 main 函数,启动 Gateway。
    6. 登录本地启动的 Nacos Server 控制台 http://127.0.0.1:8848/nacos (本地 Nacos 控制台的默认用户名和密码同为 nacos),在左侧导航栏中选择服务管理 > 服务列表,可以看到服务列表中已经包含了 spring-cloud-gateway-nacos,且在详情中可以查询该服务的详情。表明网关已经启动并注册成功,接下来我们将通过创建一个下游服务来验证网关的请求转发功能。
  2. 创建服务提供者。

    创建一个服务提供者的应用,详情请参见将 Spring Cloud 应用托管到 EDAS

    服务提供者示例:
    @SpringBootApplication
    @EnableDiscoveryClient
    public class ProviderApplication {
    
        public static void main(String[] args) {
    
            SpringApplication.run(ProviderApplication, args);
        }
    
        @RestController
        public class EchoController {
            @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
            public String echo(@PathVariable String string) {
                return string;
            }
        }
    }                        
  3. 结果验证。
    • 本地验证。

      本地启动开发好的服务网关和服务提供者,通过访问 Spring Cloud Gateway 将请求转发给后端服务,可以看到调用成功的结果。

      EDAS SpringCloud应用开发之搭建服务网管
    • EDAS 中验证。

      您可以参考将 Spring Cloud 应用托管到 EDAS中的将应用部署到 EDAS 部分,将您的应用部署到 EDAS,并验证。

      EDAS 服务注册中心提供了正式商用版本 Nacos Server。当您将应用部署到 EDAS 的时候,EDAS 会通过优先级更高的方式去设置 Nacos Server 服务端地址和服务端口,以及 namespace、access-key、secret-key、context-path 信息。您无需进行任何额外的配置,原有的配置内容可以选择保留或删除。

基于 Zuul 搭建服务网关

介绍如何基于 Zuul 使用 Nacos 作为服务注册中心从零搭建应用的服务网关。

  1. 创建服务网关。
    1. 创建命名为spring-cloud-zuul-nacos的 Maven 工程。
    2. pom.xml文件中添加 Spring Boot、Spring Cloud 和 Spring Cloud Alibaba 的依赖。

      请添加 Spring Boot 2.1.4.RELEASE、Spring Cloud Greenwich.SR1 和 Spring Cloud Alibaba 0.9.0 版本依赖。

       <parent>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-parent</artifactId>
           <version>2.1.4.RELEASE</version>
           <relativePath/>
       </parent>
      
       <dependencies>
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-webflux</artifactId>
           </dependency>
      
           <dependency>
               <groupId>org.springframework.cloud</groupId>
               <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
           </dependency>
           <dependency>
               <groupId>com.alibaba.cloud</groupId>
               <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
               <version>2.1.1.RELEASE</version>
           </dependency>
       </dependencies>
      
       <dependencyManagement>
           <dependencies>
               <dependency>
                   <groupId>org.springframework.cloud</groupId>
                   <artifactId>spring-cloud-dependencies</artifactId>
                   <version>Greenwich.SR1</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>                                
    3. 开发服务网关启动类ZuulApplication
          @SpringBootApplication
          @EnableZuulProxy
          @EnableDiscoveryClient
          public class ZuulApplication {
              public static void main(String[] args) {
                  SpringApplication.run(ZuulApplication.class, args);
              }
          }                                
    4. application.properties中添加如下配置,将注册中心指定为 Nacos Server 的地址。

      其中127.0.0.1:8848为 Nacos Server 的地址。如果您的 Nacos Server 部署在另外一台机器,则需要修改成对应的地址。

      其中 routes 配置了 Zuul 的路由转发策略,这里我们配置将所有前缀为/provider1/的请求都路由到服务名为service-provider的后端服务中。

       spring.application.name=spring-cloud-zuul-nacos
       server.port=18022
      
       spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
      
       zuul.routes.opensource-provider1.path=/provider1/**
       zuul.routes.opensource-provider1.serviceId=service-provider                                
    5. 执行 spring-cloud-zuul-nacos 中的 main 函数ZuulApplication,启动服务。
    6. 登录本地启动的 Nacos Server 控制台 http://127.0.0.1:8848/nacos (本地 Nacos 控制台的默认用户名和密码同为 nacos),在左侧导航栏中选择服务管理 > 服务列表,可以看到服务列表中已经包含了 spring-cloud-zuul-nacos,且在详情中可以查询该服务的详情。表明网关已经启动并注册成功,接下来我们将通过创建一个下游服务来验证网关的请求转发功能。
  2. 创建服务提供者
    如何快速创建一个服务提供者请参见将 Spring Cloud 应用托管到 EDAS
    服务提供者启动类示例:
    @SpringBootApplication
    @EnableDiscoveryClient
    public class ProviderApplication {
    
        public static void main(String[] args) {
    
            SpringApplication.run(ProviderApplication, args);
        }
    
        @RestController
        public class EchoController {
            @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
            public String echo(@PathVariable String string) {
                return string;
            }
        }
    }                        
  3. 结果验证。
    • 本地验证。

      本地启动开发好的服务网关 Zuul 和服务提供者,通过访问 Spring Cloud Netflix Zuul 将请求转发给后端服务,可以看到调用成功的结果。

      EDAS SpringCloud应用开发之搭建Zuul网管
    • EDAS 中验证。

      您可以参考将 Spring Cloud 应用托管到 EDAS,将您的应用部署到 EDAS,并验证。

      EDAS 服务注册中心提供了正式商用版本 Nacos Server。当您将应用部署到 EDAS 的时候,EDAS 会通过优先级更高的方式去设置 Nacos Server 服务端地址和服务端口,以及 namespace、access-key、secret-key、context-path 信息。您无需进行任何额外的配置,原有的配置内容可以选择保留或删除。

FAQ

  1. 使用其他版本

    示例中使用的 Spring Cloud 版本为 Greenwich,对应的 Spring Cloud Alibaba 版本为 2.1.1.RELEASE。Spring Cloud Finchley 对应的 Spring Cloud Alibaba 版本为 2.0.1.RELEASE,Spring Cloud Edgware 对应的 Spring Cloud Alibaba 版本为 1.5.1.RELEASE。

    说明 Spring Cloud Edgware 版本的生命周期已结束,不推荐使用这个版本开发应用。
  2. 从 ANS 迁移

    EDAS 注册中心在服务端对 ANS 和 Nacos 的数据结构做了兼容,在同一个命名空间下,且 Nacos 未设置 group 时,Nacos 和 ANS 客户端可以互相发现对方注册的服务。