APISIX 在君润人力云原生平台的架构实践

news2024/11/18 9:24:29

讲师:袁鹏,一页科技架构师

摘要: 君润人力采用多套 Apache APISIX 集群来满足自研服务平台的功能需求。

君润人力成立于 2019 年,是一家以科技驱动的人力资源解决方案服务商,依托行业领先的科技水平和服务能力,专注于为客户提供一站式人力资源服务。自研数十家人力资源服务平台,深度链接 B 端企业和 C 端用户,构建数字化人力资源服务生态。

本文从君润人力业务快速扩张的背景入手,重点介绍开源 API 网关 Apache APISIX 对其自研平台系统架构的多样化应用场景支持,共有四大线上实战案例,希望对仍在网关选型过程中的企业或用户有所帮助。

君润人力自研系统架构概述

君润人力在搭建自研服务平台架构时,首要原则就是**“开放、开源、拥抱云原生”**。平台基于 Kubernetes 微服务架构构建云端系统,整体架构参考下图。

右侧是君润自研服务平台,DevOps 流程依托 Git webhook、coding、Kubernetes 集群实现全自动化与无感发布,业务系统基于 PaaS 平台进行迭代开发,确保研发规范,并达成技术栈的统一。上侧是监控手段,系统集成了 sky-agent 和 arthas,满足了线上服务观测多维度的需求。与此同时,采用腾讯日志云与 Kubernetes 结合的方式将服务日志存储在云上,实现 Kubernetes 集群内无文件化服务,避免磁盘容量堆积从而影响到 Kubernetes 集群单个节点的健康。

左侧是业务系统中最重要的环节 —— 流量管理。所有流量会通过 WAF(WAF,Web 应用防火墙,负责网络安全)进入三层网络里面的第一层 CLB,主要负责流量转发;第二层就是云原生网关 APISIX,它承担了业务系统的内部服务治理;第三层则是业务系统的 Gateway 应用内部的网关,负责单系统鉴权和路由。

其中第一层的 CLB 和第二层的 APISIX 尤其重要,它是所有系统的入口,一旦出现问题,那么所有系统将无法被访问。CLB 采用的是腾讯云服务,稳定性、扩展性与抗并发性能都比较高,业务架构需要解决的是第二层云原生网关 APISIX,保证它的高可用。

APISIX-Service 被部署在 Kubernetes 集群内部,Kubernetes 集群采用的是腾讯云提供的服务,为了保证出现问题后能够快速恢复,系统外置了 etcd 集群,使数据得以保留,这是 APISIX 集群高可用的体现。

那么,如何来保证 APISIX 的高并发和高性能?这里系统利用了 Kubernetes 的机制,当 APISIX 进行路由转发时,通过 Kubernetes 的服务名 + 服务端口使它在同一个网段内跳转;因为网关服务部署在 Kubernetes 内部,依托于 Kubernetes 的特性,可以进行滚动升级,进而达到 APISIX 网关升级的无感发布。

通过该架构图不难发现,第二层是所有流量的入口,选择一个满足业务扩张需求的云原生网关,对系统架构来说至关重要,下面谈谈在网关技术选型时的主要思考。

技术网关选型痛点

  • 数量庞大的业务系统。 目前人力资源这个领域有 15+ 服务平台,生态业务多样化,面临的问题也比较多,服务请求需要频繁变更,导致需要操作和配置的路由也非常多。原来系统是基于 CLB 进行流量转发,久而久之,运维人员需要配置和操作的地方非常多,耗费了大量的人力与时间。
  • 频繁的高并发大流量。 举个例子,客户集中在同一天发薪或提现大额资金。在用户数量达到大几十万时,集中进行的某些行为,如打卡、签约、领取任务或工资等,此时系统并发流量非常大,短期翻倍的情况比比皆是。
  • 个性化需求的扩张压力。 APISIX 是基于 OpenResty、Nginx 和 Lua 开发的,但如果用 Lua 来开发插件,会有一定的研发投入和维护成本。
    对于插件的支持,APISIX 已经提前做好了准备。APISIX 的官网提供了自定义插件 ext-plugin 来支持 Java 开发,技术栈问题迎刃而解。此外 APISIX 的生态非常好,作为国产网关产品,社区极其活跃,业内实践还特别多,在云原生网关这层来说,业内也是顶级存在。

