spring boot实现超轻量级网关(反向代理、转发)

在我们的rest服务中,需要暴露一个中间件的接口给用户,但是需要经过rest服务的认证,这是典型的网关使用场景。可以引入网关组件来搞定,但是引入zuul等中间件会增加系统复杂性,这里实现一个超轻量级的网关,只实现请求转发,认证等由rest服务的spring security来搞定。

如何进行请求转发呢? 熟悉网络请求的同学应该很清楚,请求无非就是请求方式、HTTP header,以及请求body,我们将这些信息取出来,透传给转发的url即可。

举例:

/graphdb/ 转发到 Graph_Server/

获取转发目的地址:

Copy

private String createRedictUrl(HttpServletRequest request, String routeUrl, String prefix) {
        String queryString = request.getQueryString();
        return routeUrl + request.getRequestURI().replace(prefix, "") +
                (queryString != null ? "?" + queryString : "");
    }

解析请求头和内容

然后从request中提取出header、body等内容,构造一个 RequestEntity,后续可以用 RestTemplate来请求。

Copy

private RequestEntity createRequestEntity(HttpServletRequest request, String url) throws URISyntaxException, IOException {
        String method = request.getMethod();
        HttpMethod httpMethod = HttpMethod.resolve(method);
        MultiValueMap headers = parseRequestHeader(request);
        byte[] body = parseRequestBody(request);
        return new RequestEntity<>(body, headers, httpMethod, new URI(url));
    }

    private byte[] parseRequestBody(HttpServletRequest request) throws IOException {
        InputStream inputStream = request.getInputStream();
        return StreamUtils.copyToByteArray(inputStream);
    }

    private MultiValueMap parseRequestHeader(HttpServletRequest request) {
        HttpHeaders headers = new HttpHeaders();
        List headerNames = Collections.list(request.getHeaderNames());
        for (String headerName : headerNames) {
            List headerValues = Collections.list(request.getHeaders(headerName));
            for (String headerValue : headerValues) {
                headers.add(headerName, headerValue);
            }
        }
        return headers;
    }

透明转发

最后用 RestTemplate来实现请求:

Copy

 private ResponseEntity route(RequestEntity requestEntity) {
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate.exchange(requestEntity, String.class);
    }

全部代码

以下是轻量级转发全部代码:

Copy

import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.util.MultiValueMap;
import org.springframework.util.StreamUtils;
import org.springframework.web.client.RestTemplate;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Collections;
import java.util.List;

Spring 集成

Spring Controller,RequestMapping里把GET \ POST\PUT\DELETE 支持的请求带上,就能实现转发了。

Copy

https://www.cnblogs.com/xiaoqi/p/spring-boot-route.html

Original: https://www.cnblogs.com/softidea/p/14000457.html
Author: 沧海一滴
Title: spring boot实现超轻量级网关(反向代理、转发)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/540549/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • idea使用教程-常用设置

    【1】进入设置: 【2】设置主题: 【3】编辑区的字体变大或者变小: 【4】鼠标悬浮在代码上有提示: 【5】自动导包和优化多余的包:手动导包:快捷键:alt+enter自动导包和优…

    Java 2023年6月5日
    080
  • Spring Cloud Gateway 整合 nacos

    pom.xml

    Java 2023年5月30日
    074
  • 动态规划—摘花生

    Hello Kitty想摘点花生送给她喜欢的米老鼠。 她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。 地里每个道路的交叉点上都有种着一株花生苗,上面有若干…

    Java 2023年6月7日
    095
  • CSS基础

    Css 作用:用来修饰HTML页面,设置元素的样式,让html页面更加美观 一、引入css的三种方式 1、内联定义:在对象的标记内使用 &#x8BED;&#x6CD…

    Java 2023年6月13日
    060
  • 妄撮小游戏的开发思想-Android开发资料-《妄撮(撕开美女衣服)》游戏源代码外传

    激动!想必大家一定听说过《妄撮》又名《撕开美女衣服》这个手机游戏,体验非常棒,很H很BL啊,现在很难下载到。不过今天哥在一个论坛竟然发现了这个游戏的源代码被外传,赶紧收藏,并慷慨与…

    Java 2023年5月29日
    084
  • 初来乍到,请多指教

    刚开通了博客园,会同步发一些csdn上的内容。 博客园的第一感觉就是,很朴实,很复古,有种非移动互联网时代的风格。 其次,编辑文章时,发现对导入的Markdown文档支持的很好,无…

    Java 2023年6月5日
    0107
  • 搭建 RabbitMQ Server 高可用集群

    阅读目录: 准备工作 搭建 RabbitMQ Server 单机版 RabbitMQ Server 高可用集群相关概念 搭建 RabbitMQ Server 高可用集群 *搭建 H…

    Java 2023年5月30日
    086
  • java基础篇 —— JVM,JRE和JDK有什么区别

    JVM,JRE和JDK的区别 JVMJava Virtual Machine是Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此Java语言可以实现跨平…

    Java 2023年6月5日
    091
  • Mybatis-Plus初步上手!!

    1.简介 1.1、特性 2.快速开始 3.配置日志 4.CRUD拓展 4.1、插入 4.2、更新 4.3、查询 4.4、删除 5.性能分析插件 6.条件构造器Wrapper 7.代…

    Java 2023年6月8日
    0104
  • 【每天学一点-01】 在SpringBoot项目中使用Swagger2

    今天在做毕设的时候,发现在前后端分离的情况下,去调用接口数据时很不方便,然后回想过去,和同学一起做项目的时候,他负责后端,我负责前端,当时调用他的弄好的接口可以说是非常方便,主要是…

    Java 2023年6月5日
    093
  • Mysql数据库学习

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月7日
    071
  • 使用Python定时清理运行超时的pdflatex僵尸进程

    问题 在我们之前的《基于texlive定制chemfig化学式转换Python服务镜像》定制的pdflatex在线转换的镜像已经运行在生产环境了,但是最近总有人反馈服务跑着跑着就慢…

    Java 2023年6月7日
    092
  • java基础篇 ——“==”和“equals”的区别

    首先我们应该知道的是: “==”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。 equals是Object的方…

    Java 2023年6月5日
    0133
  • 浅析关于java的一些基础问题(上篇)

    要想让一个问题变难,最基本有两种方式,即极度细化和高度抽象。对于任何语言的研究,良好的基础至关重要,本篇文章,将从极度细化的角度 来解析一些java中的基础问题,这些问题也是大部分…

    Java 2023年5月29日
    083
  • 注入属性文件的值

    按照以往的方式,我们总是直接把具体的字面量值填入代码进行字面量值的注入。如下所示: 可以看到Music定义了三个属性。其值直接填在代码里,由@Value注解注入。直觉告诉我们,这种…

    Java 2023年6月5日
    088
  • consul上注册的服务出现红叉的解决方案

    问题描述 解决方案:打开心跳机制 ###consul&#x670D;&#x52A1;&#x7AEF;&#x53E3;&#x53F7; ser…

    Java 2023年6月15日
    089
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球