当前位置: 首页 > news >正文

京东大型API网关实践之路

概述

1、背景

京东作为电商平台,近几年用户、业务持续增长,访问量持续上升,随着这些业务的发展,API网关应运而生。

API网关,就是为了解放客户端与服务端而存在的。对于客户端,使开放给客户端的接口标准统一,以降低客户端的接入成本;对于服务端,使服务端无需关注接口暴露在公网面临的问题而着眼于业务的实现,来提升开发效率。

在刚刚过去的全民狂欢购物节,API网关如何做才能高效的处理近千万的并发请求是本文的重点。

2、API网关介绍

API网关,作为客户端与服务端的纽带,核心任务是将客户端请求转发到后端服务。但是,作为所有流量请求的入口 , 面临的很重要的一个问题就是高并发,因为高并发的需要,要求网关处理请求必须高效;其次是安全防护,安全主要是指对网关对后端服务的一个保护;再者就是完善的数据统计及监控报警机制;当然,为了方便我们内部用户接入,多协议适配的支持、灰度发布上线也是必备功能。

图片

API网关特征:

1)高性能:在高吞吐量下保证低延迟。

2)安全稳定:身份认证、精细化流量控制、大数据实时分析等多种手段保障服务质量。

3)平台化:进行各项数据监控,提供数据分析、监控告警、故障定位等服务。

4)灰度:灰度发布,支持按设备、PIN、自定义比例方式在不影响正常用户的情况下,保障后端服务平稳过渡。

5)方便快捷:支持http、jsf服务快捷接入,mock功能加快协同开发。

技术实践

API网关服务于原生客户端、Web、小程序,不限于具体的业务。其主要架构图如下所示:

图片

主要分3层:

  • 第1是VIP层,主要是接收客户端http、https请求,并将请求转发到网关;

  • 第2是网关层,对请求进行合法性校验并转发;

  • 第3层就是后端业务API,这些业务方,就是我们服务的主要对象。

1、高并发实现

网关高并发实践主要利用异步化处理技术,将请求由同步变为异步,利用NIO多路复用,达到请求接收最大化。

首先看下图同步处理过程:

图片

采用同步处理,线程的释放就受限于后端服务响应的快慢。当响应过慢时,线程池就容易出现耗尽现象,并且资源利用率上不去,吞吐量很低,或者说此时的大量请求都会被服务器拒绝。

由此可以看出,同步处理使资源利用率得不到充分的利用,大量请求被拒绝同时又影响了用户体验。如果想提高并发只能通过横向加机器,这样造成机器资源大量浪费的现象。如果是网关这么处理,那么这种现象体现的将更明显。

为了解决同步引起的问题,采用异步,如下图所示:

图片

通过实现异步化处理,线程可以在开启异步后直接释放,当前请求的响应会被延后,当后端服务有响应后,再将响应写回给客户端。这样就算是有后端服务响应很慢,因为线程已被释放了,可以继续接收新的请求,达到服务资源使用的最大化。

2、安全防护

精细化流控:

作为所有业务方的第一道防线,网关承载着海量流量的访问,以及随时可能爆发的恶意流量攻击的压力。

很典型的,每年双十一或是618都会有刷子恶意刷后端服务接口,如果网关不做处理直接将流量透传到后端服务,后端服务很大可能会被瞬时流量冲垮,至少会增大后端服务响应延时及浪费公司大量资源来处理攻击。

那么,进行流量控制就是必不可少的。网关提供秒级的流量控制,可以对单个接口按地域、风控等级等维度进行流控配置。这样流量只到了网关层面,就不会透传到后端服务了。

流控主要是采用令牌桶算法实现,策略主要有排队或熔断,具体的策略根据不同的端,选择合适的流控动作。

      

授权及签名认证:

