云原生API网关 - 开源项目Hango网关设计与实践-程序员宅基地

技术标签: java  编程语言  人工智能  网关  大数据  

解读开源Hango网关的云原生设计与实践,本文先从云原生溯源,解读云原生API网关选型特点;再进一步解读网易数帆开源Hango云原生API网关设计及大规模落地实践。

云原生溯源

什么是云原生

CNCF(云原生计算基金会)对云原生的定义是:云原生是一种架构模式,有利于各组织在公有云、私有云和混合云等动态环境中,构建和运行可弹性扩展的应用。代表技术包括,容器、微服务、不可变基础设施和声明式API。

从云原生的定义可以看出,云原生具备快速集成,拥有良好的扩展性及高可用性。得益于Kubernetes的发展,云原生技术蓬勃发展,已然迈入新时代。

API网关的意义

随着容器技术以及微服务理念的发展,更多的产品组织着重于暴露开放API,用于客户端进行交互。API网关充当API代理的功能,网关接收请求,将请求进行统一路由转发至后端服务。网关作为抽象层,为整个微服务系统或集群提供统一接入层。

除了代理功能外,API网关为微服务集群提供统一的安全、响应转换、熔断、降级和监控等多维度功能,确保流量安全可靠。

随着云原生理念引领微服务进行演进,应用迭代频率以及交付速度会加快,API网关的出现可以使得业务开发更加专注于自身业务逻辑的设计,提升研发敏捷性。在云原生的架构下,API网关也在向云原生演进,Hango网关便是云原生设计下催生的优秀网关产品。

云原生API网关特点

进入云原生时代,行业用户除了关注传统API网关提供的请求代理,流量治理等常规功能外,更多的开始关注云原生兼容性,支撑场景的多样以及更优异的性能。

相较于传统API网关,在云原生模式下笔者认为API网关应该具备的一些思考:

  • 服务发现方式:与传统网关服务发现需要手动指定upstream,云原生网关在服务发现上需要动态感知业务变化。

  • 更高的性能追求:随着Kubernetes以及容器将云原生带入新时代以及微服务理念的发展,API网关的卓越性能可以减少整个链路的RT。

  • 云原生架构兼容/整合:网关的部署架构是否能够和云原生架构进行兼容,能否和容器以及服务网格进行无缝对接。

  • 动态配置能力:传统的反向代理无法实现动态配置加载能力,云原生模式下的代理配置更新变化较频繁,动态配置下发能力显得尤为关键。

  • 部署形态及架构:网关部署架构能否满足弹性扩展,是否支持从业务混部到独立部署的平滑迁移。

  • 监控/链路追踪:云原生架构中,良好的监控和链路追踪能力可以便于运维人员进行服务观测以及问题定位。

Hango API 网关设计

