spring boot实现超轻量级网关(反向代理、转发)|今亮点
来源:博客园2023-04-20 19:03:36
(资料图)
spring boot实现超轻量级网关(反向代理、转发)
原文连接 https://www.cnblogs.com/xiaoqi/p/spring-boot-route.html
在我们的rest服务中,需要暴露一个中间件的接口给用户,但是需要经过rest服务的认证,这是典型的网关使用场景。可以引入网关组件来搞定,但是引入zuul等中间件会增加系统复杂性,这里实现一个超轻量级的网关,只实现请求转发,认证等由rest服务的spring security来搞定。
如何进行请求转发呢? 熟悉网络请求的同学应该很清楚,请求无非就是请求方式、HTTP header,以及请求body,我们将这些信息取出来,透传给转发的url即可。
举例:
/router/** 转发到 businessServer/**
获取转发目的地址:
private String createRedirectUrl(HttpServletRequest request, String routeUrl, String prefix) { String queryString = request.getQueryString(); return routeUrl + request.getRequestURI().replace(prefix, "") + (queryString != null ? "?" + queryString : ""); }解析请求头和内容
然后从request中提取出header、body等内容,构造一个RequestEntity,后续可以用RestTemplate来请求。
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来实现请求:
private ResponseEntity route(RequestEntity requestEntity) { RestTemplate restTemplate = new RestTemplate(); return restTemplate.exchange(requestEntity, String.class); } 全部代码
以下是轻量级转发全部代码:
import com.jyw.router.miniapp.service.IRouterService;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;/** * @author 黑子桑 * @ClassName IRouterServiceImpl * @Description TODO * @Date 2023/4/20 13:32 **/@Servicepublic class RouterServiceImpl implements IRouterService { @Override public ResponseEntity redirect(HttpServletRequest request, HttpServletResponse response,String routeUrl, String prefix) { try { // build up the redirect URL String redirectUrl = createRedirectUrl(request,routeUrl, prefix); RequestEntity requestEntity = createRequestEntity(request, redirectUrl); return route(requestEntity); } catch (Exception e) { return new ResponseEntity("REDIRECT ERROR", HttpStatus.INTERNAL_SERVER_ERROR); } } private String createRedirectUrl(HttpServletRequest request, String routeUrl, String prefix) { String queryString = request.getQueryString(); return routeUrl + request.getRequestURI().replace(prefix, "") + (queryString != null ? "?" + queryString : ""); } 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 ResponseEntity route(RequestEntity requestEntity) { RestTemplate restTemplate = new RestTemplate(); return restTemplate.exchange(requestEntity, String.class); } 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; }}
标签:
经验分享 鸡蛋和糖能一起吃吗
经验知识 秧组词秧的组词秧字怎么组词
知识分享 斗破苍穹漫画系列完结了么
讲解百科 洛克王国里天空城的徽章怎么得到
科普知识 女生国字脸适合什么发型短发
知识库 幼儿园小朋友新年祝福语(48条)
成就事业高峰?这个精英队伍,有志者入
百科 如何评价余秋雨的泥步修行这本书
壮汉融合的文化遗产——陈氏滴水观音艾灸保健疗法
夏季吃什么水果养阴生津?葡萄是个不错的选择
凉茶≠凉的茶 喝凉了的凉茶真的健康吗?凉茶为什么不能凉着喝
国家统计局:5月份一线城市二手住宅销售价格环比下降0.4%
金科服务:拟收购佳源服务73.56%股权框架协议终止
金茂物管4.5亿元收购首置物业服务公司100%股权
旭辉控股回应大裁员:正考虑对造谣者采取必要措施
哈尔滨新增本土确诊病例3例 活动轨迹公布
哈尔滨市公布3例新增本土新冠肺炎确诊病例活动轨迹
山东深耕文化资源 推动旅游业高质量发展
今年新增952件(套)!南京大屠杀再添新证
四川非遗传承人张雄志:巧手捏面塑 指尖传非遗
10月以来我国寒潮为何如此频繁?中国气象局回应
56位残疾人士登上黄山 互利互勉共建生活希望
安徽潜山两车相撞 已致8人死亡3人受伤
上海洋山海关首次在出口货运渠道查获夹带卷烟
山西忻州古城:一城风华延续千年历史文脉
呼伦贝尔新巴尔虎右旗公布1例无症状感染者行动轨迹
西藏林芝:多彩民俗活动迎接工布新年
面对儿童不得不防的“杀手”,这把椅子很重要!
新增“53+1” 内蒙古累计本土确诊病例增至185例
- spring boot实现超轻量级网关(反向代理、转发)|今亮点
- 世界快报:仁烁光能150MW钙钛矿产线将在今年四季度投产
- 惠及11.57万人!淮安一季度为困难群众发放价格临时补贴1273万元-全球报道
- 天天微头条丨外交部:希望韩方切实遵守中韩建交联合公报精神,恪守一个中国原则,审慎处理台湾问题
- 进口新车报道:依然买不起系列 劳斯莱斯全新古思特售473万起
- 世界球精选!车银优从美国紧急回韩,因同组合队友文彬去世
- 全球时讯:凯恩股份获1家机构调研:公司一直以来采取稳慎的资金使用计划,非常注重资金的安全性和流动性(附调研问答)
- 即时看!高中英语:一纸搞定完型填空!
- 大学生靠手游代理创业风险大吗?_最新资讯
- 应急管理部:聚焦突出问题迅速开展消防安全专项整治
- 昆明公安打击破坏生物多样性犯罪 抓获130名涉案嫌疑人
- 山西朔州“11·11”较大透水事故调查报告发布 对38人问责处理
- “海关国门小卫士”竞争上岗 淘汰率接近一半
- 深圳摧毁特大品牌化妆品走私网
- 28人被问责!山西石港煤业“3·25”事故调查报告公布
- 湖南韶山以河长制带动全民治水 让每一处水面“长治久清”
- 民进会员谈反映社情民意信息工作:心怀大我 敢讲实情
- 80岁“留守”奶奶短视频诉孤独 千万网友心疼:我们陪您唠嗑
- 40年来为子弟兵送出1.3万余双布鞋和鞋垫的“布鞋奶奶”走了
- 当男幼师是什么体验?他们说:有委屈尴尬 但大部分是幸福
- 庐阳警方通报幼童坠亡事件:嫌疑人已被刑拘
- 内蒙古新增本土确诊病例53例、本土无症状感染者1例
- 哈尔滨市启动部分地区第一轮全员核酸检测
- 四川通江发生两车相撞事故 致3人死亡
- 11月谣言在“身边”,别信这些无稽之谈
- 追剧为何上瘾?你追的不是剧,而是及时满足的快感
- 对症下药“十年痼疾”,“茶博士”帮老茶园重焕生机
- 不会融化的“果冻冰块”研制成功 有望改变食物冷藏方式
- “逆行”考研=集体滑落?这结论该慎下
- 老鼠油治烫伤致孩子进ICU 害人偏方为何被奉为灵丹妙药
- 老人被野猪咬伤 打猎者赔了5万多
- 既促进生产又保护生态他用古代农耕智慧造福现代农业
- “布鞋奶奶”走了 曾亲自给部队子弟兵送鞋40年
- 试行“家长学校”“持证上岗”?可以引导但不宜“法外加槛”
- 成为“南京胖哥”后的日子:见义勇为被捅伤 他说不后悔
- “法不责众”不是健走团“占道”的护身符
- 北京五道口增设行人信号灯四面全绿时段
- 北京道路停车支持ETC无感支付
- 北京多措并举提高生物多样性 今冬将迎300万只候鸟
- 北京:建议研考考生考前14天在京备考
- 将“干部”当店名 这个口子不能开
- 北京市2022年民生实事邀市民投票
- 吸氢气就能抗癌又防衰?最新“科学”流言榜发布
- 北京:242辆京牌小客车参加司法处置
- 云南磨憨边检站中老边境缴毒逾4公斤
- 故宫博物院2022年年票紧急停售 恢复销售时间将另行公告
- 世界艾滋病日:关于艾滋病,我想和你聊聊
- 北京:保障在校体育锻炼1小时获较高认可
- 满洲里高风险地区增至6个 中国内地新冠疫苗接种超25亿剂次
- 内蒙古满洲里公布55例本土确诊病例行动轨迹
- 四川绵竹首次拍摄到野生大熊猫标记行为 划定领地或吸引异性
- 广州长隆举办“猿猴特展” 稀有“夜猴”首秀
- 满洲里对公路、铁路口岸所有环节和场地加强闭环管理
- 安徽合肥警方严打食药环知森领域违法犯罪 侦破重特大案件14起
- 北京海关今年已查获2700余批次涉嫌侵权商品
- 福建福州海警局利用无人机成功查获一起非法采矿案
- 陕西83所高校辅导员“比技能、拼实力” “以赛促学”提升专业素质
- 西安警方侦破特大制毒贩毒案 缴获成品半成品疑似毒品10余公斤
- 全球首次荒漠猫卫星颈圈跟踪研究取得新进展
- 内蒙古满洲里公布55名确诊病例详情:有26名学生