我们的团队非常开放,做完技术选型后,快速实践落地。从上线部署到服务分批次接入,耗时不到 1 个月时间。目前 99% 的服务通过 APISIX 访问,上线一年多至今零事故,稳定性非常好。下面这张图里,大家能看到 APISIX 的一些特性,红字部分是我们最看重的几点。

APISIX 四大实践场景

下面我们来逐一介绍 APISIX 的四个实践场景。

路由策略

Apache APISIX 基于 Radixtree 和 etcd 提供路由极速匹配与配置快速同步的能力。路由和插件的设计实现都满足了极速性能和超低延迟的需求。比如以下两个场景中,都表现出了不错的性能:

  • 高峰期的 API 紧急停用。 业务系统处在高峰期时,用户导出百万数量级的报表数据,会使 MySQL 数据库直接宕机,此时重启服务也无法解决,用户继续导出操作会持续故障,这个问题以前我们得发版才能解决;而现在只需要运维人员简单配置一番,就可以做到 API 紧急停用,通过路由优先级策略和失效策略(依托 Serverless 插件),配合使 API 接口在分钟级下线,从而保证服务的稳定。
  • 业务系统较多。 其中 SaaS 系统需要支持客户自定义域名访问,我们采用了泛域名匹配,做到一次配置,全局通用。

下图是君润人力 2022 年度路由增长趋势图。可以看到,不论前端还是后端路由,在引入 APISIX 之后,都实现了三倍或以上的数量增长

安全控制

我们基于 APISIX 做了双层网关架构,在 APISIX 上隔离出一个逻辑网关,用户访问 CLB 进来 APISIX 再转发到业务系统。如果用户使用的这个功能需要用到 PaaS,就会通过 PaaS 服务网关进行访问,此时的 PaaS 服务网关就是一个逻辑网关。

我们在 Kubernetes 内部封闭了一个区域,即 PaaS 平台,里面包含大量的基础服务。利用 APISIX 网关的特性:熔断、安全、身份识别,使上层业务系统访问 PaaS 服务都需要通过 PaaS 网关。

流量管理

由于业务系统数量较多, 核心服务(SSO、PaaS 服务和发薪服务)可用性要求高, 这些服务的流量管控需要依赖 APISIX 提供的流量管理灰度策略。

为此,系统内部采用了两种方式进行。一是基于标签灰度。核心服务上到生产环境之前,测试人员先在灰度环境验证。我们会将测试用户流量转发到灰度服务,进行生产环境验证,验证通过后再基于权重切入流量,观察一段时间,没问题后再把全部流量切换到新版本;二是生产环境内。相同的服务并存多个版本,不同的业务系统访问不同的版本时,基于标签进行路由转发。

日志管理

从下图的架构模式可以看出,APISIX 和 Pod 服务都基于 Kubernetes 架构,所有后端路由都被绑定在同一服务上,在 APISIX 服务上配置的 Kafka 插件用来采集日志数据,同时配置了 Skywalking 监控程序性能。根据 RequestId 和 TraceId 在 Skywalking 和日志云,可以观测到整个调用链路,并查看每个环节的日志记录和 API 请求耗时。

从目前观测到的数据来看,系统每天都有上千万次的 API 请求,平均每天产生的日志数据达到 30G ,日志总量达到 TB 级。

使用 APISIX 的经验与展望

在使用 APISIX 的过程中,我们总结了一些经验之谈,在这里分享给对 APISIX 感兴趣的朋友们。

构建基础镜像需要拉取国外资源。 APISIX 需要部署在 Kubernetes 内部,内部会进行一定的二次开发和源码编译,这时需要到 GitHub 上拉取资源,目前官方提供的 Docker 镜像有一部分需要拉取国外资源,在进行本地开发和线上部署时,环境调试相对麻烦。

调试环境部署有要求。 自定义插件 java-plugin-runner ,需要基于 runner.sock 进行 RPC 通讯,现有案例较少,调试起来有一定困难,它需要和 APISIX-Service 在同一个镜像内。

