基于.NET CORE微服务框架 -谈谈surging API网关
1、前言
对于最近surging更新的API 网关大家也有所关注,也收到了不少反馈提出是否能介绍下Api网关,那么我们将在此篇文章中谈谈surging Api 网关
开源地址:https://github.com/dotnetcore/surging
2. API网关
简介
API 网关是服务提供者的访问入口,主要起到隔离外部访问与内部系统的作用。它主要解决服务消费者的身份认证、监控、负载均衡、缓存、限流等问题。
API网关的流行,源于近几年的大型互联网的兴起,从以前的单体应用,到垂直应用架构,再到现在的微服务架构,而微服务的出现,让API网关成为微服务的标配组件
作用和价值
对于API网关主要起到以下作用:
系统隔离:隔离外部访问与内部系统
业务解耦:解耦各层的相互依赖,快速应对业务变化,使得微服务能够独立灵活部署,统一管理
灵活配置:对于微服务水平和垂直扩展能顺利进行而搭设的工作平台,平台能对于服务进行灵活配置。
系统隔离
内部服务与外网都是隔离的,为了安全考虑,应用服务都是运行在内网,不允许外部访问,这时候API网关通过身份验证、数据安全、容错降级等规则,对访问进行了初步的过滤,从而达到灵活动态配置,保证了数据的安全性和系统的可靠性。
系统模块的解耦
微服务所面向的角色包括服务提供者,服务消费者,服务运维等,各个角色都有各自的述求,为了满足各个角色的需求和依赖关系,就需要网关动态灵活配置,让各方专注于自己的领域需求。主要从以下几点进行解耦
解耦业务与非业务功能
在满足实现业务功能外,还面临非业务的功能性需求,比如突发性大规模服务访问,黑客攻击,身份验证,数据的流量监控等,这些非业务的功能需求,不能与业务服务耦合在一起,需要解耦成独立的系统,由专业人员和专业团队进行处理
解耦服务消费者与服务提供者
对于服务提供者主要是对业务进行实现,而业务的快速变化,为不了不破坏业务的稳定性,这时候就需要中间层定义统一的接口、协议和报文,以满足服务消费者多变的需求。
业务和非业务可配置化
网关除了请求路由、转发外,还需要负责数据安全、鉴权、限流、监控等,往往随着业务的变化不断调整,比如访问大规模增长,这时候就需要考虑发生错误能及时熔断降级,或者分流,限流,而这时候就需要网关提供可配置化的界面,便于修改,而对于网关来说更应该提供插件化的机制来支持可配置化的功能性动态扩展。
网关的价值
网关对于系统进行了隔离,保证了服务的安全和可靠性,对于运维也减少维护成本和变更流程。服务提供者和消费者也能减少耦合,还能够独立进行部署,同时通过熔断也避免了服务大规模的瘫痪,节约服务的维护开发成本,减少上线风险。
3. surging网关架构设计
Surging网关是基于.net core针对RPC进行治理的系统,支撑微服务落地接入。通过该系统可以进行身份认证,服务流控,服务降级,数据监控等。整个系统模块如下图:

功能概述
Surging 提供的功能包括数据监控、服务管理、数据安全、身份认证、流量控制、分流控制,主要实现了对路由请求分发、鉴权、限流、降级、数据安全等功能,这里介绍下实现要点。
服务管理
服务管理包括服务路由、服务元数据、容错规则和关联服务管理,
在微服务框架中,服务注册中心用于存储服务提供者地址信息、服务元数据、关联服务信息,服务消费者通过注册中心获取和更新容错规则,而通过容错规则服务消费端就能熔断降级。并且对调用的服务提供地址进行监控,从而标识服务提供者的健康状态,架构如下:

