作者:张俊,杭州用九智汇科技有限公司系统架构师
用九智汇介绍
用九智汇是一家面向企业提供数据合规、隐私保护相关产品和解决方案的数据合规公司,致力于帮助客户在合法合规、充分保护用户隐私的基础上发挥数据的最大价值,已服务众多世界 500 强企业。当前我们的产品交付主要基于云原生相关的基础设施和开源技术栈,如 Kubernetes、Istio、Apache Dubbo、Alibaba Nacos 等,既支持以 SaaS 的方式提供开箱即用、标准、可配置化的产品服务,亦支持以混合云、私有云的方式进行私有化部署。
需求背景
在服务客户的的过程中,来自于客户跟网关相关的需求主要体现在以下三个方面:
- 提供开放 API 供企业内部系统进行集成调用,实现全流程自动化。
- 能够自定义 SaaS 产品的访问域名,二级域名甚至一级域名,增强企业员工的品牌感知。
- 私有化部署时,能不依赖于客户的基础设施能力,对公网提供服务并保障稳定和安全。
为了满足以上的客户诉求,以及支撑公司整个产品体系和能力的建设,我们的技术团队希望通过找到一款合适的网关产品来满足客户的需求,同时也能满足以下技术要求:
- 基于云原生,跟我们当前基于云原生的技术架构相匹配。
- 开源并且开源协议满足商业化使用要求,有长期的发展规划 RoadMap。
- 性能至少不差于 Nginx Ingress,能够解决配置频繁变更导致 Nginx 进程频繁重启连接瞬时断开后并发重连的问题。
- 支持插件,可以开发自定义插件。
- 可以根据域名、路由配置不同的插件,以实现在不同业务场景下使用不同的认证鉴权方式。
- 具备将 HTTP 请求转换为微服务 RPC 请求的能力,微服务 API 能通过网关的可配置能力,快速地对外提供开放 API 服务,内部、外部使用同一套 API,提升研发效率。
- 网关核心组件和控制台分开部署,并且网关控制台的技术架构方便进行定制化开发,可通过控制台提供的 API 实现域名、证书、路由等自动化配置。
- 至少能够将安全网关和流量网关二合一,降低私有化部署的复杂度和维护成本。
除了已经在使用的 Nginx Ingress,我们调研了 Ambassador、Kong、APISIX、Gloo、Spring Cloud Gateway 等产品,最终决定选择 Higress。
为什么选择 Higress
1)Higress 进入我们视野,首先是因为它基于云原生的,在广泛被使用的 envoy、istio 的基础上进行开发,跟我们当前基于 Kubenetes 的技术架构完全匹配,技术团队完全可以通过云原生社区学习和掌握相关的能力并独立运维。
2)Higress 是开源的,基于 Apache-2.0 协议,对商用比较友好,即使完全没有社区的帮助,我们也可以根据自己的需求进行自定义和修改,来满足特定的客户需求和公司产品能力建设需要。另外我们在调研和测试 Higress 开源版本过程中,Higress 开源团队的支持非常及时和给力,这给了我们非常大的信心。
3)Wasm 插件机制,跨语言支持,开发可以选择自己熟悉的语言进行插件开发,大幅降低了插件的开发难度,插件可以动态加载和卸载而无需重启网关,提供了强大的灵活性和扩展性,并且在安全性和性能上完全能够满足我们的需要。
4)HTTP 转 Dubbo 能力,结合认证鉴权 Wasm 插件,我们可以将内部使用的 RPC API 和提供给外部使用的 Open API 统一,只用开发一套标准的 RPC API,即可同时服务内部系统和外部系统的需要。开发只用将内部的 API 配置即可上线到 Open API 目录中,能够极大地提高了研发效率。
5)我们当前在使用 Nginx Ingress 作为网关,最终我们希望只有一个网关产品,所以需要把 Nginx Ingress 的配置平滑迁移到 Higress,由于 Higress 兼容 Nginx Ingress 绝大部份 Annotation,所以迁移成本较低。
已经使用了哪些 Higress 能力
1. 开发自定义 Wash 插件对 Open API 调用进行认证鉴权
Higress 开源版本已经提供了如 hmac-auth、jwt-auth、basic-auth 等认证鉴权插件,但这些插件并不能完全满足我们的需要,如:
- 访问凭证只能写在插件的 yaml 中,不能动态调用其他服务或存储进行校验。
- 访问凭证校验通过后,需要根据调用的密钥所归属的企业租户,在 header 中设置访问租户信息,只允许访问属于该租户的数据。
所以我们参考官方文档使用 GO 语言开发自己的认证鉴权、设置 Header 插件,流程如下图:
a. 使用 Go 语言开发、编译、测试
#1、在plugins/wasm-go/yong9ai-***-auth目录下执行 go mod init yong9ai-***-auth #2、编写main.go文件,按需实现onHttpRequestHeaders、onHttpRequestBody等方法 #3、编译生成WASM文件(Windows下将单引号改为双引号) go mod tidy tinygo build -o main.wasm -scheduler=none -target=wasi -gc=custom -tags='custommalloc nottinygc_finalizer' ./main.go #4、使用docker-compose启动envoy和httpbin进行测试
b. 使用 Higress wasm-go builder 构建插件镜像
#1、在plugins/wasm-go目录下执行 PLUGIN_NAME=yong9ai-***-auth make build #2、push到镜像仓库
c. 配置插件,基于域名开启指定插件对所有请求进行认证鉴权
apiVersion: extensions.higress.io/v1alpha1 kind: WasmPlugin metadata: annotations: higress.io/wasm-plugin-description: 用九智汇***认证鉴权 higress.io/wasm-plugin-title: yong9ai-***-auth labels: higress.io/resource-definer: higress higress.io/wasm-plugin-built-in: "false" higress.io/wasm-plugin-category: custom higress.io/wasm-plugin-name: yong9ai-***-auth higress.io/wasm-plugin-version: 1.0.0 name: yong9ai-***-auth-1.0.0 namespace: higress-system spec: defaultConfig: {} defaultConfigDisable: true matchRules: - config: namespace: *** serviceName: *** servicePort: *** serviceSource: *** configDisable: false domain: - ***.yong9ai.com phase: AUTHN priority: 1000 url: oci://****.cn-shanghai.cr.aliyuncs.com/**/**:yong9ai-***-auth-1.0.0
2. 使用 Http 转 Dubbo 能力对外暴露 Open API
我们内部使用了同样是阿里开源的 Dubbo 作为微服务框架,并使用 Nacos 作为注册中心。通过使用 Higress 的 Http 转 Dubbo 能力,可以将内部使用的标准 Dubbo Service 以 Open API 提供给客户使用。
a. 创建服务来源(配置 McpBridge)
apiVersion: networking.higress.io/v1 kind: McpBridge metadata: name: default namespace: higress-system spec: registries: - domain: nacos-***.*** nacosGroups: - DEFAULT_GROUP nacosNamespaceId: public name: Nacos port: 8848 type: nacos2
b. 配置 Http2RPC
apiVersion: networking.higress.io/v1 kind: Http2Rpc metadata: name: ***-***-***-service namespace: higress-system spec: dubbo: group: DUBBO methods: - headersAttach: '*' httpMethods: - POST httpPath: /api/open/**/**/**/post.json params: - paramKey: request paramSource: BODY paramType: >- com.yong9ai.***.***.***.***.***.***.param.****Request serviceMethod: *** service: com.yong9ai.***.***.***.***.***.***.api.****Service version: 1.0.0
c. 配置路由
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: higress.io/destination: '***.***.svc.cluster.local:8080' higress.io/ignore-path-case: 'true' higress.io/match-method: POST higress.io/ssl-redirect: 'true' labels: higress.io/domain_datacls.openapi.yong9ai.work: 'true' higress.io/resource-definer: higress name: ***-***-service-*** namespace: higress-system spec: ingressClassName: higress rules: - host: ***.yong9ai.com http: paths: - backend: resource: apiGroup: networking.higress.io kind: McpBridge name: default path: /api/open/**/**/**/post.json pathType: Exact tls: - hosts: - ***.yong9ai.com secretName: yong9ai-***
结合认证鉴权、设置 Header 插件,将 Dubbo Service 暴露为 Open API,这样就不用维护 Dubbo、HTTP 两套 API 接口和实现,开发成本、维护难度都得到大幅降低,当然定义 API 的时候得考虑更多。
3. 基于开源 Higress-console 进行自定义修改,暴露 Dubbo 服务实现自动化
开源的 higress-console 提供了简单、基础、开箱即用的 Web 控制台,但是只提供了最简单的基本管理能力,但它有两个优点:
- 后端基于 SpringBoot,前端基于 React,开发非常容易上手。
- 和 Higress 核心组件分开部署,console 频繁迭代和部署不会影响网关的核心功能。
实际上我们大部分的业务需求也主要在 console 端,上面的两个优点也非常方便对 console 进行自定义和修改。目前,我们实现的主要功能是,通过修改 higress-console 代码对外提供 Dubbo Service,供业务系统调用实现流程自动化。比如在企业租户设置二级乃至一级自定义域名是,业务系统可以调用 higress-console 的 DubboService 创建域名、证书和路由实现全流程无需人工介入。
未来,我们计划继续在开源 higress-console 基础上,开发适合我们自己业务的 Open API 相关的管理和管控能力,进一步提高效率。
4. 迁移 Nginx Ingress 到 Higress
目前我们已经迁移了部分 Ningx Ingress 流量到 Higress 中,主要是通过阿里云 SLB 的流量权重设置来实现的,如下图:
从目前已经切换的流量运行情况来看,稳定性很好,另外基于我们测试结果,Higress 的性能是优于 Nginx Ingress 的。由于我们经常需要变更配置,之前考虑到 Nginx 配置变更需要重启进程导致连接瞬时断开后并发重连的问题,所有变更操作强制放到晚上进行,现在在白天也可以进行。
后续,我们准备将所有 Nginx Ingress 流量迁移到 Higress,并且考虑在混合云、私有云方式私有化部署交付是替换 Nginx Ingress,统一使用 Higress,降低维护多套网关的复杂度和成本。
最后
- HTTP 转 Dubbo 是个非常好的 Feature,可以满足我们大部分场景的需求,希望社区可以持续迭代,继续做强这个功能,解放研发的生产力。
- 从社区周会了解到,Higress 商业团队在不断加大对开源社区的投入,同时也建立了开源版和社区版的 feature/bugfix 同步机制,以社区版为基础,商业版基于社区版进行扩展,这是一条正确的道路,坚决支持,希望坚持到底。
- 希望有更多的社区同学参与开源版本 higress-console 的建设,在易用性和功能丰富性上越来越强,我们在合适的时候也会贡献自己的力量。
Higress 社区
欢迎点击阅读原文提供企业落地案例,我们将:
- 提供 Higress 在生产环境的落地支持,帮助您高效完成网关架构改造
- 案例投稿到 InfoQ/CSDN 等知名技术媒体,提升您企业的技术影响力
- 推荐至媒体或社区,参与年度优秀开源案例评选
Higress社区交流群: