您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

Spring Cloud Gateway提供的简易网关实现方式,你使用过吗?

时间:2023-09-15 13:30:12  来源:  作者: Spring全家桶实战案例源码

环境:SpringBoot2.5.13

Spring Cloud Gateway提供了一个名为ProxyExchange的实用程序对象。你可以在常规Spring web处理程序中使用它作为方法参数。它通过镜像HTTP动词的方法支持基本的下游HTTP交换。在MVC中,它还支持通过forward()方法转发到本地处理程序。要使用ProxyExchange,需要在classpath中包含正确的模块(spring-cloud-gateway-mvc(3.1.5)或spring-cloud-gateway-webflux)。

下面的MVC示例将请求代理到/test下游到远程服务器:

@RestController
@SpringBootApplication
public class GatewaySampleApplication {


  @Value("${remote.home}")
  private URI home;


  @GetMapping("/test")
  public ResponseEntity<?> proxy(ProxyExchange<byte[]> proxy) throws Exception {
    return proxy.uri(home.toString() + "/image/png").get();
  }


}

下面的例子对Webflux做了相同的事情:

@RestController
@SpringBootApplication
public class GatewaySampleApplication {


  @Value("${remote.home}")
  private URI home;


  @GetMapping("/test")
  public Mono<ResponseEntity<?>> proxy(ProxyExchange<byte[]> proxy) throws Exception {
    return proxy.uri(home.toString() + "/image/png").get();
  }


}

ProxyExchange上的便利方法使处理程序方法能够发现并增强传入请求的URI路径。例如,你可能想提取路径末尾的元素并将其传递到下游:

@GetMapping("/proxy/path/**")
public ResponseEntity<?> proxyPath(ProxyExchange<byte[]> proxy) throws Exception {
  // 如这里请求的/proxy/path/666,那么这里path = 666
  String path = proxy.path("/proxy/path/");
  return proxy.uri(home.toString() + "/foos/" + path).get();
}

目标服务接口

@RestController
@RequestMapping("/business")
public class BusinessController {

  @PostMapping("/index")
  public Object index(@RequestBody Map<String ,Object> body) {
    System.out.println("业务接口接收到的内容:" + body) ;
    Map<String, Object> result = new HashMap<>() ;
    result.put("code", 0) ;
    result.put("data", "业务处理成功 - " + LocalDateTime.now().getNano()) ;
    result.put("message", "success") ;
    return result ;
  }
  
}

网关服务接口

@RestController
@RequestMapping("/proxy/api")
public class GatewayController {


  @GetMapping("")
  public Object order(@RequestHeader("token") String token, 
      Integer id, ProxyExchange<Map<String, Object>> exchange) {
    System.out.println("token = " + token + ", id = " + id) ;
    Map<String, Object> body = new HashMap<>() ;
    body.put("id", id) ;
    body.put("token", token) ;
    return exchange.uri("http://localhost:9000/business/index").body(body).post() ;
  }
  
}

调用结果

图片图片

Postman请求

控制台输出控制台输出

你还可以使用ProxyExchange的header()方法向下游响应添加header。

exchange.uri("http://localhost:9000/business/index").header("key", "123123").body(body).post() ;

你还可以通过在get()方法(以及其他方法)中添加一个mapper来操作响应头(以及响应中的其他任何内容)。mapper是一个Function,接收传入的ResponseEntity并将其转换为传出的ResponseEntity,如下:

exchange.uri("http://localhost:9000/business/index").header("key", "123123").body(body).post(result -> {
  System.out.println("Resposne Header: " + result.getHeaders()) ;
  return ResponseEntity.ok("success") ;
}) ;

对于“敏感”标头(默认情况下为cookie和authorization)和“代理”(x-forward-*)头,提供了非常好的支持,这些头不会向下游传递。如:

当我们的请求中有Authorization 请求Header信息时,默认将不会向下游传递,这是默认行为还有cookie。我们可以通过修改配置文件覆盖。

spring:
  cloud:
    gateway:
      proxy:
        sensitive:
        - ''

完毕!!!



