本文介绍如何基于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服务注册中心与 SAE其他组件紧密结合,为您提供一整套的微服务解决方案,包括环境隔离、灰度发布等。

您在 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。当您将应用部署到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。当您将应用部署到SAE的时候,SAE会直接替换本地Nacos Server的地址和服务端口,以及namespace、access-key、secret-key、context-path信息。您无需进行任何额外的配置,原有的配置内容可以选择保留或删除。

常见问题

示例中使用的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版本的生命周期已结束,不推荐使用这个版本开发应用。