日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

spring boot實現超輕量級網關(反向代理、轉發)的示例

瀏覽:23日期:2023-08-01 17:20:04

作者: JadePeng

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

在我們的rest服務中,需要暴露一個中間件的接口給用戶,但是需要經過rest服務的認證,這是典型的網關使用場景??梢砸刖W關組件來搞定,但是引入zuul等中間件會增加系統復雜性,這里實現一個超輕量級的網關,只實現請求轉發,認證等由rest服務的spring security來搞定。

如何進行請求轉發呢? 熟悉網絡請求的同學應該很清楚,請求無非就是請求方式、HTTP header,以及請求body,我們將這些信息取出來,透傳給轉發的url即可。

舉例:

/graphdb/** 轉發到 Graph_Server/**

獲取轉發目的地址:

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來請求。

private RequestEntity createRequestEntity(HttpServletRequest request, String url) throws URISyntaxException, IOException { String method = request.getMethod(); HttpMethod httpMethod = HttpMethod.resolve(method); MultiValueMap<String, String> 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<String, String> parseRequestHeader(HttpServletRequest request) { HttpHeaders headers = new HttpHeaders(); List<String> headerNames = Collections.list(request.getHeaderNames()); for (String headerName : headerNames) { List<String> headerValues = Collections.list(request.getHeaders(headerName)); for (String headerValue : headerValues) { headers.add(headerName, headerValue); } } return headers; }

透明轉發

最后用RestTemplate來實現請求:

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

全部代碼

以下是輕量級轉發全部代碼:

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;@Servicepublic class RoutingDelegate { public ResponseEntity<String> redirect(HttpServletRequest request, HttpServletResponse response,String routeUrl, String prefix) { try { // build up the redirect URL String redirectUrl = createRedictUrl(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 createRedictUrl(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<String, String> headers = parseRequestHeader(request); byte[] body = parseRequestBody(request); return new RequestEntity<>(body, headers, httpMethod, new URI(url)); } private ResponseEntity<String> 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<String, String> parseRequestHeader(HttpServletRequest request) { HttpHeaders headers = new HttpHeaders(); List<String> headerNames = Collections.list(request.getHeaderNames()); for (String headerName : headerNames) { List<String> headerValues = Collections.list(request.getHeaders(headerName)); for (String headerValue : headerValues) { headers.add(headerName, headerValue); } } return headers; }}

Spring 集成

Spring Controller,RequestMapping里把GET POSTPUTDELETE 支持的請求帶上,就能實現轉發了。

@RestController@RequestMapping(GraphDBController.DELEGATE_PREFIX)@Api(value = 'GraphDB', tags = { 'graphdb-Api'})public class GraphDBController { @Autowired GraphProperties graphProperties; public final static String DELEGATE_PREFIX = '/graphdb'; @Autowired private RoutingDelegate routingDelegate; @RequestMapping(value = '/**', method = {RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE}, produces = MediaType.TEXT_PLAIN_VALUE) public ResponseEntity catchAll(HttpServletRequest request, HttpServletResponse response) { return routingDelegate.redirect(request, response, graphProperties.getGraphServer(), DELEGATE_PREFIX); }}

以上就是spring boot實現超輕量級網關(反向代理、轉發)的示例的詳細內容,更多關于spring boot實現網關的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久草免费在线视频| 久久久久久久欧美精品| 国产欧美一区二区色老头| 欧美综合二区| 99日韩精品| 视频一区在线播放| 老司机精品久久| 蜜臀久久久久久久| 亚洲精品在线a| 欧美另类中文字幕 | 蜜桃精品在线| 欧美日中文字幕| 狠狠色综合网| 丝袜美腿亚洲色图| 久热综合在线亚洲精品| 亚洲深深色噜噜狠狠爱网站 | 久久av一区| 美国三级日本三级久久99| 蜜桃一区二区三区在线| 日韩免费精品| 你懂的国产精品永久在线| 精品国产欧美| 久久理论电影| 免费久久99精品国产| 日本免费新一区视频| 欧美成人aaa| 日韩高清不卡| 蜜桃tv一区二区三区| 欧美专区在线| 欧美精品三级在线| а√天堂中文在线资源8| 久久免费黄色| 亚洲三级网址| 久久精品五月| 久久国产亚洲| 视频一区欧美精品| 国产精品丝袜在线播放| xxxxx性欧美特大| 91高清一区| 亚洲精品一二| 国产成人免费| 亚洲免费婷婷| 国产精品久久久久久久久免费高清 | 欧美黑人做爰爽爽爽| 色网在线免费观看| 视频一区免费在线观看| 久久永久免费| 亚洲激情婷婷| 国产精品久久久久毛片大屁完整版| 午夜欧美巨大性欧美巨大| 亚洲伊人精品酒店| 精品视频高潮| 国产精品日韩久久久| 国产精品视频首页| 美女少妇全过程你懂的久久| 欧美一区影院| 日韩欧美午夜| 日韩精品成人在线观看| 中文字幕在线官网| 免费在线看一区| 日产精品一区二区| 日韩一区精品视频| 福利一区二区三区视频在线观看| 夜夜嗨一区二区| 美女精品视频在线| 水蜜桃久久夜色精品一区的特点| 国产福利亚洲| 免费精品视频| 在线观看精品| 国产视频一区二区在线播放| 91成人精品| 丰满少妇一区| 日韩视频1区| 国产一区二区中文| 久久wwww| 亚洲久久视频| 激情婷婷亚洲| 精品美女久久| 久久国产精品免费一区二区三区| 欧美1区免费| 成人国产综合| 日韩黄色av| 欧美精品黄色| 麻豆网站免费在线观看| 日本91福利区| 日韩视频精品在线观看| jizzjizz中国精品麻豆| 国产日韩欧美一区| 亚洲一区二区三区无吗| 久久影院一区| 国产精品久久久久蜜臀| 国产三级精品三级在线观看国产| 亚洲深夜av| 99久久视频| 国产日韩电影| 国内自拍视频一区二区三区| 日韩在线观看一区二区三区| 尤物网精品视频| 久久视频一区| 日产午夜精品一线二线三线| 麻豆一区在线| 国产精品2023| 国产日韩欧美三级| 日韩精品一区二区三区中文| 男人的天堂久久精品| 国产精品色网| japanese国产精品| 在线成人动漫av| 91精品久久久久久久久久不卡| 国产suv精品一区二区四区视频| 国产免费久久| 欧美亚洲网站| 青青国产91久久久久久| 日韩欧美精品一区二区综合视频| 蜜臀91精品一区二区三区| 老鸭窝毛片一区二区三区| 亚洲女同一区| 午夜国产精品视频免费体验区| 香蕉久久99| 亚洲网站视频| 欧美+日本+国产+在线a∨观看| 久久精品青草| 蜜桃国内精品久久久久软件9| 亚洲国产专区| 久久一区二区三区电影| 99久精品视频在线观看视频| 99精品美女| 亚洲一级影院| 国产美女一区| 亚洲一区二区三区中文字幕在线观看| 日av在线不卡| 日本v片在线高清不卡在线观看| 日韩精品视频一区二区三区| 欧美一区在线观看视频| 国产精品亚洲产品| 精品久久电影| 日韩免费高清| 激情婷婷亚洲| 蜜臀va亚洲va欧美va天堂 | 欧美日韩18| 美女性感视频久久| 国产精品久久久久久久免费观看 | 精品精品99| 欧美13videosex性极品| 99精品网站| 男人操女人的视频在线观看欧美| 亚洲精品在线a| 国产精品v日韩精品v欧美精品网站| 国产精品magnet| 国产精品黑丝在线播放| 国产综合视频| 亚洲精品无播放器在线播放| 欧美一级一区| 日本午夜精品视频在线观看| 欧美激情福利| 久久久国产亚洲精品| 国产精品老牛| 欧美在线看片| 麻豆国产欧美一区二区三区| 韩国三级一区| 中文字幕av亚洲精品一部二部 | 国产精品v一区二区三区| 最近高清中文在线字幕在线观看1| 欧美日韩中文字幕一区二区三区| 伊人国产精品| 精品五月天堂| 久久人人88| 日韩黄色av| 日韩成人精品一区二区| 午夜电影亚洲| 欧美天堂一区二区| av综合电影网站| 在线日韩成人| 91亚洲国产成人久久精品| 国产亚洲欧洲| 国产精品扒开腿做爽爽爽软件| 成人久久一区| 日日夜夜免费精品| 中文字幕高清在线播放| 亚洲一级大片| 国产色播av在线| 亚洲一区区二区| 美女国产一区二区三区| 亚洲一区二区三区免费在线观看| 国产欧美一区二区色老头| 欧美中文一区二区| 国产毛片精品| 欧美午夜不卡| 精品午夜久久| 亚洲综合福利| 欧美精选视频一区二区| 欧美一区成人| 午夜久久福利| 精品视频一二| 午夜精品影视国产一区在线麻豆| 国产精品久久久久久久久妇女| 中文欧美日韩| 精品久久电影| 日本aⅴ亚洲精品中文乱码| 久久久影院免费|