随着集团内业务大规模进行容器化改造,业务对网关的诉求也愈发强烈。我们团队着手于建设新一代高性能API网关Hango(项目地址:https://github.com/hango-io/hango-gateway),目的是替换集团内部较多的采用Java的异步网关、Zull,同时满足业务逐渐上云的南北向流量治理需求。

在选型方面,我们选择Envoy作为云原生网关实践的关键基础组件,具备丰富的特性,包括:

  • 原生功能丰富:相较于Nginx,HAProxy等流量代理所需的基本功能,Envoy本身基于C++实现了相当多的高级治理功能,包括负载均衡、熔断、限流、故障注入等。更为丰富的功能使得Envoy 天生具备多场景。

  • 丰富的可观察性:Envoy具备灵活的日志配置、丰富的指标数据以及开箱即用的多种Tracing能力。

  • 灵活的扩展性:Envoy提供了L4/L7 Filter机制,可以让开发者在不侵入Envoy主干的前提下对Envoy进行扩展与增强。同时,xDS协议的提出,使得Envoy几乎所有的配置都可以动态下发、加载、生效,而无需重新加载进程。

同时,Envoy在行业内的发展趋势也非常迅猛,2020年云原生报告显示,Envoy 在行业内使用量上升明显,去年排名第四的Envoy,超过F5和HAProxy 从15%的份额增长到29%。

架构设计

基于以上典型特性,秉承云原生的理念,通过大量内部积累实践经验,我们开源了Hango API 网关。Hango 中文名“函谷”,是一个高性能,可扩展,功能丰富的云原生API网关。

Hango网关基于Envoy及Istio构建。数据面基于Envoy扩展,增强插件链;控制面基于Istio进行扩展。具体架构如下:

5fcd856a2361685dc1ac26e6c6ba6026.png

控制面组件包括Hango Portal, Hango API Plane, Slime以及Istiod。Hango API Plane生成Gateway、DestinationRule、VirtualService等CRD以及EnvoyPlugin等Slime CRD;通过Slime进行扩展,将Slime CRD动态转化为EnvoyFilter,对数据面envoy进行扩展。

下图展示Hango网关插件链的数据流,通过创建EnvoyPlugin CR,Slime动态监听聚合生成对应的EnvoyFilter,完成对Envoy filter chain的动态扩展。

2907c8b02ee26de49b3731d5c44062eb.png

高性能

和传统API网关相比,在云原生模式下,业务开发更加敏捷,业务拆分更加细致。这样会使得业务每一跳之间的时延更加敏感。网关承接整个微服务集群的流量代理,良好的性能是业务是否选择网关的必备条件。

Hango API网关采用Envoy作为核心数据面,众多核心功能通过原生C++实现,相较于Nginx、HAProxy等通过扩展脚本实现主要功能的方式,性能优势更为明显。

同时,在实际落地过程,我们也对网关做了一定的性能优化,包括:

  • 配置过滤:通过对集群svc以及DestinationRule 资源的配置过滤,减少envoy cluster 数量。

  • 插件配置:提供全局插件开关以及路由维度的插件开关,减少非必要插件逻辑对性能的开销。

通过优化,基于20个cluster,500条route配置规模,我们对Hango进行了梯度测试,在容器网络下,500条route配置规模,Hango RPS可以达到9.5w。

855705511c4e71d293777a95f56c869c.png

多场景

Hano API网关具备支撑微服务网关、七层负载均衡、Kubernetes Ingress等多场景能力。作为业务上云的南北流量入口,Hango网关具备以下特性:

  • 灵活路由配置:支持不限于请求Path,Header、Method、Query等进行灵活路由配置。

  • 多注册方式:支持Kubernetes注册中心动态感知业务集群变化,满足业务平滑扩缩容场景;支持传统逻辑部署,使得业务可以平滑迁移。

  • 多场景治理:支持多维度限流、熔断、降级、重试等多场景流量治理。

  • 多协议支持:支持HTTP、gRPC、Websocket等多协议接入。

  • 多维度安全:支持多维度黑白名单、外部认证等多种认证方式。

同时,作为通用网关,Hango同样可以被用于L7 负载均衡器,Kubernetes 边缘网关等通用场景。

可扩展

功能扩展

Hango网关开源Rider 模块,用于功能扩展。用户可以通过简单的教程进行可插拔插件的形式的动态扩展网关功能。

Rider作为Hango API网关开源的module,提供插件开发的SDK,使得用户可以通过Lua扩展的方式编写自定义插件,通过简单的配置即可以动态扩展envoy L7 filters,使得Lua 插件可以像其他Native Http filter一样在运行时进行配置。

0c9b967357e163ebbcb576a28bbcbeec.png

可以参考Hango Github 网页Rider自定义插件教程 ,这里提供一个简单的开箱即用的UA黑白名单插件,读者可以进行自定义插件学习。

弹性伸缩

Hango网关支持容器化部署,提供基于Kubernetes的部署架构。建立在数据面和控制面隔离的基础上,数据面节点基于无状态的envoy进行部署。基于xDS协议的动态下发设计,数据面可以进行动态横向扩展,在业务大促或流量增长时进行平滑伸缩。

容错性

Hango网关可以实现业务配置隔离,增加业务容错性,对于重点业务可以单独区分网关集群进行部署,提升整个网关产品可用性。

Hango网关设计之初便可以完成对业务配置的隔离,基于Istio的模型,在Hango网关最初在规模实践就考虑到了增强Istio的能力,通过对DestinationRule 相关CR增加对应的Gateway label。通过label匹配的方式控制cluster资源的下发,起到配置隔离作用。

Istio社区也在版本演进过程中(>Istio1.7),提出了一种解决思路,cluster的获取可以依赖VirtualService(VS)中的host配置,通过VS资源route host与DestinationRule资源进行映射 ,生成对应的cluster, 下发至指定的Proxy。这样可以确保不同网关之间的cluster配置隔离,减少不同配置相互影响,提升服务稳定性;同时,大大减少线上cluster的数量,进一步提升proxy性能。

如下所示,通过配置隔离,a-hango 网关集群仅能收到app1的cluster。通过此可以实现线上配置隔离,提升产品稳定性,同时进一步提升网关性能。

c6f2c71c89bd3ec2bd41deef82fb400b.png

易操作

Hango网关提供从控制界面以及API的方式提升用户操作体验。

控制平面

提供简单的控制面,用户可以通过可视化操作进行服务和路由的生命周期管理。具体可以参考:Hango网关控制面操作流程

c87d8a61c7fbea1b04d6e73d45dbc7c4.png

OpenAPI

为了便于企业用户接口Hango, Hango提供了标准的Restful API,便于企业用户完成对已有网关产品向Hango的平滑迁移。

Hango API 网关规模落地

在网易集团内部,基于Hango网关构建的轻舟网关已经大规模落地实践,承担网易集团每日百亿级流量。本文主要从平滑纳管、灰度发布以及可观测实践三个角度介绍Hango网关在网易集团内部的落地实践。

平滑纳管

基于Hango网关规模落地中,我们对容器服务,裸金属服务等实现了平滑纳管以及平滑迁移,为业务上云提供了便利接入,打消了业务上云无法平滑的顾虑。

在网易集团内部,针对不同的业务划分不同的网关集群,从业务上进行配置隔离,提升网关可靠性。

592cd400c16ea2645d82417d4d1c13dc.png

灰度发布

在实践过程中,灰度主要涉及两方面,一方面是业务容器化改造过程中的灰度迁移,另一方面便是网关产品自身的灰度策略。

业务容器灰度

业务在容器化改造过程中,存在多版本上线场景,需要根据不同版本进行灰度发布。Hango网关提供根据业务不同版本进行灰度的过程,通过对服务打label的形式,在路由的过程中,选择不同的label进行灰度权重配置。

f8c3592805016dda33ac7a7089f9c407.png

网关灰度

作为微服务集群的入口,网关的稳定运行关系着整个集群流量的稳定及可靠。在实地落地过程中,建立一整套网关自身灰度体系非常有必要,Hango网关在网易集团内部落地过程采用四层LB进行灰度体系构建,通过对Hango数据面打label的形式,控制网关自身灰度。

3f1e2440a63d1b6b7e88da5ed9e5eebe.png

可观测

基于Envoy良好的观测性,Hango网关在网易集团内部进行规模落地过程中,结合服务网格场景,提供丰富的观测能力,整体架构如下:

f53a784a66b8db848a34781d668cad6d.png

  • 日志

    Envoy中事件的详细记录,Hango网关基于Envoy进行数据面扩展,提供了灵活易配置的AccessLog,支持自定义格式,自定义过滤规则以及输出。

    基于filebeat以及elastic的能力,构建一体化日志审计平台。

  • 监控

    基于Envoy cluster mertic等信息,利用Promethues构建网关/服务等多维度指标体系。同时,针对网关容器化部署模式,基于Kubernetes 容器对应的 metrics构建容器维度的指标监控,涵盖CPU/内存/带宽等多维度监控。

  • 链路追踪

    基于Envoy开箱即用的多种tracing接入,拓展力强,目前已完成线上SkyWalking等tracing的接入。

    写在最后

    Hango作为一名开源领域的新生儿,我们会秉承拥抱云原生的理念,继续跟进Istio/Envoy的演进,发挥更大的领域价值。下一阶段,我们会在多语言扩展,LB融合等多场景进行发力,也期待更多关注云原生、API网关的同学能够加入Hango开源社区建设。

    诚挚的欢迎大家关注Hango Gateway:

    https://github.com/hango-io/hango-gateway

    参考文档

    云原生(Cloud Native)的定义

    https://jimmysong.io/kubernetes-handbook/cloud-native/cloud-native-definition.html

    云原生关乎文化,而不是容器

    https://cloudnative.to/blog/cloud-native-culture-not-container/

    Hango 开源解读:云原生网关实践,为何要选择 Envoy ?

    https://mp.weixin.qq.com/s/J8ROB79yi4xlmTpQOR2sOA

    作者简介

    韩佳浩,开源项目 Hango 核心开发者,网易数帆资深研发工程师,主导 Hango 网关开源研发及设计,负责网易数帆轻舟 API 网关在网易内部大规模落地及产品化建设。具有三年网关相关研发及大规模实践经验。

    分享预告

    9月9日20:00,Hango 项目核心开发者,网易数帆技术专家王佰平将在 InfoQ 公开课分享《如何基于开源Envoy,构建高性能云原生微服务网关》,从网易数帆开源 API 网关项目 Hango 实践出发,介绍如何基于开源 Envoy 构建高性能、易扩展、可观察的云原生微服务网关。敬请点击“阅读原文”报名预约观看!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/NetEaseResearch/article/details/121299333

智能推荐

5个超厉害的资源搜索网站,每一款都可以让你的资源满满!_最全资源搜索引擎-程序员宅基地

文章浏览阅读1.6w次,点赞8次,收藏41次。生活中我们无时不刻不都要在网站搜索资源,但就是缺少一个趁手的资源搜索网站,如果有一个比较好的资源搜索网站可以帮助我们节省一大半时间!今天小编在这里为大家分享5款超厉害的资源搜索网站,每一款都可以让你的资源丰富精彩!网盘传奇一款最有效的网盘资源搜索网站你还在为找网站里面的资源而烦恼找不到什么合适的工具而烦恼吗?这款网站传奇网站汇聚了4853w个资源,并且它每一天都会持续更新资源;..._最全资源搜索引擎

Book类的设计(Java)_6-1 book类的设计java-程序员宅基地

文章浏览阅读4.5k次,点赞5次,收藏18次。阅读测试程序,设计一个Book类。函数接口定义:class Book{}该类有 四个私有属性 分别是 书籍名称、 价格、 作者、 出版年份,以及相应的set 与get方法;该类有一个含有四个参数的构造方法,这四个参数依次是 书籍名称、 价格、 作者、 出版年份 。裁判测试程序样例:import java.util.*;public class Main { public static void main(String[] args) { List <Book>_6-1 book类的设计java

基于微信小程序的校园导航小程序设计与实现_校园导航微信小程序系统的设计与实现-程序员宅基地

文章浏览阅读613次,点赞28次,收藏27次。相比于以前的传统手工管理方式,智能化的管理方式可以大幅降低学校的运营人员成本,实现了校园导航的标准化、制度化、程序化的管理,有效地防止了校园导航的随意管理,提高了信息的处理速度和精确度,能够及时、准确地查询和修正建筑速看等信息。课题主要采用微信小程序、SpringBoot架构技术,前端以小程序页面呈现给学生,结合后台java语言使页面更加完善,后台使用MySQL数据库进行数据存储。微信小程序主要包括学生信息、校园简介、建筑速看、系统信息等功能,从而实现智能化的管理方式,提高工作效率。

有状态和无状态登录

传统上用户登陆状态会以 Session 的形式保存在服务器上,而 Session ID 则保存在前端的 Cookie 中;而使用 JWT 以后,用户的认证信息将会以 Token 的形式保存在前端,服务器不需要保存任何的用户状态,这也就是为什么 JWT 被称为无状态登陆的原因,无状态登陆最大的优势就是完美支持分布式部署,可以使用一个 Token 发送给不同的服务器,而所有的服务器都会返回同样的结果。有状态和无状态最大的区别就是服务端会不会保存客户端的信息。

九大角度全方位对比Android、iOS开发_ios 开发角度-程序员宅基地

文章浏览阅读784次。发表于10小时前| 2674次阅读| 来源TechCrunch| 19 条评论| 作者Jon EvansiOSAndroid应用开发产品编程语言JavaObjective-C摘要:即便Android市场份额已经超过80%,对于开发者来说,使用哪一个平台做开发仍然很难选择。本文从开发环境、配置、UX设计、语言、API、网络、分享、碎片化、发布等九个方面把Android和iOS_ios 开发角度

搜索引擎的发展历史

搜索引擎的发展历史可以追溯到20世纪90年代初,随着互联网的快速发展和信息量的急剧增加,人们开始感受到了获取和管理信息的挑战。这些阶段展示了搜索引擎在技术和商业模式上的不断演进,以满足用户对信息获取的不断增长的需求。

随便推点

控制对象的特性_控制对象特性-程序员宅基地

文章浏览阅读990次。对象特性是指控制对象的输出参数和输入参数之间的相互作用规律。放大系数K描述控制对象特性的静态特性参数。它的意义是:输出量的变化量和输入量的变化量之比。时间常数T当输入量发生变化后,所引起输出量变化的快慢。(动态参数) ..._控制对象特性

FRP搭建内网穿透(亲测有效)_locyanfrp-程序员宅基地

文章浏览阅读5.7w次,点赞50次,收藏276次。FRP搭建内网穿透1.概述:frp可以通过有公网IP的的服务器将内网的主机暴露给互联网,从而实现通过外网能直接访问到内网主机;frp有服务端和客户端,服务端需要装在有公网ip的服务器上,客户端装在内网主机上。2.简单的图解:3.准备工作:1.一个域名(www.test.xyz)2.一台有公网IP的服务器(阿里云、腾讯云等都行)3.一台内网主机4.下载frp,选择适合的版本下载解压如下:我这里服务器端和客户端都放在了/usr/local/frp/目录下4.执行命令# 服务器端给执_locyanfrp

UVA 12534 - Binary Matrix 2 (网络流‘最小费用最大流’ZKW)_uva12534-程序员宅基地

文章浏览阅读687次。题目:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=93745#problem/A题意:给出r*c的01矩阵,可以翻转格子使得0表成1,1变成0,求出最小的步数使得每一行中1的个数相等,每一列中1的个数相等。思路:网络流。容量可以保证每一行和每一列的1的个数相等,费用可以算出最小步数。行向列建边,如果该格子是_uva12534

免费SSL证书_csdn alphassl免费申请-程序员宅基地

文章浏览阅读504次。1、Let's Encrypt 90天,支持泛域名2、Buypass:https://www.buypass.com/ssl/resources/go-ssl-technical-specification6个月,单域名3、AlwaysOnSLL:https://alwaysonssl.com/ 1年,单域名 可参考蜗牛(wn789)4、TrustAsia5、Alpha..._csdn alphassl免费申请

测试算法的性能(以选择排序为例)_算法性能测试-程序员宅基地

文章浏览阅读1.6k次。测试算法的性能 很多时候我们需要对算法的性能进行测试,最简单的方式是看算法在特定的数据集上的执行时间,简单的测试算法性能的函数实现见testSort()。【思想】:用clock_t计算某排序算法所需的时间,(endTime - startTime)/ CLOCKS_PER_SEC来表示执行了多少秒。【关于宏CLOCKS_PER_SEC】:以下摘自百度百科,“CLOCKS_PE_算法性能测试

Lane Detection_lanedetectionlite-程序员宅基地

文章浏览阅读1.2k次。fromhttps://towardsdatascience.com/finding-lane-lines-simple-pipeline-for-lane-detection-d02b62e7572bIdentifying lanes of the road is very common task that human driver performs. This is important ..._lanedetectionlite

推荐文章

热门文章

相关标签