.Netcore 2.0 Ocelot Api网关教程(10)- Headers Transformation
本文介绍Ocelot中的请求头传递(Headers Transformation),其可以改变上游request传递给下游/下游response传递给上游的header。
1、修改ValuesController
修改WebApiA和WebApiB中ValuesController.Get()方法如下:
[HttpGet]
public IEnumerable<string> Get()
{
var headers = Request.Headers.Select(x => $"{x.Key}:{x.Value}");
return headers;
}
2、修改Ocelot配置,添加如下路由:
{
"DownstreamPathTemplate": "/api/Values",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 5001
},
{
"Host": "localhost",
"Port": 5002
}
],
"UpstreamPathTemplate": "/RequestHeader",
"UpstreamHttpMethod": [
"Get"
],
"LoadBalancerOptions": {
"Type": "RoundRobin"
}
}
启动WebApiA、WebApiB、OcelotGetWay3个项目,然后使用Postman请求http://localhost:5000/RequestHeader
得到的response body(上游headers)如下:
上图中Host的值可能为localhost:5001或localhost:5002,因为使用了负载均衡。
得到的response headers(下游headers)如下:
3、添加headers
修改Ocelot配置,在第2步中添加的路由中添加如下配置:
"DownstreamHeaderTransform": {
"Name": "Jonathan"
},
"UpstreamHeaderTransform": {
"Uncle": "Bob"
}
该配置在上游中添加了一个Uncle: Bob的header,在下游中添加了一个Name: Jonathan的header,再次请求得到的上游及下游headers如下:
可以看到我们刚才添加的headers已经出现。
4、查找和替换
修改Ocelot配置,修改上一步中添加的路由中添加的DownstreamHeaderTransform和UpstreamHeaderTransform如下:
"DownstreamHeaderTransform": {
"Name": "Jonathan",
"Server": "Kestrel, Nginx"
},
"UpstreamHeaderTransform": {
"Uncle": "Bob",
"User-Agent": "PostmanRuntime/7.11.0, postman"
}
上边的配置修改了下游返回的Server和上游发送的User-Agent,注意:有的同学使用的Postman版本不一样,所以根据自己的版本修改要替换的值。
再次请求得到的headers如下:
5、占位符
Ocelot在请求头传递中支持占位符
- {RemoteIpAddress}: 使用_httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString()获取客户端IP
- {BaseUrl}: Ocelot的baseurl
- {DownstreamBaseUrl}: 下游服务的baseurl,当前仅支持在DownstreamHeaderTransform中使用
- {TraceId}: 使用Butterfly APM trace id,当前仅支持在DownstreamHeaderTransform中使用,本文不做介绍
6、处理302重定向
Ocelot默认遵循重定向,因此你可能会想向客户端返回Ocelot的地址而不是下游服务的地址,你可以进行如下配置来返回Location header:
"DownstreamHeaderTransform": {
"Name": "Jonathan",
"Server": "Kestrel, Nginx",
"Location": "http://localhost:5000"
},
"HttpHandlerOptions": {
"AllowAutoRedirect": false
}
再次请求得到的headers如下:
或者,添加如下配置进行替换:
"DownstreamHeaderTransform": {
"Location": "{DownstreamBaseUrl}, {BaseUrl}"
},
"HttpHandlerOptions": {
"AllowAutoRedirect": false,
}
注意:该配置在我的测试下并没有生效,不知道是不是我的配置问题,后续再深入了解源码补充,此处先略过。有知道原因的同学欢迎评论。
7、X-Forwarded-For
如下是使用{RemoteIpAddress}的示例:
"DownstreamHeaderTransform": {
"Name": "Jonathan",
"Server": "Kestrel, Nginx",
"X-Forwarded-For": "{RemoteIpAddress}",
"Location": "{DownstreamBaseUrl}, {BaseUrl}"
}
请求返回如下:
8、Future
当前只支持header只有一个值的情况,但是在一些情况下一个header key会有多个值,如果能有多个值的查找和替换就会很完美:)类似如下配置:
"DownstreamHeaderTransform": {
"Location": "[{one,one},{two,two}"
},
"HttpHandlerOptions": {
"AllowAutoRedirect": false,
}
官方文档的原话:
If anyone wants to have a go at this please help yourself!!
如果你需要这个功能请自己实现,哈哈哈。
源码下载
完,下一篇介绍声明传递
作者:Weidaicheng
链接:https://www.jianshu.com/p/2cb7e52e86e2
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
.Netcore 2.0 Ocelot Api网关教程(10)- Headers Transformation的更多相关文章
- .Netcore 2.0 Ocelot Api网关教程(2)- 路由
.Netcore 2.0 Ocelot Api网关教程(1) 路由介绍 上一篇文章搭建了一个简单的Api网关,可以实现简单的Api路由,本文介绍一下路由,即配置文件中ReRoutes,ReRoutes ...
- .Netcore 2.0 Ocelot Api网关教程(6)- 配置管理
本文介绍Ocelot中的配置管理,配置管理允许在Api网关运行时动态通过Http Api查看/修改当前配置.由于该功能权限很高,所以需要授权才能进行相关操作.有两种方式来认证,外部Identity S ...
- .Netcore 2.0 Ocelot Api网关教程(7)- 限流
本文介绍Ocelot中的限流,限流允许Api网关控制一段时间内特定api的总访问次数.限流的使用非常简单,只需要添加配置即可. 1.添加限流 修改 configuration.json 配置文件,对 ...
- .Netcore 2.0 Ocelot Api网关教程(5)- 认证和授权
本文介绍Ocelot中的认证和授权(通过IdentityServer4),本文只使用最简单的IdentityServer,不会对IdentityServer4进行过多讲解. 1.Identity Se ...
- .Netcore 2.0 Ocelot Api网关教程(1)- 入门
Ocelot(Github)Ocelot官方文档(英文)本文不会介绍Api网关是什么以及Ocelot能干什么需要对Api网关及Ocelot有一定的理论了解 开始使用Ocelot搭建一个入门级Api网关 ...
- .Netcore 2.0 Ocelot Api网关教程(9)- QoS
本文介绍Ocelot中的QoS(Quality of Service),其使用了Polly对超时等请求下游失败等情况进行熔断. 1.添加Nuget包 添加 Ocelot.Provider.Polly ...
- .Netcore 2.0 Ocelot Api网关教程(4)- 服务发现
本文介绍Ocelot中的服务发现(Service Discovery),Ocelot允许指定一个服务发现提供器,之后将从中寻找下游服务的host和port来进行请求路由.关于服务发现的详细介绍请点击. ...
- .Netcore 2.0 Ocelot Api网关教程(8)- 缓存
Ocelot中使用 CacheManager 来支持缓存,官方文档中强烈建议使用该包作为缓存工具.以下介绍通过使用CacheManager来实现Ocelot缓存. 1.通过Nuget添加 Ocelot ...
- .Netcore 2.0 Ocelot Api网关教程(3)- 路由聚合
在实际的应用当中,经常会遇到同一个操作要请求多个api来执行.这里先假设一个应用场景:通过姓名获取一个人的个人信息(性别.年龄),而获取每种个人信息都要调用不同的api,难道要依次调用吗?在Ocelo ...
随机推荐
- MySQL 进阶3 排序查询
#进阶3 排序查询 格式: select 查询列名 from 表 [where 筛选条件] order by 排序列名 [asc / desc] 排序查询/嵌套排序查询/函数查询/[按别名进行 排序] ...
- Java 基础 - Collection集合通用方法及操作/ArrayList和LinkedList的差别优势 /弃用的Vector
Collection的笔记: /**存储对象考虑使用: * 1.数组, ①一旦创建,其长度不可变!② 长度难于应对实际情况 * 2.Java集合, ①Collection集合: 1.set: 元素无序 ...
- 使用Python进行3DES加密-pyDes
pyDes.py源码 ############################################################################# # Documenta ...
- [原创]VSCode debug jest的配置
重拾JS的路从修改JS源码开始,修改JS源码从源码自带的test code开始.源码的test code使用了jtest框架,从test code刚好可以看到要修改部分的 多种传值方式,以及函数输出结 ...
- C# 安全性
一.标识和Principal static void Main(string[] args) { AppDomain.CurrentDomain.SetPrincipalPolicy(System.S ...
- 【leetcode】1292. Maximum Side Length of a Square with Sum Less than or Equal to Threshold
题目如下: Given a m x n matrix mat and an integer threshold. Return the maximum side-length of a square ...
- Codeforces Round #590 (Div. 3)【D题:26棵树状数组维护字符出现次数】
A题 题意:给你 n 个数 , 你需要改变这些数使得这 n 个数的值相等 , 并且要求改变后所有数的和需大于等于原来的所有数字的和 , 然后输出满足题意且改变后最小的数值. AC代码: #includ ...
- 参数类型 (Mapper.java)常用
UserBaseInfo selectByMobile(@Param("mobile")String mobile,@Param("isDeleted")Int ...
- Luogu5339 [TJOI2019]唱、跳、rap和篮球 【生成函数,NTT】
当时看到这道题的时候我的脑子可能是这样的: My left brain has nothing right, and my right brain has nothing left. 总之,看到&qu ...
- Ubuntu14.04 系统复制迁移到新的机器上
1.打包系统文件 制作启动盘,然后进入bios, #进入bios的boot标签选择sandisk启动 如果没有找到u盘进入save & exit标签页选择boot override中的sand ...