前言:
springcloud全家桶中国有个很重要的组件就是网关,在1.x版本中都是采用的zuul网关;zuul是netfix开发的一个网关组件,但在2.x版本中,zuul由于更新迭代的速度过慢,于是springcloud就自己推出了一个新的网关组件,那就是gateway。



一。gateway概念

1.gateway是什么?

gateway是在spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot2和Project Reactor等技术。gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如:反向代理、熔断、限流、重试等。

微服务架构中网关所处位置:

在这里插入图片描述

2.gateway的特性

  • 动态路由,能够匹配任何请求属性;
  • 可以对路由指定Predicate(断言)和Filter(过滤器),且易于编写;
  • 集成Hystrix的断路器功能;
  • 集成SpringCloud服务发现功能;
  • 请求限流功能;
  • 支持路径重写。

3.三大核心概念

  • Route(路由):路由是构建网关的基本模块,它有ID,目标URI,一系列的断言和过滤器组成,如果请求与断言相匹配则进行路由
  • Predicate(断言):参考的是java8的java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由
  • Filter(过滤):指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。

总结:

predicate就是我们发的匹配条件;而filter,就可以理解为一个无所不能的拦截器,有了这两个元素,再加上目标uri,就可以实现一个具体的路由了。

4.gateway工作方式

我们可以在gateway官网:https://spring.io/projects/spring-cloud-gateway得知它的工作方式:
在这里插入图片描述
客户端向Spring Cloud Gateway发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。该处理程序通过特定于请求的过滤器链运行请求。筛选器由虚线分隔的原因是,筛选器可以在发送代理请求之前和之后运行逻辑。所有“前置”过滤器逻辑均被执行。然后发出代理请求。发出代理请求后,将运行“后”过滤器逻辑。

二。gateway与zuul的区别

在这里插入图片描述
zuul模型:

在这里插入图片描述
在这里插入图片描述
gateway模型:

webFlux是什么?
在这里插入图片描述

三。编码实现

1.application.yml配置文件方式实现

首先第一步新建一个子模块,在该模块的pom.xml文件中导入gateway依赖:

<!--gateway网关 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

在application.yml配置类文件中添加以下配置:

eureka:
  client:
    serviceUrl:
      #服务注册地址
      defaultZone: http://localhost:8088/eureka/
  instance:
    #服务实例名称
    instance-id: getway-9527
    #是否暴露服务ip地址
    prefer-ip-address: true
server:
  #运行端口
  port: 9527
spring:
  application:
    #服务注册名称
    name: service-getway
  cloud:
    gateway:
      routes:
        - id: service-provider-getNumber # 路由的id,没有规定规则但要求唯一,建议配合服务名
          #匹配后提供服务的路由地址
          uri: http://localhost:8001
          predicates:
            - Path=/provider/getNumber/** # 断言,路径相匹配的进行路由(注意**为通配符)
        - id: service-provider-getInfo
          uri: http://localhost:8001
          predicates:
            - Path=/provider/getInfo  #断言,路径相匹配的进行路由

其中,标注部分为gateway新增网关配置部分:

在这里插入图片描述

最后在启动类上加上@EnableEurekaClient注解,注册服务到eureka上:

在这里插入图片描述

注意:

这里还需要剔除spring-boot-starter-web依赖:,否则会启动失败:

在这里插入图片描述

在这里插入图片描述
服务提供端8001控制器代码如下:

在这里插入图片描述

剔除后重新启动,访问服务提供端端口8001服务:

在这里插入图片描述

在这里插入图片描述
之后用网关服务9527端口访问:

在这里插入图片描述
在这里插入图片描述
均成功访问,说明网关服务已经配置成功!

2.GateWay配置类方式实现

新建一个GatewayConfig配置类,代码如下:

/**
 * @Description:以配置文件的方式来配置gateway网关转发
 * @Author :zks
 * @Date :16:53 2020/10/28
 */
@Configuration
public class GatewayConfig {

    /**
     * 访问外网淘宝网
     * @param builder
     * @return
     */
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("gateway_baidu", r -> r.path("/gateway/toTaobao")
                        .uri("http://www.taobao.com"))
                .build();//id,访问配置path,以及真正访问地址
    }
}

重新启动访问localhost:9527/gateway/toTaobao,跳转到淘宝网页面:

在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