作者:张俊,杭州用九智汇科技有限公司系统架构师
用九智汇是一家面向企业提供数据合规、隐私保护相关产品和解决方案的数据合规公司,致力于帮助客户在合法合规、充分保护用户隐私的基础上发挥数据的最大价值,已服务众多世界 500 强企业。当前我们的产品交付主要基于云原生相关的基础设施和开源技术栈,如 Kubernetes、Istio、Apache Dubbo、Alibaba Nacos 等,既支持以 SaaS 的方式提供开箱即用、标准、可配置化的产品服务,亦支持以混合云、私有云的方式进行私有化部署。
在服务客户的的过程中,来自于客户跟网关相关的需求主要体现在以下三个方面:
为了满足以上的客户诉求,以及支撑公司整个产品体系和能力的建设,我们的技术团队希望通过找到一款合适的网关产品来满足客户的需求,同时也能满足以下技术要求:
除了已经在使用的 Nginx Ingress,我们调研了 Ambassador、Kong、APISIX、Gloo、Spring Cloud Gateway 等产品,最终决定选择 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 开源版本已经提供了如 hmac-auth、jwt-auth、basic-auth 等认证鉴权插件,但这些插件并不能完全满足我们的需要,如:
所以我们参考官方文档使用 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
我们内部使用了同样是阿里开源的 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 的时候得考虑更多。
开源的 higress-console 提供了简单、基础、开箱即用的 Web 控制台,但是只提供了最简单的基本管理能力,但它有两个优点:
实际上我们大部分的业务需求也主要在 console 端,上面的两个优点也非常方便对 console 进行自定义和修改。目前,我们实现的主要功能是,通过修改 higress-console 代码对外提供 Dubbo Service,供业务系统调用实现流程自动化。比如在企业租户设置二级乃至一级自定义域名是,业务系统可以调用 higress-console 的 Dubbo Service 创建域名、证书和路由实现全流程无需人工介入。
未来,我们计划继续在开源 higress-console 基础上,开发适合我们自己业务的 Open API 相关的管理和管控能力,进一步提高效率。
目前我们已经迁移了部分 Ningx Ingress 流量到 Higress 中,主要是通过阿里云 SLB 的流量权重设置来实现的,如下图:
从目前已经切换的流量运行情况来看,稳定性很好,另外基于我们测试结果,Higress 的性能是优于 Nginx Ingress 的。由于我们经常需要变更配置,之前考虑到 Nginx 配置变更需要重启进程导致连接瞬时断开后并发重连的问题,所有变更操作强制放到晚上进行,现在在白天也可以进行。
后续,我们准备将所有 Nginx Ingress 流量迁移到 Higress,并且考虑在混合云、私有云方式私有化部署交付是替换 Nginx Ingress,统一使用 Higress,降低维护多套网关的复杂度和成本。
Higress 社区
欢迎点击阅读原文提供企业落地案例,我们将: