• 从0到1学SpringCloud——13 gateway RouteLocator配置路由规则


    目录

    一、前言

    二、RouteLocator

    1、自定义路由规则

    2、添加过滤器

    3、指定报文体格式


    一、前言

    在《从0到1学SpringCloud——12 gateway 动态配置网关路由规则》一文介绍了通过数据库配置断言信息来实现动态路由的方式,今天介绍通过RouteLocator如何配置路由信息。

    二、RouteLocator

    官方给出了代码样例:

    1. import static org.springframework.cloud.gateway.support.RouteMetadataUtils.CONNECT_TIMEOUT_ATTR;
    2. import static org.springframework.cloud.gateway.support.RouteMetadataUtils.RESPONSE_TIMEOUT_ATTR;
    3. @Bean
    4. public RouteLocator customRouteLocator(RouteLocatorBuilder routeBuilder){
    5. return routeBuilder.routes()
    6. .route("test1", r -> {
    7. return r.host("*.somehost.org").and().path("/somepath")
    8. .filters(f -> f.addRequestHeader("header1", "header-value-1"))
    9. .uri("http://someuri")
    10. .metadata(RESPONSE_TIMEOUT_ATTR, 200)
    11. .metadata(CONNECT_TIMEOUT_ATTR, 200);
    12. })
    13. .build();
    14. }

    这种方式比上一篇中使用PredicateDefinition要灵活的多,PredicateDefinition对参数类型有所限制,但是使用RouteLocator则灵活的多。

    1、自定义路由规则

    根据官方样例,自定义一个,代码:

    1. @Configuration
    2. public class GateWayConfig {
    3. @Bean
    4. public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder) {
    5. // 构建多个路由routes
    6. RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
    7. routes.route("zhufeng-route-msg",
    8. r -> r.path("/msg/**").and().method("POST").
    9. uri("lb://zhufeng-web-msg"));
    10. routes.route("zhufeng-route-user",
    11. r -> r.path("/user/**").and().method("GET").
    12. uri("lb://zhufeng-web-user"));
    13. // 返回所有路由规则
    14. return routes.build();
    15. }
    16. }

    先做一个简单的配置:

    创建两个微服务zhufeng-web-user、zhufeng-web-msg,启动网关

    发送 user 为前缀的GET请求时,自动路由到zhufeng-web-user微服务

    改为发送POST请求时,报错:

    发送msg为前缀到POST请求时,自动路由到zhufeng-web-msg微服务

    发送GET请求时报错:

    配置的两个路由规则已经生效,同一个路由多个规则之间通过  and 或者 or 连接。

    2、添加过滤器

    修改zhufeng-route-msg路由规则,新增过滤器:

    routes.route("zhufeng-route-msg", r -> r.path("/json").and().method("POST").filters(f -> f.prefixPath("/msg/")).uri("lb://zhufeng-web-msg"));

    当发送 json 为前缀的请求时,自动在 json 前加上 msg 前缀

    请求效果与之前的 http://127.0.0.1:9990/msg/json 相同。

    3、指定报文体格式

    1. routes.route("zhufeng-route-msg",
    2. r -> r.readBody(UserInfo.class, requestBody -> true).and().path("/msg/**").
    3. uri("lb://zhufeng-web-msg"));

    在路由信息中,可以指定readBody的格式,可以为JSONObject、XML,设置可以自定义UserInfo对象。在报文体body解析时,根据不同的对象类型,进行不同的解析校验,限于篇幅,下篇展开讲解。

    本篇中大部分代码在上一篇中已经提到,代码示例可参考上一篇。

  • 相关阅读:
    JavaScript阻塞与非阻塞
    剑指 Offer 53 - I. 在排序数组中查找数字 I
    运算符重载函数中const的作用
    前端个人实训笔记
    分布式事务:XA和Seata的XA模式 | 京东物流技术团队
    (CVPR 2019) PointConv: Deep Convolutional Networks on 3D Point Clouds
    frp使用oidc认证和搭建
    手机全自动无人直播系统,成为商家实景无人直播带货好帮手!
    8、JAVA入门——switch选择结构
    可编程 USB 转串口适配器开发板的详细接口与功能
  • 原文地址:https://blog.csdn.net/yueyezhufeng/article/details/126934055