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

本文源码已由 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集成

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

  • 请求速率限制

  • 路径改写

在这里插入图片描述


3、为什么选择GateWay

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

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

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


4、GateWay工作流程

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

在这里插入图片描述

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

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


5、环境搭建

创建数据库
在这里插入图片描述

建表

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;

在这里插入图片描述

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

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

注意:Gateway并不需要web依赖

在gateway模块中进行配置yml

在这里插入图片描述

启动测试
在这里插入图片描述


6、GateWay网关路由配置方式

1、配置文件yml配置

2、代码中注入RouteLocator的Bean

以下我们用百度新闻为例
在这里插入图片描述

官方案例
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

@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();
    }
}

在这里插入图片描述

可见转发成功!

在这里插入图片描述
想要设置多个转发,照着写就行了,相信大家都能做到,需要注意的是:路由id不要重复

在这里插入图片描述


7、GateWay配置动态路由

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

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

动态路由实现成功!


8、GeteWay常用Predicate(断言)

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述
有图看出,时间是美国时区,我们是中国时区

设置已经经过的时间
在这里插入图片描述

在这里插入图片描述

设置还没到的时间
在这里插入图片描述

在这里插入图片描述


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

在这里插入图片描述
Cookie route Predicate需要两个参数,一个是Cookie name,义格式正则表达式。路由规则会通过获取对应的Cookie name值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


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

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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


9、GateWay过滤器(Filter)

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

一般的过滤器,大家可自行按照文档进行配置,我们主要讲解的是自定义过滤器
在这里插入图片描述

需要实现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;
    }
}

在这里插入图片描述


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

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

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

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值