API暴露在公网,肯定会存在被刷的风险,网关要做的就是尽可能降低这种风险。就像通过制定法律来尽可能减少犯罪一样,通过访问权限控制、签名认证、跨域校验等来尽可能的降低API接口被刷的风险。

授权:只有通过API负责人授权的接口,客户端才有权限访问 。如果未授权,在网关处拦截,响应给客户端没有访问权限;

签名认证:按规则将请求参数通过HMAC-SHA256算法运算生成签名值,对客户端计算的签名值与网关计算的签名值进行匹配,匹配的请求继续向下流转,否则直接被拦截。

跨域效验:

对于WEB端应用,调用网关属于跨域请求。这类请求,如果不进行校验,会产生跨域攻击。所以需要获取到客户端请求来源,对客户端请求来源进行认证,只有合法的请求来源才被允许访问后端服务。对于小程序应用,也会校验小程序真实性。

3、灰度发布

设想这样一个场景:有一个核心业务,做了比较大的改动,又或者是项目重构,开发完成,同时测试完成,要上线了。但是,问题也来了:因为改动很大,业务很重要,测试所拿机型设备有限,担心直接全部上线会影响测试未覆盖的线上用户。那么,能不能先有10%的流量请求到新服务,看下用户使用情况,再决定是否全部上线呢。

为了满足这种需求,网关提供按设备号、用户标识的定点灰度测试,同时支持按比例进行的灰度上线。

图片

用户请求到网关,如果开启灰度模式,就获取到灰度地址,将请求转发到特定的服务。

自动化运营

在高举可持续发展旗帜的时代下,如果一个产品仅仅做到功能齐全是远远不够的。只有做到可持续发展,实现自动化运营的产品才真正是个好产品。API网关平台化意味着N条产品线,一个网关,通过实现自动化运营,解放生产力,打造统一化平台,提供可持续化产品,拥抱API经济,实现API变现。

图片

API网关控制台首页

1、独立部署与快速扩展

  API网关统一管理着发布方对外暴露的API服务,各个服务可以独立开发部署。针对后端服务的发布与下线,发布方可通过API网关提供界面化管理控制平台,实现流程化管理,线上审批通过后,实时生效,无需手动控制,实现自动化运营。

同时对于后端服务的各项配置,如API权限管理、流量控制等,API网关进行自动化管理,动态配置,动态加载,保证在无需重启服务的情况下即可进行配置更改操作。

要实现自动化运营,除了对API服务管理做到独立部署、快速扩展外,对于API的调用方也实现自助API开通,授权访问API服务。

2、数据分析与监控告警

由于API网关处在一个内部系统与外部环境的分界点处,所有外部请求都经过API网关进行调度和过滤,每时每刻都有大量请求通过API网关进入内部服务。因此可以在API网关层进行请求接入监控,监控各个接口的访问请求并进行收集,以便相应指标的统计分析。

在API网关界面化管理控制平台中,对收集统计到的监控数据,如API接口调用量、响应时间等信息,提供了可视化的API实时智能数据分析与监控告警功能,订阅API异常报警信息,以便实时监控后端服务运行情况。

图片

后端接口监控数据图

3、线上环境故障定位

当发生线上故障时,API网关提供一系列的故障现场还原措施进行故障的定位与排查,通过日志实时分析、异常流量实时探测、监控告警等技术,快速拿到故障快照、还原故障现场以及迅速定位问题原因。

图片

后端接口调试界面图

总结

作为系统的唯一入口,API网关的地位是至关重要的。API网关位于技术中台的核心要塞,符合技术中台战略发展方向,做到了产品组件化、需求结构化、数据配置化、业务可视化:

  • 产品组件化:具有足够的灵活性和扩展性,支持提供特定场景特定需求。

  • 需求结构化:根据业务能力、业务规则完成需求结构化分解,降低沟通成本。

  • 数据配置化:在线配置业务,快速发布上线。

  • 业务可视化:细粒度划分业务规则,多维度展示业务监控数据。