身份认证
在传统的单体架构中,通过会话(session)或者令牌来校验用户。而在微服务架构中,用户需要针对于分布式部署的微服务集合进行交互,如采用与单体应用相同的效验模式,那么如何让所有的服务集合来认证用户是否合法。此时要解决这个问题可以采用令牌与网关相结合的方案。
这个方案所有的请求都通过网关进行认证,使用令牌进行授权,同时也可以对于令牌进行注销。
流量控制
在突发访问量增大的时候,由于服务的负载能力有限,为了防止突发情况的请求对服务压力过大而拖垮服务,也就是面对大流量的时候,如何进行流量控制?
针对于服务接口的访问量增大而采用的控制策略包括分流、降级,限流等,本文讨论下限流的策略
实际传统的架构中,我们通常使用第三方软件进行流量保护,比如Nginx、安全狗等软件。而采用第三方软件会增加运维的维护成本,也没有基于业务的可灵活性配置。所以需要通过统一的入口API网关进行管理,然后通过算法进行限流。
流量控制能从用户、服务二个维度进行流量控制,当流量超过设置阈值时,API网关会直接返回错误信息给请求者,不会再继续调用服务提供者,从而保护了服务不被攻击。
分流控制
为了防止突发情况的请求对服务压力过大而拖垮服务,,那么可以采用分流策略。通过负载均衡算法在健康可用的实例之间分发请求,这样就可以把请求均衡地分发到各个服务器上
数据安全
在业务系统中,通常会碰到一些敏感的数据,而为了防止敏感数据发生泄露,通常我们会对于敏感数据进行加密。就好比如前几年的京东数据泄露事件,CSDN的账号泄露事件,这些事件的发生使得用户的身份证、密码、电话等敏感信息以明文的形式进行外泄,导致了多名用户金钱上的损失。对于公司造成了恶劣的印象。
为了减少数据安全与系统的耦合,可以采用API 网关进行配置,这样开发人员也无需知道其加密方式。
数据监控
一个稳定可靠的系统离不开监控, 不仅监控服务是否存活,还要监控系统的运行状况,能及时发现崩溃,连接超时,内存泄漏等问题。对于运行情况会进行采集,分析,同时发现问题能及时告警通知处理人员进行处理。
模块设计
Surging 网关是统一服务入口,可方便实现对服务接口进行管控,模块组件设计如下图:

