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修改请求路径,从注册中心获得服务的更多相关文章

  1. springcloud zuul 使用zuulfilter 修改请求路径和响应头

    最近做项目有一个需求:一个网盘系统,文件存放在分布式文件系统中,之前的文件下载统一走的文件下载服务,现在需要在单文件下载的时候不需要走文件下载服务,而是直接访问文件系统上的路径,响应的时候修改响应头, ...

  2. Feign-请求不同注册中心的服务

    场景 需要通过Feign Client请求,其他注册中心或者其他Restful服务. 临时方案 Feign 请求转为RestTemplate http请求. 优点:能适应,feign环境和非feign ...

  3. 搭建SpringCloud-Eureka 注册中心以及服务提供与调用 快速了解 SpringCloud-Eureka

    原文地址:  搭建SpringCloud-Eureka 注册中心以及服务提供与调用   纸上得来终觉浅,绝知此事要躬行啊~果然看着很easy,自己搞起来就是各种坑~各位看官,容我慢慢道来~ 关于spr ...

  4. Spring Cloud 获取注册中心所有服务以及服务下的所有实例

    注册中心现有服务与实例数: 在任意客户端填写如下代码: /** * import org.springframework.cloud.client.ServiceInstance; * import ...

  5. SpringCloud搭建注册中心与服务注册

    上一篇文章<微服务注册中心原理,看这篇就够了!>介绍了注册中心的概念和原理,本文将介绍下利用Eureka搭建中心并注册服务到注册中心的过程. 本文目录 一.Eureka介绍二.搭建注册中心 ...

  6. SpringCloud学习(3)——Eureka服务注册中心及服务发现

    Eureka概述: Eureka是Netflix的一个子模块, 也是核心模块之一.Eureka是一个基于REST的服务, 用于定位服务, 以实现云端中间层服务发现和故障转移.服务注册与发现对于微服务框 ...

  7. 搭建SpringCloud-Eureka 注册中心以及服务提供与调用

    纸上得来终觉浅,绝知此事要躬行啊~果然看着很easy,自己搞起来就是各种坑~各位看官,容我慢慢道来~ 关于springcloud是什么我就不废话了~ Eureka  Eureka(原来以为是缩写,原来 ...

  8. springcloud搭建服务注册中心与服务发现

    1.创建服务注册中心 创建一个普通的Spring Boot工程 首先我们需要创建一个普通的Spring Boot工程,命名为eureka-server,普通到什么程度呢?就是一个starter都不需要 ...

  9. .netcore 微服务快速开发框架 Anno&Viper 注册中心 (服务上线下线预警通知)

    1.微服务时代,服务上线先预警通知 在微服务大行其道的今天,相信很多人都用上了微服务或者是微服务的概念也已经有了一个深刻的了解.今天我们不在这里展开阐述,今天我们要说的是微服务伴侣预警通知. 2.注册 ...

随机推荐

  1. 源码分析—ThreadPoolExecutor线程池三大问题及改进方案

    前言 在一次聚会中,我和一个腾讯大佬聊起了池化技术,提及到java的线程池实现问题,我说这个我懂啊,然后巴拉巴拉说了一大堆,然后腾讯大佬问我说,那你知道线程池有什么缺陷吗?我顿时哑口无言,甘拜下风,所 ...

  2. Node笔记 - process.cwd() 和 __dirname 的区别

    process.cwd() 返回工作目录  __dirname 返回脚本所在的目录位置 单看概念觉得都差不多,有种似懂非懂的感觉,那么接下用一个简单易懂的例子来理解下这两者的区别,在此之前先看一个方法 ...

  3. Android Studio 3.0下创建menu布局文件的图例

    当开始一个android app的时候,android studio项目中没有看到menu文件夹:如下所示: 当要添加一个按钮时,很多文档上都会说,通过在项目的 res/menu 目录中新增一个 XM ...

  4. 利用 Redis 来优化功能部署和错误分类

    来源:Redislabs 作者:Shabih Syed 翻译:Kevin (公众号:中间件小哥) 为了让系统运行更流畅,又避免 Knights Capital 在 2012 年犯下的 4.6 亿美元的 ...

  5. 2019年Spring Boot面试都问了什么?快看看这22道面试题!

    Spring Boot 面试题 1.什么是 Spring Boot? 2.Spring Boot 有哪些优点? 3.什么是 JavaConfig? 4.如何重新加载 Spring Boot 上的更改, ...

  6. ubuntu远程桌面软件vnc。

    http://www.linuxidc.com/Linux/2017-03/141936.htm 现在Linux是非常火的  很多人喜欢用它,界面简单,操作容易,有很多图形化工具如WinSCP可以与U ...

  7. CSDN Markdown编辑器插入代码块时不能代码高亮

    当我们点击插入代码块按钮,会提示我们在这里插入代码片,我们在三个单引号对之间输入代码后发现并没有实现代码块高亮, 如下图所示: <!DOCTYPE html> <html lang= ...

  8. Ghost手动备份、还原系统详细图文教程

    1.Ghost工具下载 https://pan.baidu.com/s/10cpRhhjJAHZb5PPZo6ghvw 2.备份.还原详细步骤请参考 https://jingyan.baidu.com ...

  9. 利用Azure虚拟机安装Dynamics 365 Customer Engagement之六:安装后端服务器

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  10. 爬b站视频直链

    本来用的api爬取的url失效了(可能是) 就换成了貌似切换不了清晰度的api接口 http://api.bilibili.com/playurl?aid=61735306&page=1&am ...