对于基于微服务架构实现的后端服务而言,接入一个性能高效、安全稳定的API网关,享受其带来的身份认证、路由请求、协议转换等便利,更加专注于自身业务逻辑的开发,是有必要的。利用API网关对各个服务API进行统一的管理和监控,解决客户端与后端服务交互不便的问题,具有十分重要的意义。

相关文章:

京东大型API网关实践之路

概述 1、背景 京东作为电商平台,近几年用户、业务持续增长,访问量持续上升,随着这些业务的发展,API网关应运而生。 API网关,就是为了解放客户端与服务端而存在的。对于客户端,使开放给客户端的接口标准统…...

图像处理: 马赛克艺术

马赛克 第一章 马赛克的历史渊源 1.1 马赛克 艺术中的一种表面装饰,由紧密排列的、通常颜色各异的小块材料(如石头、矿物、玻璃、瓷砖或贝壳)组成。与镶嵌不同的是,镶嵌是将要应用的部件放置在已挖空以容纳设计的表面中&#xff0…...

postgresql-管理数据表

postgresql-管理数据表 创建表数据类型字段约束表级约束模式搜索路径 修改表添加字段删除字段添加约束删除约束修改字段默认值修改字段数据类型重命名字段重命名表 删除表 创建表 在 PostgreSQL 中,使用 CREATE TABLE 语句创建一个新表: CREATE TABLE …...

Llama2-Chinese项目:3.1-全量参数微调

提供LoRA微调和全量参数微调代码&#xff0c;训练数据为data/train_sft.csv&#xff0c;验证数据为data/dev_sft.csv&#xff0c;数据格式如下所示&#xff1a; "<s>Human: "问题"\n</s><s>Assistant: "答案举个例子&#xff0c;如下所…...

蓝桥等考Python组别十级001

第一部分:选择题 1、Python L10 (15分) 已知s = Hello!,下列说法正确的是( )。 s[1]对应的字符是Hs[2]对应的字符是ls[-1]对应的字符是os[3]对应的字符是o正确答案:B 2、Python L10 (15分) 运行下面程序,输入字符串“Banana”,输出的结果是&#x...

记录 Git 操作时遇到的问题及解决方案

目录 问题&#xff1a;git pull 时报错报错内容&#xff1a; ! [rejected] v1.0.3 -> v1.0.3 (would clobber existing tag)原因&#xff1a;本地 Git 仓库中已经存在名为 v1.0.3 和 v1.0.6 的标签了&#xff0c;而尝试从远程仓库&#xff08;GitHub&#xff09;拉取这些标签…...

第一届“龙信杯”电子数据取证竞赛Writeup

目录 移动终端取证 请分析涉案手机的设备标识是_______。&#xff08;标准格式&#xff1a;12345678&#xff09; 请确认嫌疑人首次安装目标APP的安装时间是______。&#xff08;标准格式&#xff1a;2023-09-13.11:32:23&#xff09; 此检材共连接过______个WiFi。&#x…...

Vue与React//双绑问题

Vue和React是两个目前最流行的前端框架&#xff0c;它们有一些区别主要区别如下&#xff1a; 响应式原理&#xff1a;Vue使用基于模板的方式进行双向绑定&#xff0c;其中使用了Vue自己实现的响应式系统。Vue能够通过追踪数据的依赖关系&#xff0c;自动更新DOM元素。而React采…...

信息安全第四周

社会工程学 社会工程学主要研究如何操纵人的心理和情感来获取机密信息或其他目标。它主要不是通过技术手段攻击计算机系统&#xff0c;而是通过心理学和人际交往技巧来欺骗人&#xff0c;使他们泄露密码、安全代码或其他敏感信息。社会工程学主要是一种安全风险&#xff0c;主要…...

机器学习基础概念与常见算法入门【机器学习、常见模型】

