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

为什么使用 SAE 服务注册中心

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

SAE 服务注册中心与 Nacos、Eureka 和 Consul 相比,具有以下优势:

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

您在 SAE 部署应用时,SAE服务注册中心以高优先级自动设置Nacos Server服务端地址和服务端口,以及 namespace、access-key、secret-key、context-path 等信息,无需进行任何额外的配置。

基于 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应用托管到SAE

    服务提供者示例:
    @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应用开发之搭建服务网管
    • SAE 中验证。

      SAE 服务注册中心提供了正式商用版本 Nacos Server。当您将应用部署到 SAE 的时候,SAE 会通过优先级更高的方式去设置 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应用托管到SAE
    服务提供者启动类示例:
    @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网管
    • SAE 中验证。

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

      SAE 服务注册中心提供了正式商用版本 Nacos Server。当您将应用部署到 SAE 的时候,SAE 会通过优先级更高的方式去设置 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 迁移

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