Tags:Spring Cloud   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
监控 Spring Cloud 微服务的实践方案
一、简介Spring Cloud是一个基于Spring Boot实现的微服务框架,它提供了丰富的微服务功能,如分布式配置、服务注册与发现、服务熔断、负载均衡等。为了更好地管理和监控这样复...【详细内容】
2023-12-19  Search: Spring Cloud  点击:(142)  评论:(0)  加入收藏
彻底解决Spring Cloud Gateway中Body读取问题
在构建微服务架构时,Spring Cloud Gateway作为一个重要的微服务网关,经常需要在过滤器(Filter)中对POST请求的Body内容进行操作,如日志记录、签名验证和权限验证等。然而,由于Requ...【详细内容】
2023-11-28  Search: Spring Cloud  点击:(165)  评论:(0)  加入收藏
Spring Cloud 实现分布式实时日志分析采集的三种方案
ELK 已经成为目前最流行的集中式日志解决方案,它主要是由Beats、Logstash、Elasticsearch、Kibana等组件组成,来共同完成实时日志的收集,存储,展示等一站式的解决方案。本文将会...【详细内容】
2023-11-27  Search: Spring Cloud  点击:(193)  评论:(0)  加入收藏
十个使用Spring Cloud和Java创建微服务的实践案例
在使用Java构建微服务时,许多人认为只要学习一些微服务设计模式就足够了,比如CQRS、SAGA或每个微服务一个数据库。虽然这是正确的,但同时学习一些通用的最佳实践也是很有意义的...【详细内容】
2023-11-10  Search: Spring Cloud  点击:(210)  评论:(0)  加入收藏
四个步骤,掌握Spring Cloud Stream
随着微服务和云原生应用程序的不断发展,事件驱动架构成为了一种实现微服务之间高效通信的主流方法。在Java Spring生态系统中,Spring Cloud Stream是一个专门为事件驱动、云原...【详细内容】
2023-10-13  Search: Spring Cloud  点击:(213)  评论:(0)  加入收藏
Spring Cloud 远程调用 OpenFeign 这些知识点,能颠覆你的认知!
环境:SpringBoot2.7.12 + Spring Cloud2021.0.71. 概述Spring Cloud Openfeign是一种声明式、模板化的HTTP客户端,主要用于在Spring Cloud微服务架构中进行服务调用。相比于传...【详细内容】
2023-10-13  Search: Spring Cloud  点击:(312)  评论:(0)  加入收藏
Spring Cloud微服务架构:构建弹性和可伸缩的云原生应用
Spring Cloud是一个开源的微服务架构框架,它基于Spring Boot构建,通过一系列的组件和工具,为开发人员提供了快速构建弹性和可伸缩的云原生应用的能力。Spring Cloud的核心概念1...【详细内容】
2023-10-12  Search: Spring Cloud  点击:(327)  评论:(0)  加入收藏
你了解Spring Cloud的这些组件吗?
今天,我要和大家一起探讨一个热门的话题:Spring Cloud。如果你在Java领域有一定的开发经验,那么你一定听说过Spring Cloud,它是一套用于构建分布式系统的开发工具,今天,我们将深入...【详细内容】
2023-09-25  Search: Spring Cloud  点击:(293)  评论:(0)  加入收藏
Spring Cloud 微服务系列之 ShardingSphere-Proxy 数据库代理
ShardingSphere-Proxy是在数据库和应用程序之间起到了一个桥梁的作用,对于应用程序来说,它不需要感知ShardingSphere-Proxy的存在,依然可以使用原来的方式操作数据库。1. 简介S...【详细内容】
2023-09-19  Search: Spring Cloud  点击:(212)  评论:(0)  加入收藏
Spring Cloud Gateway提供的简易网关实现方式,你使用过吗?
环境:SpringBoot2.5.13Spring Cloud Gateway提供了一个名为ProxyExchange的实用程序对象。你可以在常规Spring web处理程序中使用它作为方法参数。它通过镜像HTTP动词的方法...【详细内容】
2023-09-15  Search: Spring Cloud  点击:(208)  评论:(0)  加入收藏
▌简易百科推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  步步运维步步坑    Tags:架构   点击:(5)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27    InfoQ  Tags:架构模式   点击:(13)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  哈啰技术  微信公众号  Tags:架构   点击:(10)  评论:(0)  加入收藏
DDD 与 CQRS 才是黄金组合
在日常工作中,你是否也遇到过下面几种情况: 使用一个已有接口进行业务开发,上线后出现严重的性能问题,被老板当众质疑:“你为什么不使用缓存接口,这个接口全部走数据库,这怎么能扛...【详细内容】
2024-03-27  dbaplus社群    Tags:DDD   点击:(11)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13    阿里云开发者  Tags:高并发   点击:(6)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  二进制跳动  微信公众号  Tags:架构设计   点击:(36)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  ijunfu  今日头条  Tags:SpringBoot   点击:(10)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  547蓝色星球    Tags:架构   点击:(115)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11    王建立  Tags:Spring Boot   点击:(124)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  互联网架构小马哥    Tags:Spring Boot   点击:(115)  评论:(0)  加入收藏
站内最新
站内热门
站内头条