机器学习基础概念与算法 机器学习是计算机科学领域的一个分支&#xff0c;它致力于让计算机系统具备从数据中学习和改进的能力&#xff0c;而不需要显式地进行编程。与传统编程相比&#xff0c;机器学习有着根本性的不同之处。 机器学习与传统编程的不同 传统编程&#xff1…...

移动端 [Android iOS] 压缩 ECDSA PublicKey

移动端 [Android & iOS] 压缩 ECDSA PublicKey AndroidiOS 使用 Android KeyStore 和 iOS 的 Secure Enclave 提供的安全能力使用 P-256 来对 API 请求进行签名&#xff0c;服务器端再进行验证。 但是发现不论是 iOS 还是安卓都没有提供一个便捷的方式从 iOS 的SecKeyCopyE…...

Spring的配置Bean的方式

在Spring框架中&#xff0c;配置Bean有三种主要方式&#xff1a;自动装配、基于Java的显式配置和基于XML的显式配置。 1、自动装配&#xff1a; 自动装配是Spring容器根据Bean之间的依赖关系&#xff0c;自动将需要的Bean注入到目标Bean中。这是一种非常简便和快捷的配置方式&…...

安防监控/视频汇聚平台EasyCVR云端录像不展示是什么原因?该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…...

毛玻璃态登录表单

效果展示 页面结构组成 通过上述的效果展示可以看出如下几个效果 底部背景有三个色块并且效果是毛玻璃效果登录表单是毛玻璃效果登录表单的周围的小方块也是有毛玻璃效果并且与登录表单有层次效果 CSS3 知识点 filter 属性backdrop-filter 属性绝对定位属性动画属性 底部背…...

Java:使用 Graphics2D 类来绘制图像

目录 过程介绍创建一个 BufferedImage 对象创建一个 Graphics2D 对象绘制字符和干扰线将生成的图像保存到文件 示例代码 过程介绍 创建一个 BufferedImage 对象 首先创建一个 BufferedImage 对象来表示图像 创建一个 Graphics2D 对象 然后使用 createGraphics() 方法创建一…...

VUE2项目:尚品汇VUE-CLI脚手架初始化项目以及路由组件分析(一)

标题 环境VUE2目录publicassetscomponentsmain.jsbabel.config.jspackage.jsonvue.config.js 项目路由分析Header与Footer非路由组件完成Header示例 路由组件的搭建声明式导航编程式导航 Footer组件的显示与隐藏路由传递参数重写push和replace三级联动组件拆分附件 环境 前提要…...

输入网址input,提取标题和正文

https://m.51cmm.com/wz/WZnKubw1.html?share_token715beaff-33ef-466b-8b6c-092880b9a716&tt_fromcopy_link&utm_sourcecopy_link&utm_mediumtoutiao_android&utm_campaignclient_share - 【科学决策七步骤 - 希律心理】 - 今日头条 提取标题和正文input输…...

docker--redis容器部署及与SpringBoot整合

1. 容器化部署docker 拉取镜像创建数据目录data 及 配置目录conf创建配置文件redis.conf启动redis容器进入容器,进行Redis操作设置为自启动:docker update redis --restart=alwaysdocker pull redis:5.0.12docker run -d --rm --name my_redis -p 6379:6379 -v D:/docker/red…...

数据库:Hive转Presto(二)

继续上节代码&#xff0c;补充了replace_func函数&#xff0c; import re import os from tkinter import *class Hive2Presto:def __int__(self):self.t_funcs [substr, nvl, substring, unix_timestamp] \[to_date, concat, sum, avg, abs, year, month, ceiling, floor]s…...

docker安装apisix全教程包含windows和linux

docker安装apisix 一、Windows安装1、首先需要安装docker和docker compose&#xff0c;如果直接安装docker desktop&#xff0c;会自动安装docker compose。2、重新启动电脑3、访问 Docker 的下载&#xff08;[https://www.docker.com/products/docker-desktop](https://www.do…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...