**每天产生大量的日志记录到本地。**刚刚发布生产时,我们发现就算只开启 error 级别日志,每天的增长数量都非常大,导致 Kubernetes 集群中一个节点磁盘告警。后面打包镜像时将日志由文件记录改变为输出至控制台,收集至云日志服务 CLS 存储记录分析,实现本地无文件化存储。

当然,以上都属于前期准备工作上的必经之路,在正式投入使用后,APISIX 给我们带来的收益远远大于期望,总体有以下三点:

  1. 对业务发展起到了强有力的支撑。 使用 APISIX 后,系统功能更加丰富,性能更加强劲。APISIX 对 API 服务提供了多种可观测性和安全防护手段,可以支持我们每天千万次流量的访问。
  2. 助力研发交付效率。 比如原来配置 DNS 解析需要 10 分钟才能生效,而现在通过泛域名配置,几秒钟就能生效;因为原先需要在 CLB 和 Nginx 两个地方手动修改配置,而我们有 10 多个系统、100 多个服务,需要配置的点很多,应用了 APISIX 的泛域名配置后,现在只需要在控制面板上修改,极大地减少 DevOps 工作量。
  3. 大幅降低成本。 LB (负载均衡)成本的变化。LB 服务数量由 200+ 缩减到了 10+,大大降低了系统维护成本。
    后期我们还会有一系列需要借助 APISIX 云原生网关达成的功能开发包括但不限于:集成 Sentinel 使服务具备热插拔动态限流功能、开发多维度流量控制、风控识别功能升级、分层治理和全链路日志分析等等。届时将采用多套 APISIX 集群来满足自研服务平台的功能需求。

总结下来,使用 APISIX 云原生网关给君润人力服务平台带来了非常大的帮助,使我们能轻松应对多样化的复杂场景,打造趋于完美的数字化人力资源服务生态。

本文由博客一文多发平台 OpenWrite 发布!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/63216.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

透视投影函数的图像

因为有个需求是判断线是否被视锥体裁切,因为NDC比较好判断是否裁切,所以研究了一下透视投影变换的函数图像。 从透视投影矩阵可以看出,在同一个z上,x,y都是线性的,所以这里主要研究z的变换函数图像。 我用的是Vulkan&a…

