问题描述
Envoy缺省会把http header的key转换为小写,例如有一个httpheader Test-Upper-Case-Header: some-value
,经过envoy代理后会变成 test-upper-case-header: some-value
。这个在正常情况下没问题,RFC 2616 规范也说明了处理HTTP Header是大小写不敏感的
通常 header转换为小写不存在规范问题,但有些情况下对header大小写敏感会存在以下问题,例如:
- 业务解析header依赖大小写。
- 使用的SDK对Header大小写敏感,如读取
Content-Length
来判断response长度时依赖首字母大写。
解决方案
这种情况强制指定为TCP协议。将服务声明为TCP协议,不让istio进行七层处理,也就不会更改http header大小写了,但需要注意的是同时也会丧失istio的七层能力
当是集群内服务时,可以配置service使用TCP协议
kind: Service
metadata:
name: myservice
spec:
ports:
- number: 80
name: tcp-web # 指定该端口协议为 tcp
当是集群外服务时,可以配置serviceEntry数据结构
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: cos
spec:
hosts:
- "private.cos.guangzhou.mycloud.com"
location: MESH_INTERNAL
addresses:
- 169.254.0.47
ports:
- number: 80
name: tcp
protocol: TCP
resolution: DNS