SpringCloudGateWay修改请求路径,从注册中心获得服务
SpringCloudGateWay修改请求路径,从注册中心获得服务
@Resource
private DiscoveryClient disClient;
@Resource
private LoadBalancerClient loadBlance;
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String contentType;
ServiceInstance serviceInstance = null;
boolean formdataType = false;
String postBody = "";
String ip = "";
String tokenID = "";
ServerHttpRequest req = exchange.getRequest();
ServerHttpResponse rep = exchange.getResponse();
String path = req.getURI().getPath();
String port = Integer.toString(req.getURI().getPort());
URI requestUri = req.getURI();
String method = req.getMethod().name();
String schema = requestUri.getScheme();
if ((!"http".equals(schema) && !"https".equals(schema))) {
return chain.filter(exchange);
}
if (method.equals("GET") && port.equals(localPort)) {
return chain.filter(exchange);
} else if(method.equals("POST") && (path.equals("/token")||path.equals("/callMESFunctionNoAuth"))) {
chain.filter(exchange);
}
else if (method.equals("POST") && port.equals(localPort)) {
AccessRecord accessRecord = new AccessRecord();
accessRecord.setPath(requestUri.getPath());
accessRecord.setQueryString(req.getQueryParams());
exchange.getAttributes().put("startTime", System.currentTimeMillis());
ip = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();
try {
postBody = resolveBodyFromRequest(req);if (true) {
contentType = exchange.getRequest().getHeaders().getFirst("Content-Type");
if (!StringUtil.isEmpty(contentType)) {
formdataType = contentType.startsWith("multipart/form-data");
}
if (!formdataType) {
URL uri = service.getURI(auth.getFunCode());
String url = null;
if (uri != null) {
try {
serviceInstance = loadBlance.choose(uri.getApplicationName());
} catch (Exception e) {
e.printStackTrace();
}
url = schema + "://" + serviceInstance.getHost() + ":" + serviceInstance.getPort()
+ uri.getUrl(); } else {
url = schema + "://" + mesUrl + requestUri.getPath(); }
log.info("post redirect url {} ", url);
System.out.println("post redirect url {} " + url);
// postBody = exchange.getAttribute("cachedRequestBodyObject");
// 下面将请求体再次封装写回到 request 里,传到下一级.
URI eTx = URI.create(url);//修改了请求的路径
ServerHttpRequest newRequest = req.mutate().uri(eTx).build();
System.out.println(newRequest.getHeaders());
DataBuffer bodyDataBuffer = stringBuffer(postBody);
Flux<DataBuffer> bodyFlux = Flux.just(bodyDataBuffer);
newRequest = new ServerHttpRequestDecorator(newRequest) {
@Override
public Flux<DataBuffer> getBody() {
return bodyFlux;
}
};
accessRecord.setBody(formatStr(postBody));
ServerWebExchange newExchange = exchange.mutate().request(newRequest).build();
exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR,
newRequest.getURI());
exchange = newExchange; }
return returnMono(chain, exchange, accessRecord);
} else {
rep.setStatusCode(HttpStatus.FORBIDDEN);
return rep.setComplete();
} } catch (Exception e) {
log.error("IP:{},URI:{},TokenID:{},Exception:{}", ip, path, tokenID, e);
rep.setStatusCode(HttpStatus.FORBIDDEN);
return rep.setComplete();
}
}
return chain.filter(exchange);
}
SpringCloudGateWay修改请求路径,从注册中心获得服务的更多相关文章
- springcloud zuul 使用zuulfilter 修改请求路径和响应头
最近做项目有一个需求:一个网盘系统,文件存放在分布式文件系统中,之前的文件下载统一走的文件下载服务,现在需要在单文件下载的时候不需要走文件下载服务,而是直接访问文件系统上的路径,响应的时候修改响应头, ...
- Feign-请求不同注册中心的服务
场景 需要通过Feign Client请求,其他注册中心或者其他Restful服务. 临时方案 Feign 请求转为RestTemplate http请求. 优点:能适应,feign环境和非feign ...
- 搭建SpringCloud-Eureka 注册中心以及服务提供与调用 快速了解 SpringCloud-Eureka
原文地址: 搭建SpringCloud-Eureka 注册中心以及服务提供与调用 纸上得来终觉浅,绝知此事要躬行啊~果然看着很easy,自己搞起来就是各种坑~各位看官,容我慢慢道来~ 关于spr ...
- Spring Cloud 获取注册中心所有服务以及服务下的所有实例
注册中心现有服务与实例数: 在任意客户端填写如下代码: /** * import org.springframework.cloud.client.ServiceInstance; * import ...
- SpringCloud搭建注册中心与服务注册
上一篇文章<微服务注册中心原理,看这篇就够了!>介绍了注册中心的概念和原理,本文将介绍下利用Eureka搭建中心并注册服务到注册中心的过程. 本文目录 一.Eureka介绍二.搭建注册中心 ...
- SpringCloud学习(3)——Eureka服务注册中心及服务发现
Eureka概述: Eureka是Netflix的一个子模块, 也是核心模块之一.Eureka是一个基于REST的服务, 用于定位服务, 以实现云端中间层服务发现和故障转移.服务注册与发现对于微服务框 ...
- 搭建SpringCloud-Eureka 注册中心以及服务提供与调用
纸上得来终觉浅,绝知此事要躬行啊~果然看着很easy,自己搞起来就是各种坑~各位看官,容我慢慢道来~ 关于springcloud是什么我就不废话了~ Eureka Eureka(原来以为是缩写,原来 ...
- springcloud搭建服务注册中心与服务发现
1.创建服务注册中心 创建一个普通的Spring Boot工程 首先我们需要创建一个普通的Spring Boot工程,命名为eureka-server,普通到什么程度呢?就是一个starter都不需要 ...
- .netcore 微服务快速开发框架 Anno&Viper 注册中心 (服务上线下线预警通知)
1.微服务时代,服务上线先预警通知 在微服务大行其道的今天,相信很多人都用上了微服务或者是微服务的概念也已经有了一个深刻的了解.今天我们不在这里展开阐述,今天我们要说的是微服务伴侣预警通知. 2.注册 ...
随机推荐
- CodeForces1006E- Military Problem
E. Military Problem time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- postman高级应用
目录 提取接口返回值 设置动态参数 流程控制 调试 定义公共函数 外部数据文件 提取接口返回值 1.获取响应的header值 var Content-Type=postman.getResponseH ...
- layim手机版嵌入app
感觉记忆力不行了,才做了就有点忘了.先简单做下记录... 遇到的问题 需要类似微信的语音发送功能 前端发送给后端,在mogodb中用二进制存储.后端取到数据发送给我的也是blob.前端拿到数据就变了. ...
- 【Java笔试】对数据库中的分解是否为无损连接和是否保持函数依赖的判定-由牛客网试题引申-保姆式教学
[牛客网数据库原理题目]设关系模式R(A,B,C),F是R上成立的FD集,F={A→B,C→B},ρ={AB,AC}是R的一个分解,那么分解ρ()? 正确答案:C你的答案:A(错误) ( A ) 保持 ...
- 牛客国庆集训派对Day1 L New Game!(堆优化dijkstra+建图)
链接:https://ac.nowcoder.com/acm/contest/201/L来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言2097 ...
- POJ2182题解——线段树
POJ2182题解——线段树 2019-12-20 by juruoOIer 1.线段树简介(来源:百度百科) 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线 ...
- Golang 入门系列(十二)ORM框架gorm
之前在已经介绍了用的github.com/go-sql-driver/mysql 访问数据库,不太了解的可以看看之前的文章 https://www.cnblogs.com/zhangweizhong/ ...
- 数据结构学习--单链表(python)
概念 链表(linked_list)是物理存储单元上非连续的.非顺序的存储结构,数据元素的逻辑顺序 是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素的数据域 (内存空间) ,另一个是指向 ...
- Netty面试题和解答(一)
基础 TCP和UDP的区别? TCP是面向连接的(在客户端和服务器之间传输数据之前要先建立连接),UDP是无连接的(发送数据之前不需要先建立连接) TCP提供可靠的服务(通过TCP传输的数据.无差错, ...
- 基于Jenkins的开发测试全流程持续集成实践
今年一直在公司实践CI,本文将近半年来的一些实践总结一下,可能不太完善或优美,但的确初步解决了我目前所在项目组的一些痛点.当然这仅是一家之言也不够完整,后续还会深入实践和引入Kubernetes进行容 ...