Spring Cloud Gateway微服务网关

开课吧樵夫2021-12-20 16:25

  在通常情况下,我们有许许多多的微服务,如果一个一个的调用就会非常麻烦,这时候如果有一个统一对外的入口,就可以简化复杂的操作,因此就有了网关。

  微服务网关是系统唯一对外的入口,介于客户端与服务器端之间,用于对请求进行鉴权、限流、路由、监控等功能。

  官网地址:https://spring.io/projects/spring-cloud-gateway

Spring Cloud Gateway微服务网关

  Gateway与Zuul对比

  Zuul是由Netflix开源的API网关,基于servlet的,使用阻塞API,它不支持任何长连接。

  Spring Cloud Gateway是Spring Cloud自己开发的开源API网关,建立在 Spring5.Reactor和Spring Boot 2之上,使用非阻塞API,支持异步开发。

  Spring Cloud Gateway是Zuul网关的替代者。只所以弃用Zuul并不是因为Zuul在功能有什么大的问题。而是因为最开始的 Zuul 是开源的,所以Spring Cloud就集成了Zuul做网关。但后来Zuul又宣布闭源,所以Spring Cloud自己开发了Spring Cloud Gateway。再后来Zuul 2.0又开源了,但Spring Cloud不再集成它了。

  重要概念

  在Spring Cloud Gateway中有三个非常重要的概念。

  route路由

  路由是网关的最基本组成,由一个路由id、一个目标地址url,一组断言工厂及一组filter组成。若断言为 true,则请求将经由filter被路由到目标url。

  predicate断言

  断言即一个条件判断,根据当前的http请求进行指定规则的匹配,比如说http请求头,请求时间等。只有当匹配上规则时,断言才为true,此时请求才会被直接路由到目标地址(目标服务器),或先路由到某过滤器链,经过层层处理后,再路由到相应的目标地址(目标服务器)。

  filter过滤器

  对请求进行处理的逻辑部分。当请求的断言为true时,会被路由到设置好的过滤器,以对请求进行处理。例如,可以为请求添加一个请求头,或添加一个请求参数,或对请求URI进行修改等。总之,就是对请求进行处理。

  网关入门案例——静态路由

  我们来实现一个用户访问spring cloud Gateway应用就直接跳转到百度主页的需求。以下两种路由的实现,目前都无需注册到Nacos,即无需Nacos依赖。

  配置路由到服务

  复制工程consumer-nacos,并重命名为gateway-config-9000.

  修改pom文件

  仅保留acturator依赖,并添加spring cloud gateway依赖。

<dependencies>
    <!--actuator依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <!--gateway 依赖-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
</dependencies>

  代码中,只需一个启动类,其它全部删除。

Spring Cloud Gateway微服务网关

  修改配置文件

server:
  port: 9000
spring:
  cloud:
    gateway:
      routes:
        # 路由id
        - id: baidu_route
          # 路由uri地址
          uri: https://www.baidu.com
          predicates:
            # 拦截所有请求
            -  Path=/**

  运行程序。

Spring Cloud Gateway微服务网关

  配置路由到百度

  复制工程gateway-config-9000.并重命名为gateway-api-9001.

  修改配置文件,去掉原来配置的路由策略,仅剩如下内容。

server:
  port: 9001

  修改启动类

  在启动类中配置路由规则。

package com.javafamily;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class GatewayApiApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApiApplication.class, args);
    }

    // 配置路由规则
    @Bean
    public RouteLocator someRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes().route(predicateSpec -> predicateSpec
                .path("/").uri("https://www.baidu.com").id("baidu_route")).build();
    }
}

  运行程序。