微服务之Gateway实战讲解,小白必备哦!

文章目录

    • 1、Spring Cloud GateWay概述
    • 2、Spring Cloud Gateway特性
    • 3、为什么选择GateWay
    • 4、GateWay工作流程
    • 5、环境搭建
    • 6、GateWay网关路由配置方式
    • 7、GateWay配置动态路由
    • 8、GeteWay常用Predicate(断言)
      • 8.1、After 匹配指定时间之后的请求
      • 8.2、Cookie 匹配cookie里带有指定名称和满足正则的值的请求
      • 8.3、Header 匹配header里带有指定名称和满足正则的值的请求
    • 9、GateWay过滤器(Filter)

本文源码已由 GitHub https://github.com/2335119327/SpringCloud 已经收录(内涵更多SpringCloud的Demo,有兴趣的小伙伴可以看看),之后会持续更新SpringBoot系列,欢迎Star


1、Spring Cloud GateWay概述

SpringCloud GateWay是Spring Cloud的一个全新项目,基于Spring5.0 + Spring Boot 2.0和Project Reactor等技术开发的网关,它旨在微服务架构提供一种简单有效的统一的API路由管理方式

SpringCloud GateWay 作为Spring Cloud生态系统中的网关,目标是替代Zuul,在Spring Cloud2.0以上版本,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 1.x非Reactor模式的老版本。而为了提升网关的性能,SpringCloud GateWay是基本WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty

Spring Cloud GateWay的目标提供统一的路由方式且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。

Spring Cloud GateWay官方文档

当然对于我这种英语学渣来说英文当然是看不懂的,所以给大家找到了中文文档

Spring Cloud中文文档


2、Spring Cloud Gateway特性

  • 建立在Spring Framework 5,Project Reactor和Spring Boot 2.0之上

  • 能够匹配任何请求属性上的路由。

  • 谓词和过滤器特定于路由。

  • Hystrix断路器集成。

  • Spring Cloud DiscoveryClient集成

  • 易于编写的谓词和过滤器

  • 请求速率限制

  • 路径改写

微服务之Gateway实战讲解,小白必备哦!_第1张图片


3、为什么选择GateWay

一方面因为Zuul1.0已经进入了维护阶段,而且GateWay是SpringCloud团队研发的,本着一家亲的概念,更值得信赖,而却很多功能Zuul都没有用起来也非常的简单便捷。

GateWay是基于异步非阻塞模型进行开发的,性能方面不需要担心。虽然Netflix早就发布了最新的Zuul2.x,但SpringCloud貌似没有整合计划。而且Netflix相关组件都宣布进入维护期;不知前景如何?

综合考虑GateWay是很理想的网关选择。


4、GateWay工作流程

下图从总体上概述了Spring Cloud Gateway的工作方式:

微服务之Gateway实战讲解,小白必备哦!_第2张图片

客户端向Spring Cloud Gateway发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。该处理程序通过特定于请求的过滤器链运行请求。筛选器由虚线分隔的原因是,筛选器可以在发送代理请求之前和之后运行逻辑。所有“前置”过滤器逻辑均被执行。然后发出代理请求。发出代理请求后,将运行“后”过滤器逻辑。

在没有端口的路由中定义的URI,HTTP和HTTPS URI的默认端口值分别为80和443。


5、环境搭建

创建数据库
微服务之Gateway实战讲解,小白必备哦!_第3张图片

建表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for payment
-- ----------------------------
DROP TABLE IF EXISTS `payment`;
CREATE TABLE `payment`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `serial` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of payment
-- ----------------------------
INSERT INTO `payment` VALUES (31, '皮皮虾');
INSERT INTO `payment` VALUES (32, 'Code');

SET FOREIGN_KEY_CHECKS = 1;

微服务之Gateway实战讲解,小白必备哦!_第4张图片

eureka-server为服务注册模块(服务注册中心使用的是eureka)
commons为公共模块
getaway为网关模块
8001和8003为客户模块

将8001、8003两个客户端注册进eureka,可参考Eureka入门实战讲解

注意:Gateway并不需要web依赖

在gateway模块中进行配置yml

微服务之Gateway实战讲解,小白必备哦!_第5张图片

启动测试
微服务之Gateway实战讲解,小白必备哦!_第6张图片


6、GateWay网关路由配置方式

1、配置文件yml配置

2、代码中注入RouteLocator的Bean

以下我们用百度新闻为例
微服务之Gateway实战讲解,小白必备哦!_第7张图片

