全部产品
云市场

搭建服务网关

更新时间:2019-08-06 14:02:47

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

本地开发

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

准备工作

  • 下载 Maven 并设置环境变量。(已经操作的可略过)

  • 请您通过 下载地址 下载最新版本的 Nacos Server。(已经操作的可以略过)

  • 启动 Nacos Server

    • 解压下载的 Nacos Server 压缩包,并切换到 nacos/bin 目录。
    • Linux/Unix/Mac 类系统执行如下命令 sh startup.sh -m standalone,Windows 系统则cmd startup.cmd或者 双击 startup.cmd 运行文件

基于 Spring Cloud Gateway 搭建服务网关

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

创建服务网关

  1. 创建一个 Maven 工程,命名为spring-cloud-gateway-nacos

  2. pom.xml文件中添加 Spring Boot 和 Spring Cloud 的依赖。

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

    1. <parent>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-parent</artifactId>
    4. <version>2.1.4.RELEASE</version>
    5. <relativePath/>
    6. </parent>
    7. <dependencies>
    8. <dependency>
    9. <groupId>org.springframework.cloud</groupId>
    10. <artifactId>spring-cloud-starter-gateway</artifactId>
    11. </dependency>
    12. <dependency>
    13. <groupId>com.alibaba.cloud</groupId>
    14. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    15. <version>2.1.0.RELEASE</version>
    16. </dependency>
    17. </dependencies>
    18. <dependencyManagement>
    19. <dependencies>
    20. <dependency>
    21. <groupId>org.springframework.cloud</groupId>
    22. <artifactId>spring-cloud-dependencies</artifactId>
    23. <version>Greenwich.SR1</version>
    24. <type>pom</type>
    25. <scope>import</scope>
    26. </dependency>
    27. </dependencies>
    28. </dependencyManagement>
    29. <build>
    30. <plugins>
    31. <plugin>
    32. <groupId>org.springframework.boot</groupId>
    33. <artifactId>spring-boot-maven-plugin</artifactId>
    34. </plugin>
    35. </plugins>
    36. </build>
  3. 开发服务网关启动类GatewayApplication

    1. @SpringBootApplication
    2. @EnableDiscoveryClient
    3. public class GatewayApplication {
    4. public static void main(String[] args) {
    5. SpringApplication.run(GatewayApplication.class, args);
    6. }
    7. }
  4. application.yaml中添加如下配置,将注册中心指定为 Nacos Server 的地址。

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

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

    1. server:
    2. port: 15012
    3. spring:
    4. application:
    5. name: spring-cloud-gateway-nacos
    6. cloud:
    7. gateway: # config the routes for gateway
    8. routes:
    9. - id: service-provider # 将 /provider1/ 开头的请求转发到 provider1
    10. uri: lb://service-provider
    11. predicates:
    12. - Path=/provider1/**
    13. filters:
    14. - StripPrefix=1 # 表明前缀 /provider1 需要截取掉
    15. nacos:
    16. discovery:
    17. 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,且在详情中可以查询该服务的详情。表明网关已经启动并注册成功,接下来我们将通过创建一个下游服务来验证网关的请求转发功能。

创建服务提供者

创建一个服务提供者的应用。详情请参考快速开始

服务提供者示例:

  1. @SpringBootApplication
  2. @EnableDiscoveryClient
  3. public class ProviderApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(ProviderApplication, args);
  6. }
  7. @RestController
  8. public class EchoController {
  9. @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
  10. public String echo(@PathVariable String string) {
  11. return string;
  12. }
  13. }
  14. }

结果验证

  1. 本地验证。

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

  2. 在 EDAS 中验证。

    您可以参考快速开始中的将应用部署到 EDAS 部分,将您的应用部署到 EDAS,并验证。

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

基于 Zuul 搭建服务网关

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

创建服务网关

  1. 创建一个 Maven 工程,命名为spring-cloud-zuul-nacos

  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 版本依赖。

    1. <parent>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-parent</artifactId>
    4. <version>2.1.4.RELEASE</version>
    5. <relativePath/>
    6. </parent>
    7. <dependencies>
    8. <dependency>
    9. <groupId>org.springframework.boot</groupId>
    10. <artifactId>spring-boot-starter-webflux</artifactId>
    11. </dependency>
    12. <dependency>
    13. <groupId>org.springframework.cloud</groupId>
    14. <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    15. </dependency>
    16. <dependency>
    17. <groupId>com.alibaba.cloud</groupId>
    18. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    19. <version>2.1.0.RELEASE</version>
    20. </dependency>
    21. </dependencies>
    22. <dependencyManagement>
    23. <dependencies>
    24. <dependency>
    25. <groupId>org.springframework.cloud</groupId>
    26. <artifactId>spring-cloud-dependencies</artifactId>
    27. <version>Greenwich.SR1</version>
    28. <type>pom</type>
    29. <scope>import</scope>
    30. </dependency>
    31. </dependencies>
    32. </dependencyManagement>
    33. <build>
    34. <plugins>
    35. <plugin>
    36. <groupId>org.springframework.boot</groupId>
    37. <artifactId>spring-boot-maven-plugin</artifactId>
    38. </plugin>
    39. </plugins>
    40. </build>
  3. 开发服务网关启动类ZuulApplication

    1. @SpringBootApplication
    2. @EnableZuulProxy
    3. @EnableDiscoveryClient
    4. public class ZuulApplication {
    5. public static void main(String[] args) {
    6. SpringApplication.run(ZuulApplication.class, args);
    7. }
    8. }
  4. application.properties中添加如下配置,将注册中心指定为 Nacos Server 的地址。

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

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

    1. spring.application.name=spring-cloud-zuul-nacos
    2. server.port=18022
    3. spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
    4. zuul.routes.opensource-provider1.path=/provider1/**
    5. 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,且在详情中可以查询该服务的详情。表明网关已经启动并注册成功,接下来我们将通过创建一个下游服务来验证网关的请求转发功能。

创建服务提供者

如何快速创建一个服务提供者可参考快速开始

服务提供者启动类示例:

  1. @SpringBootApplication
  2. @EnableDiscoveryClient
  3. public class ProviderApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(ProviderApplication, args);
  6. }
  7. @RestController
  8. public class EchoController {
  9. @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
  10. public String echo(@PathVariable String string) {
  11. return string;
  12. }
  13. }
  14. }

结果验证

  1. 本地验证。

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

  2. 在 EDAS 中验证。

    您可以参考快速开始中的将应用部署到 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.0.RELEASE。Spring Cloud Finchley 对应的 Spring Cloud Alibaba 版本为 2.0.0.RELEASE,Spring Cloud Edgware 对应的 Spring Cloud Alibaba 版本为 1.5.0.RELEASE。

    说明:Spring Cloud Edgware 版本的生命周期即将在 2019 年 8 月结束,不推荐使用这个版本开发应用。

  2. 从 ANS 迁移

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