• 从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解析时,根据不同的对象类型,进行不同的解析校验,限于篇幅,下篇展开讲解。

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

  • 相关阅读:
    ViewPager 异常状态之 无法切换、循环切换
    PCB代工厂提供的报告,仅供参考?以实际报告为大家稍作讲解
    一个简单的响应式博客网页
    Vue3 - Pinia 状态管理,解构 store(Pinia storeToRefs API 详细使用教程)
    Linux系统安装MongoDB流程
    2024.4.2每日一题
    格式化前做好备份,内存卡数据安全无忧
    【无标题】chapter6卷积
    ChatGPT AIGC 完成Excel跨多表查找操作vlookup+indirect
    Spring Boot中Node.js的下载与Vue CLI在IDEA中的部署及使用(图文解释 简单易懂)
  • 原文地址:https://blog.csdn.net/yueyezhufeng/article/details/126934055