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

java1234

共 4205字,需浏览 9分钟

 · 2020-08-28

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送

66套java从入门到精通实战课程分享 

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 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;
    }
}



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:

https://blog.csdn.net/llllllkkkkkooooo/article/details/108166598





     



感谢点赞支持下哈 

浏览 57
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报