ISTIO_MUTUAL
(与 MUTUAL
类似,使用 Istio 的 mTLS 证书) 。
4.2.5 端口流量策略注释:LEAST_CONN表示最少连接,ROUND_ROBIN表示轮询 , 轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同 。这有个前提 , 就是每个请求所占用的后端时间要差不多,如果有些请求占用的时间很长,会导致其所在的后端负载较高 。在这种场景下,把请求转发给连接数较少的后端,能够达到更好的负载均衡效果,这就是least_conn算法 。least_conn算法很简单,首选遍历后端集群 , 比较每个后端的conns/weight,选取该值最小的后端 。如果有多个后端的conns/weight值同为最小的 , 那么对它们采用加权轮询算法 。
使用 portLevelSettings
字段,我们可以将流量策略应用于单个端口 。比如说:
trafficPolicy:portLevelSettings:- port:number: 80loadBalancer:simple: LEAST_CONN- port:number: 8000loadBalancer:simple: ROUND_ROBIN
五.高级路由5.1 高级路由在前面,我们了解了如何利用流量的比例(weight
字段)在多个子集之间进行流量路由 。在某些情况下,纯粹的基于权重的流量路由或分割已经足够了 。然而,在有些场景和情况下 , 我们可能需要对流量如何被分割和转发到目标服务进行更细化的控制 。
Istio 允许我们使用传入请求的一部分,并将其与定义的值相匹配 。例如,我们可以匹配传入请求的 URI 前缀,并基于此路由流量 。
属性描述uri将请求 URI 与指定值相匹配schema匹配请求的 schema(HTTP、HTTPS...)method匹配请求的 method(GET、POST...)authority匹配请求 authority 头headers匹配请求头 。头信息必须是小写的,并以连字符分隔(例如:x-my-request-id
) 。注意,如果我们使用头信息进行匹配,其他属性将被忽略(uri
、schema
、method
、authority
) 。上述每个属性都可以用这些方法中的一种进行匹配:
- 精确匹配:例如,
exact: "value"
匹配精确的字符串 - 前缀匹配:例如,
prefix: "value"
只匹配前缀 - 正则匹配:例如,
regex:"value"
根据 ECMAscript 风格的正则进行匹配
https://dev.example.com/v1/api
。为了匹配该请求的 URI,我们会这样写: http: - match:- uri:prefix: /v1
上述片段将匹配传入的请求,并且请求将被路由到该路由中定义的目的地 。另一个例子是使用正则并在头上进行匹配 。
http: - match:- headers:user-agent:regex: '.*Firefox.*'
上述匹配将匹配任何用户代理头与 Regex 匹配的请求 。5.2 重定向和重写请求在头信息和其他请求属性上进行匹配是有用的,但有时我们可能需要通过请求 URI 中的值来匹配请求 。
例如,让我们考虑这样一种情况:传入的请求使用
/v1/api
路径,而我们想把请求路由到 /v2/api
端点 。这样做的方法是重写所有传入的请求和与
/v1/api
匹配的 authority/host headers 到 /v2/api
。例如:
... http:- match:- uri:prefix: /v1/apirewrite:uri: /v2/apiroute:- destination:host: customers.default.svc.cluster.local ...
即使目标服务不在 /v1/api
端点上监听,Envoy 也会将请求重写到 /v2/api
。我们还可以选择将请求重定向或转发到一个完全不同的服务 。下面是我们如何在头信息上进行匹配,然后将请求重定向到另一个服务:
... http:- match:- headers:my-header:exact: helloredirect:uri: /helloauthority: my-service.default.svc.cluster.local:8000 ...
redirect
和 destination
字段是相互排斥的 。如果我们使用 redirect
,就不需要设置 destination
。5.3 AND 和 OR 语义在进行匹配时 , 我们可以使用 AND 和 OR 两种语义 。让我们看一下下面的片段:
... http:- match:- uri:prefix: /v1headers:my-header:exact: hello ...
上面的片段使用的是 AND 语义 。这意味着 URI 前缀需要与 /v1
相匹配,并且头信息 my-header
有一个确切的值 hello
。要使用 OR 语义,我们可以添加另一个
match
项 , 像这样: ... http:- match:- uri:prefix: /v1...- match:- headers:my-header:exact: hello ...
在上面的例子中,将首先对 URI 前缀进行匹配,如果匹配 , 请求将被路由到目的地 。如果第一个不匹配,算法会转移到第二个,并尝试匹配头 。如果我们省略路由上的匹配字段,它将总是评估为
推荐阅读
- Git 02: git管理码云代码仓库 + IDEA集成使用git
- node.js:《接口实现文件的上传和下载》
- Kotlin Mockito使用方法
- 之五 2流高手速成记:Springboot整合Shiro实现安全管理
- <五>掌握左值引用和初识右值引用
- 二 Istio:在Kubernetes(k8s)集群上安装部署istio1.14
- 四十八 SpringCloud微服务实战——搭建企业级开发框架:【移动开发】整合uni-app搭建移动端快速开发框架-使用第三方UI框架
- Spring Retry 重试
- C#-多线程的使用Tread
- 我国哪座山被称为五岳之首?支付宝