官方案例
微服务之Gateway实战讲解,小白必备哦!_第8张图片
微服务之Gateway实战讲解,小白必备哦!_第9张图片

咋看不懂,还不会照着写嘛。没见过猪肉,难道还没见过猪跑?

微服务之Gateway实战讲解,小白必备哦!_第10张图片

@Configuration
public class GateWayConfig {

    @Bean
    public RouteLocator routes(RouteLocatorBuilder builder) {

        RouteLocatorBuilder.Builder routes = builder.routes();
        routes.route("path_route",r->r.path("/guonei").uri("https://news.baidu.com/guonei"));

        return routes.build();
    }
}

微服务之Gateway实战讲解,小白必备哦!_第11张图片

可见转发成功!

微服务之Gateway实战讲解,小白必备哦!_第12张图片
想要设置多个转发,照着写就行了,相信大家都能做到,需要注意的是:路由id不要重复

微服务之Gateway实战讲解,小白必备哦!_第13张图片


7、GateWay配置动态路由

可以看见原先的yml配置中,uri配置写死了,不够灵活,在实际开发中不会只有这一两台机器,所以这就需要配置动态路由。

微服务之Gateway实战讲解,小白必备哦!_第14张图片

默认情况下GateWay会根据注册中心的服务列表,以注册中心上的微服务名为路径创建动态路由·转发,从而实现动态路由的功能

在这里插入图片描述

微服务之Gateway实战讲解,小白必备哦!_第15张图片

微服务之Gateway实战讲解,小白必备哦!_第16张图片

动态路由实现成功!


8、GeteWay常用Predicate(断言)

微服务之Gateway实战讲解,小白必备哦!_第17张图片

微服务之Gateway实战讲解,小白必备哦!_第18张图片

8.1、After 匹配指定时间之后的请求

微服务之Gateway实战讲解,小白必备哦!_第19张图片
有图看出,时间是美国时区,我们是中国时区

设置已经经过的时间
微服务之Gateway实战讲解,小白必备哦!_第20张图片

微服务之Gateway实战讲解,小白必备哦!_第21张图片

设置还没到的时间
微服务之Gateway实战讲解,小白必备哦!_第22张图片

微服务之Gateway实战讲解,小白必备哦!_第23张图片


8.2、Cookie 匹配cookie里带有指定名称和满足正则的值的请求

微服务之Gateway实战讲解,小白必备哦!_第24张图片
Cookie route Predicate需要两个参数,一个是Cookie name,义格式正则表达式。路由规则会通过获取对应的Cookie name值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行。

微服务之Gateway实战讲解,小白必备哦!_第25张图片

微服务之Gateway实战讲解,小白必备哦!_第26张图片

在这里插入图片描述


8.3、Header 匹配header里带有指定名称和满足正则的值的请求

微服务之Gateway实战讲解,小白必备哦!_第27张图片

两个参数,一个是属性名称和一个正则表达式,这个属性值和正则表达式匹配执行。

微服务之Gateway实战讲解,小白必备哦!_第28张图片
在这里插入图片描述
在这里插入图片描述

我就讲到这里了,剩余的大家可自行参考文档进行测试不难的


9、GateWay过滤器(Filter)

Filter指的是Spring框架中GateWayFilter的实例,使用过滤器,可以在请求被路由前或者路由后对请求进行修改。

一般的过滤器,大家可自行按照文档进行配置,我们主要讲解的是自定义过滤器
微服务之Gateway实战讲解,小白必备哦!_第29张图片

需要实现GlobalFilter, Ordered 这两个接口

@Component
@Slf4j
public class MyLogGatewayFilter implements GlobalFilter, Ordered {

    //过滤
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("********come in MyLogGatewayFilter: " + new Date());

        //看有没有uname这个key
        String uname = exchange.getRequest().getQueryParams().getFirst("uname");
        if (uname == null) {
            log.info("*******用户名为null,非法用户,o(╥﹏╥)o");

            //设置状态码 HttpStatus.NOT_ACCEPTABLE (不被接受)
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            //返回
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

微服务之Gateway实战讲解,小白必备哦!_第30张图片


本文源码已由 GitHub https://github.com/2335119327/SpringCloud 已经收录(内涵更多SpringCloud的Demo,有兴趣的小伙伴可以看看),之后会持续更新SpringBoot系列,欢迎Star

觉得博主写的不错的读者大大们,可以点赞关注和收藏哦,谢谢各位!

Java学习路线目录索引
在这里插入图片描述

你可能感兴趣的:(SpringCloud,网关,过滤器,java,spring,spring,boot)