4. 总结
因为API网关处于开发初期,所以只能简单介绍下,后期会详细介绍下surging架构设计。如感兴趣请多关注或者加入QQ群:542283494
基于.NET CORE微服务框架 -谈谈surging API网关的更多相关文章
- 基于.NET CORE微服务框架 -谈谈surging的服务容错降级
一.前言 对于不久开源的surging受到不少.net同学的青睐,也受到.net core学习小组的关注,邀请加入.NET China Foundation以方便国内.net core开源项目的推广, ...
- 基于.NET CORE微服务框架 -谈谈surging 的messagepack、protobuffer、json.net 序列化
1.前言 surging内部使用的是高性能RPC远程服务调用,如果用json.net序列化肯定性能上达不到最优,所以后面扩展了protobuf,messagepack序列化组件,以支持RPC二进制传输 ...
- 基于.NET CORE微服务框架 -谈谈Cache中间件和缓存降级
1.前言 surging受到不少.net同学的青睐,也提了不少问题,提的最多的是什么时候集成API 网关,在这里回答大家最近已经开始着手研发,应该在1,2个月内会有个初版API网关,其它像Token身 ...
- 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)
一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...
- .NET Core微服务二:Ocelot API网关
.NET Core微服务一:Consul服务中心 .NET Core微服务二:Ocelot API网关 .NET Core微服务三:polly熔断与降级 本文的项目代码,在文章结尾处可以下载. 本文使 ...
- 基于.NET CORE微服务框架 -浅析如何使用surging
1.前言 surging受到大家这么强烈的关注,我感到非常意外,比如有同僚在公司的分享会上分享surging, 还有在博客拿其它的RPC框架,微服务做对比等等,这些举动都让我感觉压力很大,毕竟作为个人 ...
- 基于.NET CORE微服务框架 -Api网关服务管理
1.前言 经过10多天的努力,surging 网关已经有了大致的雏形,后面还会持续更新完善,请大家持续关注研发的动态 最近也更新了surging新的版本 更新内容: 1. 扩展Zookeeper封装2 ...
- 基于.NET CORE微服务框架 -surging 基于messagepack、protobuffer、json.net 性能对比
1.前言 surging内部使用的是高性能RPC远程服务调用,如果用json.net序列化肯定性能上达不到最优,所以后面扩展了protobuf,messagepack序列化组件,以支持RPC二进制传输 ...
- 基于thrift的微服务框架
前一阵开源过一个基于spring-boot的rest微服务框架,今天再来一篇基于thrift的微服务加框,thrift是啥就不多了,大家自行百度或参考我之前介绍thrift的文章, thrift不仅支 ...
随机推荐
- 父(Spring)子(SpringMVC)容器之初解篇
Spring和SpringMVC作为Bean管理容器和MVC层的默认框架,已被众多WEB应用采用,而在实际开发中,由于有了强大的注解功能,很多基于XML的配置方式已经被替代,但在实际项目中,我们经常会 ...
- 微信小程序多宫格抽奖
最近闲来无事,做了一个多宫格抽奖的例子,有什么需要改进或者错误的地方,请留言,谢谢 首先看效果 思路是先让其转动2圈多,然后再进行抽奖,格子运动用的是setTimeout,让其运行的时间间隔不一样,然 ...
- 设计模式的征途—14.职责链(Chain of Responsibility)模式
相信大家都玩过类似于“斗地主”的纸牌游戏,某人出牌给他的下家,下家看看手中的牌,如果要不起,则将出牌请求转发给他的下家,其下家再进行判断.一个循环下来,如果其他人都要不起该牌,则最初的出牌者可以打出新 ...
- CocoaPods私有库管理
简介: 前一篇文章已经介绍过如果安装使用CocoaPods,下面将要介绍如果通过CocoaPods和git来维护我们私有的库. 个人或公司在开发过程中,会积累很多可以复用的代码包,有些我们不想开源,又 ...
- ArrayList的实现细节(基于JDK1.8)
ArrayList是我们经常用到的一个类,下面总结一下它内部的实现细节和使用时要注意的地方. 基本概念 ArrayList在数据结构的层面上讲,是一个用数组实现的list,从应用层面上讲,就是一个容量 ...
- 简易 HTTP Server 实现(JAVA)
该简易的J2EE WEB容器缺失很多功能,却可以提供给大家学习HTTP容器大致流程. 注:容器功能很少,只供学习. 1. 支持静态内容与Servlet,不支持JSP 2. 仅支持304/404 3. ...
- ASP.NET在母版页或内容页上获取控件ID
原本想给一个button添加一个confirm,不同的分数提示不同的信息(大于80合格,小于80不合格,提示是否提交),最开始用了button.Atribute.Add();但是它每次获取到的是lab ...
- PyCharm中Directory与Python package的区别
对于Python而言,有一点是要认识明确的,python作为一个相对而言轻量级的,易用的脚本语言(当然其功能并不仅限于此,在此只是讨论该特点),随着程序的增长,可能想要把它分成几个文件,以便逻辑更加清 ...
- Python巡检Oracle表空间并邮件告警
最近,自学了Python基础,突发奇想,把以前通过shell自定义通过nagios实现Oracle表空间以及ASM以及备份的脚本改进下,首先感叹的是Python脚本看上去确实挺好的,效率还不错. 这是 ...
- 【javascript】函数中的this详解 — 大家准备好瓜子,我要讲故事啦~~
javascript中的this和函数息息相关,所以今天,我就给大家详细地讲述一番:javascript函数中的this 一谈到this,很多让人晕晕乎乎的抽象概念就跑出来了,这里我就只说最 ...