<h2>#背景介绍</h2><p>先看一张图,页面一共调用了 20 多个后端接口,页面出现了明显的卡顿,而且每 6 个请求一组,只有前一组返回后才执行下一组。看到请求是 pending 状态,很容易以为是后端接口的问题,有经验的同学可能一眼看出这是浏览器的并发限制导致的,而非后端接口问题。</p><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/5924885-b3f957f32efb70a2.jpeg" img-data="{"format":"jpeg","size":127784,"height":851,"width":1047}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p>主流浏览器一般对同一个服务器的并发连接个数都是有限制的,</p><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/5924885-e3685fc52b8362d0.jpeg" img-data="{"format":"jpeg","size":51699,"height":698,"width":1502}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p>浏览器为什么要请求并发数限制?</p><p>1. 对操作系统端口资源考虑 PC 总端口数为 65536,那么一个 TCP(http 也是 tcp)链接就占用一个端口。操作系统通常会对总端口一半开放对外请求,以防端口数量不被迅速消耗殆尽。</p><p>2. 过多并发导致频繁切换产生性能问题 一个线程对应处理一个 http 请求,那么如果并发数量巨大的话会导致线程频繁切换。而线程的上下文切换有时候并不是轻量级的资源。这导致得不偿失,所以请求控制器里面会产生一个链接池,以复用之前的链接。所以我们可以看作同域名下链接池最大为 4~8 个,如果链接池全部被使用会阻塞后面请求任务,等待有空闲链接时执行后续任务。</p><p>3. 避免同一客服端并发大量请求超过服务端的并发阈值 在服务端通常都对同一个客户端来源设置并发阀值避免恶意攻击,如果浏览器不对同一域名做并发限制可能会导致超过服务端的并发阀值被 BAN 掉。</p><p>4. 客户端良知机制 为了防止两个应用抢占资源时候导致强势一方无限制的获取资源导致弱势一方永远阻塞状态。</p><h2>#服务编排适用场景</h2><p>服务编排主要基于现有的业务微服务使用在线配置的方式快速的生成一个聚合接口。</p><p>举例说明:</p><p>订单详情页面需要展示订单信息、商品信息和用户信息。可通过配置的方式生成一个接口先后调用底层微服务的订单详情接口、商品信息接口和用户信息接口,再从这 3 个接口的返回结果里提取需要的字段返回给前端页面。</p><p>Fizz 网关的服务编排的适用场景:</p><h3>#前端场景</h3><p>1、一个页面调用多个接口时,可以编排好返回聚合结果,提高页面数据的加载速度</p><p>2、移动设备计算能力有限,可以把数据计算或业务处理逻辑放到服务端完成,加快页面响应</p><h3>#后端场景</h3><p>1、替换应用层的聚合接口,减少应用层的胶水代码</p><p>2、快速生成透传数据类型的接口</p><p>3、数据转换和映射</p><h2>#快速聚合接口</h2><p>上面问题可通过 Fizz 网关的服务编排的聚合功能解决,简单说就是把前端页面要调用的多个接口改为由 Fizz 网关调用,然后把各接口的结果聚合后返回给前端。这样前端只需调用一个简单的聚合接口就可以了。</p><h2>#资料准备</h2><h3>#Fizz 网关安装</h3><p>可参考: https://www.fizzgate.com/fizz/guide/installation</p><h3>#echo 接口</h3><p>后端接口通过一个延时的 echo 接口模拟,模拟前端页面调用 10 个接口</p><p>http://127.0.0.1:8080/echo?latency=1000&echo = 接口 1</p><p>http://127.0.0.1:8080/echo?latency=1000&echo = 接口 2</p><p>...</p><p>http://127.0.0.1:8080/echo?latency=1000&echo = 接口 10</p><p>echo 接口源码:fizz-examples-rest-api</p><h3>#聚合接口</h3><ol><li><p>聚合接口路径:/fast-aggr/aggregate</p></li><li><p>请求方法:POST</p></li><li><p>入参格式:(格式可根据需要自行调整)</p></li></ol><p>{
"params1": {
"latency": 1000,
"echo": "接口1"
},
"params2": {
"latency": 1000,
"echo": "接口2"
},
// ... 省略
"params10": {
"latency": 1000,
"echo": "接口10"
}
}
</p><ol><li>返回结果:(格式可根据需要自行调整)</li></ol><p>{
"result1": "接口1",
"result2": "接口2",
// ... 省略
"result3": "接口10"
}
</p><h3>#新增接口</h3><p>菜单位置:服务编辑 -> 接口列表,点击新增</p><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/5924885-f3fe148282f47582.jpeg" img-data="{"format":"jpeg","size":33745,"height":598,"width":1069}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><h3>#配置输入</h3><p>在配置输入 tab 可以定义接口的入参和请求头等信息,如果不配置入参或请求头,网关会原样接收调用方传过来的所有入参或请求头,但不会对接收到的参数做任何校验。在本例子中我们使用约定的入参格式,就不定义入参数了,全留空。</p><h3>#配置步骤</h3><p>因为要并发调用 10 个接口,只需新增 1 个步骤,然后在步骤里新增 10 个 request, 服务选择我们预先准备好的 fizz-examples-rest-api 服务。入参我们使用 * 星号来透传前端传过来的参数,在这里使用了引用值的方式来引用入参,相关引用值的使用方式可参考文档:数据转换使用文档 。配置响应部分留空,网关会原样接收接口的返回结果。 按此方式我们分别配置好 10 个接口。</p><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/5924885-d5d5964d8413dda5.jpeg" img-data="{"format":"jpeg","size":65951,"height":830,"width":1351}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/5924885-3bfc749f7b2c28a0.jpeg" img-data="{"format":"jpeg","size":71911,"height":821,"width":1341}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><h3>#配置输出</h3><p>配置要返回给前端的响应报文,这里直接引用步骤里的结果</p><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/5924885-f817fb1714fea72a.jpeg" img-data="{"format":"jpeg","size":79385,"height":858,"width":1347}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><h2>#测试</h2><p>配置完接口后,点击测试</p><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/5924885-ed53c5f6f17a68e0.jpeg" img-data="{"format":"jpeg","size":61528,"height":842,"width":1191}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><h2>#访问正式接口</h2><p>接口配置好后需要发布并配置路由才可以对公网开放。菜单:编排审核 --> 我的申请,点击新增提交发布申请单。审核通过后即可发布。</p><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/5924885-44ea8b5750f60550.jpeg" img-data="{"format":"jpeg","size":148284,"height":1708,"width":2524}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p>发布后配置路由,菜单:网关管理 --> 路由管理</p><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/5924885-9affd721d58a2748.jpeg" img-data="{"format":"jpeg","size":184132,"height":1650,"width":2520}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p>正式接口访问 URL: http://[网关 IP]:8600/proxy/fast-aggr/aggregate</p><p>前端页面由原来调用多个接口改为调用一个聚合接口即可,大大降低了网络 IO 带来的延时,提高页面访问速度。</p><h2>#Fizz 网关介绍</h2><p>Fizz Gateway 是一个基于 Java 开发的微服务聚合网关,能够实现热服务编排聚合、自动授权选择、线上服务脚本编码、在线测试、高性能路由、API 审核管理、回调管理等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行 API 服务治理、减少中间层胶水代码以及降低编码投入、提高 API 服务的稳定性和安全性。</p><p>官网:https://www.fizzgate.com</p><p>GitHub: https://github.com/wehotel/fizz-gateway-community</p><p>码云:https://gitee.com/fizzgate/fizz-gateway</p><p>入门教程:https://www.fizzgate.com/fizz/guide/GettingStarted/</p>
Fizz Gateway 官方入门教程 —— 快速聚合多接口
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- Fizz 网关简介 Fizz Gateway 是一个基于 Java开发的微服务网关,能够实现热服务编排、自动授权选...
- 引言 在参与电商工作第一年,我从事客户端开发工作。虽然团队规模不大,但是对接的中间层团队人数,却相当于团队近四分之...
- Fizz管理后台使用教程 前言 Fizz Gateway[https://www.oschina.net/p/fi...
- Spring Cloud入门教程系列: Spring Cloud入门教程(一):服务治理(Eureka) Spri...