[附源码]Python计算机毕业设计SSM健身网站平台(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【SQL】锁机制

【SQL】锁机制锁的不同角度分类从数据操作的类型划分:读锁,写锁从数据操作的粒度划分:表级锁,页级锁,行锁表锁意向锁(intention lock)自增锁(AUTO-INC锁)元数据锁&#x…

Java --- Spring6对IoC的实现

目录 一、控制反转 二、依赖注入 三、set注入 四、构造注入 一、控制反转 1、控制反转是一种思想 2、控制反转是为了降低程序耦合度,提高程序扩展力,达到OCP原则,达到DIP原则。 3、控制反转主要有:①、将对象的创建权力交出去&#xff…

莱特飞行优化及其使用场景

莱特飞行优化及其使用场景 一,莱特飞行 但是产生一个莱特飞行分布的随机数是比较难的,莱特只给出了一个积分,所以后面就有人提出了如何制造这样分布的随机数。 Mantegna 在1994年提出的一种用正态分布求解随机数的方法,有时也叫…

nginx目录穿越漏洞(insecure-configuration)

该漏洞是由于配置错误导致的 漏洞原理:传送门 这个常见于Nginx做反向代理的情况,动态的部分被proxy_pass传递给后端端口,而静态文件需要Nginx来处理。 环境: vulhub靶场 进入nginx/insecure-configuration 运行docker-comp…

【编码】PHP中文路径问题详解

1. 问题 低版本的PHP可能会遇到不支持中文路径的情况: (1) require(‘http://localhost/中文路径/test.php’); (2) require(‘\中文路径\test.php’); (3) $file fopen(‘http://localhost/中文路径/test.php’); (4) $file fopen(‘\中文路径\test.php’);…

SpringCloud框架(一):环境搭建 生产和消费 RestTemplate,底层源码解读

环境搭建 生产和消费 RestTemplate,底层源码解读SpringCloud环境搭建:生产和消费 RestTemplateSpringCloud的服务调用SpringBootApplication业务调用方法一: 通过静态工厂去拿业务调用方法二: 通过注入依赖去拿Template的底层源码…

BI国产化,必须要弄懂的2个关键

自“十四五”以来,我国诸多政策开始推动信创产业的深入,实现关键数字技术自主研发和自主可控。我国信创产业竞争力不断突破,国产化进程稳步推进。2022年开始政策重点提及“数字经济”、“数字政府”和国家信息化。在此背景下,BI产…

造物数藏:以数字藏品为契机 不断完善应用场景探索

数字时代已至,文化艺术作品的表现形式、传播途径都发生了变化,中华民族上下五千年的文化瑰宝得以借助新的形式被传承弘扬。而数字技术在发展过程中,也逐渐与文化产业水乳交融,孕育出数字文化产业新业态。数字藏品在近两年的突然红…

MySQL高可用MHA

目录 一.MHA概述 1.1 什么是MHA 1.2 MHA的组成 1.3 MHA的特点 二.MHA的工作原理 2.1 MHA的优点总结 三、实现过程 3.1 准备实验 Mysql 的 Replication 环境 3.1.1 相关配置 3.1.2 初始主节点 master 的配置 3.1.3 所有 slave 节点依赖的配置 3.1.4 配置一主多从复制…

VINS学习04———Omni教程

1. 本文简介 本文依照港科大开源的代码和论文 文章主要内容:对无人机集群实现协同定位。参与融合的定位因子有以下4点 全向鱼眼相机的VIO定位:VINS-Fisheye基于地图定位:视觉特征点协同建图基于UWB协同定位:节点间测距视觉检测定…

爆款小游戏用的都是什么游戏开发引擎?

随着微信生态中,小程序应用指数级的增长,许多休闲游戏变成为了众多游戏厂商流量变现的新手段。以近期很火的“羊了个羊”为例,它便是我们常常所说的小游戏。 游戏和小游戏的区别 要盘点小游戏开发引擎之前,我们得先来了解下游戏和…

[附源码]计算机毕业设计基于Springboot校园招聘系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

jQuery 效果- 动画

jQuery animate() 方法允许您创建自定义的动画。 jQuery 动画实例 jQuery jQuery 动画 - animate() 方法 jQuery animate() 方法用于创建自定义动画。 语法: $(selector).animate({params},speed,callback); 必需的 params 参数定义形成动画的 CSS 属性。 …

如何优雅的排空节点上的pod?云服务商是如何回收机器的?

概述 在 Kubernetes 中,不仅容器和 Pod 可以更换,节点也可以更换。Kubernetes 中的节点是 VM、服务器和其他具有计算能力的实体 (其实对k8s来说就是一个对象),在这些实体中运行 Pod 和容器。 节点耗尽是一种允许用户…

Matplotlib入门[01]——Pyplot

Matplotlib入门[01]——Pyplot 参考: https://ailearning.apachecn.org/Matplotlib官网 使用Jupyter进行练习 Matplotlib简介 matplotlib 是一个 Python 的 2D 图形包。 在线文档:http://matplotlib.org ,提供了 Examples, FAQ, API, Galle…

【架构设计】互联网架构项目架构演进以及三高设计概述

系统架构并非一蹴而就,架构目标也是随着业务发展而变化,业务推送技术发展,技术反哺业务。系统架构演进:单机 -->集群 -->分布式微服务 架构演进(日活用户占总用户量大概%4到%10,推测总用户量&#x…

Python配置OpenCV

一、背景 有个任务需要进行图像样本扩充,本人想要使用cv2来帮忙扩充电脑重装过系统,之前的环境都没有了参考之前自己写的博客,使用Anaconda安装失败了,一直显示下面的错误,目前还没有解决这个问题 Script file H:\An…

手把手教你音乐服务器搭建

最近发现,经常用的网易云音乐,有很多歌曲下架了,能听的越来越少了;歌单里的一些歌曲,现在要开通 VIP 才能听了。其实自己常听的歌曲不是很多,现在却有很多听不了了。 怎么办呢,付费吗?花钱当然是一个好方式,花 1 分钟开通 VIP,立马就可以畅听起来。 不过前两天翻东西…