alibaba / virtual-environment

Route isolation with service sharing https://alibaba.github.io/virtual-environment/#/zh-cn/
MIT License
217 stars 39 forks source link

回调的流量如何染色? #14

Closed cynial closed 4 years ago

cynial commented 4 years ago

使用第三方 OAuth,OAuth 会执行回调 URL,此时回调的 URL 是 OAuth 发出的,不受我们控制,无法带上自定义 header 环境标识,这种场景应如何对流量进行染色?

想到的一个方案是使用 Cookie,不知道还有没有更好的方案?

  - match:
    - headers:
        ali-env:
          exact: test
    - headers:
        cookie:
          regex: ^(.*?;\s*)?(ali-env=test)(;.*)?$
linfan commented 4 years ago

cookie本质上还是header,一种比较通用的解法是支持按优先级从多个header里提取环境标,同时在CRD增加一个可选的内容提取参数,配置出提取内容的正则表达式。 支持多个header会是个不兼容的格式改动,放到v0.3之后吧,预计在v0.4版本实现。

linfan commented 4 years ago

v0.3近期应该会发布了,目前还差一个EnvoyFilter兼容的问题尚未修复

cynial commented 4 years ago

这个解法确实更通用。我还遇到另外一个问题,我另外起一个 issue 描述

linfan commented 4 years ago

v0.3.1版本已支持多Header配置

cynial commented 4 years ago

赞,多 Header 是怎样配置的呢?

cynial commented 4 years ago

找到了 ../blob/master/pkg/apis/env/v1alpha2/virtualenvironment_types.go#L37

cynial commented 4 years ago

@linfan 奇怪,alias.pattern 并没有用到,只用到了 alias.name?

../blob/master/pkg/component/router/istio/http/virtual_service_generator.go#L119

cynial commented 4 years ago

使用多个 header 的能力,生成的 vs 规则有点冗余,单从 vs 规则上来看,如果能合并是不是更好,比如:

生成的 vs 规则

  spec:
    hosts:
    - app-js
    http:
    - match:
      - headers:
          X-Virtual-Env:
            exact: dev.proj1
      route:
      - destination:
          host: app-js
          port:
            number: 8080
          subset: dev-proj1
        weight: 100
    - match:
      - headers:
          cookie:
            exact: dev.proj1
      route:
      - destination:
          host: app-js
          port:
            number: 8080
          subset: dev-proj1
        weight: 100

优化的 vs 规则

  spec:
    hosts:
    - app-js
    http:
    - match:
      - headers:
          X-Virtual-Env:
            exact: dev.proj1
      - headers:
          cookie:
            exact: dev.proj1
      route:
      - destination:
          host: app-js
          port:
            number: 8080
          subset: dev-proj1
        weight: 100
linfan commented 4 years ago

fixed in v0.3.2 文档:https://alibaba.github.io/virtual-environment/#/zh-cn/doc/configuration