首页 > 其他分享 >调研 7 个开源项目后,这家数据合规平台如何构建高性能网关

调研 7 个开源项目后,这家数据合规平台如何构建高性能网关

时间:2024-01-21 21:01:40浏览次数:28  
标签:API 网关 插件 Higress 开源 高性能 higress io

作者:张俊,杭州用九智汇科技有限公司系统架构师

用九智汇介绍

用九智汇是一家面向企业提供数据合规、隐私保护相关产品和解决方案的数据合规公司,致力于帮助客户在合法合规、充分保护用户隐私的基础上发挥数据的最大价值,已服务众多世界 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 的 Dubbo Service 创建域名、证书和路由实现全流程无需人工介入。

未来,我们计划继续在开源 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 社区

欢迎点击阅读原文提供企业落地案例,我们将:

  1. 提供 Higress 在生产环境的落地支持,帮助您高效完成网关架构改造
  2. 案例投稿到 InfoQ/CSDN 等知名技术媒体,提升您企业的技术影响力
  3. 推荐至媒体或社区,参与年度优秀开源案例评选

标签:API,网关,插件,Higress,开源,高性能,higress,io
From: https://www.cnblogs.com/alisystemsoftware/p/17978359

相关文章

  • Nacos 2.3.0 正式版发布,Nacos Controller 项目开源
    作者:杨翊新版本发布Nacos2.3.0-BETA版本经过1个多月的社区测试,修复了部分的问题并对部分新功能的使用进行了少量优化后,于2023年12月7日正式发布。Nacos2.3.0版本基于 2.3.0-BETA 版本为基础,主要进行了如下更新:基于能力协商机制,支持通过Grpc的方式进行持久化服务实......
  • 恭喜 Apache Dubbo 和 Nacos 荣获开放原子“2023年度生态开源项目”
    12月16日,以“一切为了开发者”为主题的开放原子开发者大会在江苏省无锡市开幕。江苏省工业和信息化厅厅长朱爱勋、中国开源软件推进联盟主席陆首群等领导和专家参加开幕式,工业和信息化部信息技术发展司副司长王威伟、江苏省工业和信息化厅副厅长池宇、无锡市人民政府副市长周文......
  • 恭喜 Apache Dubbo 和 Nacos 荣获开放原子“2023年度生态开源项目”
    12月16日,以“一切为了开发者”为主题的开放原子开发者大会在江苏省无锡市开幕。江苏省工业和信息化厅厅长朱爱勋、中国开源软件推进联盟主席陆首群等领导和专家参加开幕式,工业和信息化部信息技术发展司副司长王威伟、江苏省工业和信息化厅副厅长池宇、无锡市人民政府副市长周文......
  • Nacos 2.3.0 正式版发布,Nacos Controller 项目开源
    作者:杨翊新版本发布Nacos2.3.0-BETA版本经过1个多月的社区测试,修复了部分的问题并对部分新功能的使用进行了少量优化后,于2023年12月7日正式发布。Nacos2.3.0版本基于 2.3.0-BETA 版本为基础,主要进行了如下更新:基于能力协商机制,支持通过Grpc的方式进行持久化......
  • Woodpecker CI 设计分析|一个 Go 编写的开源持续集成引擎
    一、前言大家好,这里是白泽。随着Go语言在云原生领域大放异彩,开发者逐渐将目光转移到了这门语言上,而容器则是云原生时代最核心的载体。《WoodpeckerCI设计分析》系列文章将分析开源CI引擎Woodpecker的架构设计,探究Go协程是如何支持由Workflow定义的大量Task的频繁创建......
  • Navicat平替工具,一款免费开源的通用数据库工具
    前言前段时间有小伙伴在群里提问说:因为公司不允许使用破解版的Navicat,有好用的Navicat平替工具推荐吗?今天分享一款免费开源的通用数据库工具:DBeaver。工具介绍DBeaver是一款免费的跨平台数据库工具,适用于开发人员、数据库管理员、分析师和所有数据处理人员。它支持所有流行的S......
  • 基于开源IM即时通讯框架MobileIMSDK:RainbowChat v11.0版已发布
    关于MobileIMSDKMobileIMSDK是一套专门为移动端开发的开源IM即时通讯框架,超轻量级、高度提炼,一套API优雅支持UDP 、TCP 、WebSocket 三种协议,支持iOS、Android、H5、小程序、Uniapp、标准Java平台,服务端基于Netty编写。工程开源地址是:1)Gitee码云地址:https://gitee.com/ja......
  • 下一代云原生网关Higress:基于Wasm开发JWT认证插件
    什么是HigressHigress是基于阿里内部的EnvoyGateway实践沉淀、以开源Istio+Envoy为核心构建的下一代云原生网关,实现了流量网关+微服务网关+安全网关三合一的高集成能力,深度集成Dubbo、Nacos、Sentinel等微服务技术栈,能够帮助用户极大的降低网关的部署及运维成本且能力不打......
  • 兴达易控EtherCAT主站转Profinet网关带你轻松实现设备互通
    兴达易控EtherCAT主站转Profinet网关带你轻松实现设备互通XD-ETHPNM20是一款EtherCAT主站功能的通讯网关。EtherCAT主站转Profinet网关主要功能是将EtherCAT的从站设备(伺服、阀门、仪表、变频器等)接入到Profinet网络。XD-ETHPNM20网关连接到EtherCAT总线中作为主站使用,连接到Prof......
  • K8s 网关选型血泪史
    Sealos公有云几乎打爆了市面上所有主流的开源网关,本文可以给大家很好的避坑,在网关选型方面做一些参考。SealosCloud的复杂场景Sealos公有云上线以来,用户呈爆发式增长,目前总共注册用户8.7w,每个用户都去创建应用,每个应用都需要有自己的访问入口,就导致整个集群路由条目非常巨......