dotnet core高吞吐Http api服务组件FastHttpApi
简介
是dotNet core下基于Beetlex实现的一个高度精简化和高吞吐的HTTP API服务开源组件,它并没有完全实现HTTP SERVER的所有功能,而是只实现了在APP和WEB中提供数据服务最常用两个指令GET/SET,满足在应用实现JSON,PROTOBUF和MSGPACK等基于HTTP的数据交互功能,虽然是一个精简版本但针对SSL这方面的安全性还是支持。有牺牲就必然有收获,FastHttpApi作出这么大的精简必然在性能上有所收获取,经测试FastHttpApi在GET/POST这些数据交互的场景下性能和吞吐能力是Asp.net core集成的Kestrel的要优胜许多。
https://github.com/IKende/FastHttpApi
使用便利性
FastHttpApi虽然在HTTP方面作了大量的精简,但并没有为此增加了它使用的复杂度。FastHttpApi具备asp.net core webapi的便利性;应用人员只需要制定和webapi一样的方法即可,在使用过程中和写普通逻辑方法没有多大的区别。
定义一个控制器
控制器用来定义具体相应URL处理的方法,只需要在类上定义Controller属性即可把类中的Public方法提供给Http访问;方法参数来源于QueryString,当参数标记为BodyParameter的时候参数来源于Http Body.
[Controller]public class ControllerTest{// /hello?name=public string Hello(string name){return DateTime.Now + " hello " + name;}// /add?a=&b=public string Add(int a, int b){return string.Format("{0}+{1}={2}", a, b, a + b);}// /post?name=public object Post(string name, [BodyParameter] UserInfo data){return data;}// /listcustomer?countpublic IList<Customer> ListCustomer(int count){return Customer.List(count);}// /listemployee?countpublic IList<Employee> ListEmployee(int count){return Employee.List(count);}// post /AddEmployee public Employee AddEmployee([BodyParameter]Employee item){return item;}}
Filter定义
Filter是Controller处理方法的拦载器,通Filter可以对所有方法进行统一拦载处理,如权限日志等。
[Controller][NotFoundFilter]public class ControllerTest{// /hello?name=[SkipFilter(typeof(NotFoundFilter))][CustomFilter]public string Hello(string name){return DateTime.Now + " hello " + name;}// /add?a=&b=public string Add(int a, int b){return string.Format("{0}+{1}={2}", a, b, a + b);}}public class GlobalFilter : FilterAttribute{public override void Execute(ActionContext context){Console.WriteLine(DateTime.Now + " globalFilter execting...");context.Execute();Console.WriteLine(DateTime.Now + " globalFilter executed");}}public class NotFoundFilter : FilterAttribute{public override void Execute(ActionContext context){Console.WriteLine(DateTime.Now + " NotFoundFilter execting...");context.Response.NotFound();Console.WriteLine(DateTime.Now + " NotFoundFilter executed");}}public class CustomFilter : FilterAttribute{public override void Execute(ActionContext context){Console.WriteLine(DateTime.Now + " CustomFilter execting...");context.Execute();Console.WriteLine(DateTime.Now + " CustomFilter executed");}}
启动服务
static void Main(string[] args){mApiServer = new BeetleX.FastHttpApi.HttpApiServer();mApiServer.Register(typeof(Program).Assembly);mApiServer.ServerConfig.BodySerializer = new BeetleX.FastHttpApi.JsonBodySerializer();mApiServer.Open();Console.Read();}
制定HTTP Body转换器
转换器是组件最常用的自定义功能,通过它可以实现不同种类的数据格式,如json,protobuf和msgpack等。以下是一个json转换器的实现
public class JsonBodySerializer : IBodySerializer{public JsonBodySerializer(){ContentType = "application/json";}public string ContentType { get; set; }public object GetInnerError(Exception e, HttpResponse response, bool outputStackTrace){return new ErrorResult { url = response.Request.Url, code = 500, error = e.Message, stackTrace = outputStackTrace? e.StackTrace:null };}public object GetNotSupport(HttpResponse response){return new ErrorResult { url = response.Request.Url, code = 403, error = response.Request.Method + " method type not support" };}public object GetNotFoundData(HttpResponse response){return new ErrorResult { url = response.Request.Url, code = 404 };}public class ErrorResult{public string url { get; set; }public int code { get; set; }public string error { get; set; }public string stackTrace { get; set; }}public virtual int Serialize(PipeStream stream, object data){int length = stream.CacheLength;string value = Newtonsoft.Json.JsonConvert.SerializeObject(data);stream.Write(value);return stream.CacheLength - length;}public virtual bool TryDeserialize(PipeStream stream, int length, Type type, out object data){data = null;if (stream.Length >= length){string value = stream.ReadString(length);if (type != null){data = Newtonsoft.Json.JsonConvert.DeserializeObject(value,type);}else{data = Newtonsoft.Json.JsonConvert.DeserializeObject(value);}return true;}return false;}}
性能对比测试
由于dotnet core下面没有其他简化的http api组件,只能拿Kestrel asp.net core来作对比,虽然对asp.net core不公平,但这样的对比测也只是为了体现简化后的性能回报;测试服务器是阿里云的4核虚拟机,8G内存,测试工具是AB,测试功能主要是针对GET/POST的json数据处理。由于Kestrel asp.net core默认不支持AB的Keep-Alive选项,所以测试结果就并没有针对asp.net core的Keep-Alive测试
Kestrel asp.net core代码
// GET api/values/5[HttpGet("{id}")]public ActionResult Get(int id){return new JsonResult(Employee.List(id));}// POST api/values [HttpPost]public ActionResult Post([FromBody] Employee value){return new JsonResult(value);}
FastHttpApi 代码
// /listemployee?countpublic IList<Employee> ListEmployee(int count){return Employee.List(count);}// post /AddEmployee public Employee AddEmployee([BodyParameter]Employee item){return item;}
Kestrel asp.net core GET测试结果
FastHttpApi GET测试结果
FastHttpApi GET测试结果开启Keep-Alive
Kestrel asp.net core POST测试结果
FastHttpApi POST测试结果
FastHttpApi POST测试结果开启Keep-Alive
针对Kestrel的对比测试
对比一下两者在accept connection上的性能差异,开启了两个AB实例同时进行压测,结果是FastHttpApi在处理并发数快高于Kestrel快一倍的情况,CPU使用率只有Kestrel的一半。
Kestrel代码
public void Configure(IApplicationBuilder app, IHostingEnvironment env){app.Run(context =>{byte[] data = System.Text.Encoding.UTF8.GetBytes(DateTime.Now.ToString());return context.Response.Body.WriteAsync(data, 0, data.Length);});}
FastHttpApi代码
// /hello?name=public string Hello(string name){return DateTime.Now + " hello " + name;}
Kestrel测试结果
FastHttpApi测试结果
dotnet core高吞吐Http api服务组件FastHttpApi相关推荐
- dotnet core 开发无缝兼容Http和Websocket协议的接口服务
在应用接口开发中往往要针对不同协义开发相应的代理服务,但对于Websocket和http这两种协议来说就有些不同,从实现上来看Websocket可以说是Http的升级子协议, 两者在协议处理上基本一致 ...
- 手把手教你使用spring cloud+dotnet core搭建微服务架构:服务治理(-)
背景 公司去年开始使用dotnet core开发项目.公司的总体架构采用的是微服务,那时候由于对微服务的理解并不是太深,加上各种组件的不成熟,只是把项目的各个功能通过业务层面拆分,然后通过nginx代 ...
- spring cloud+dotnet core搭建微服务架构:服务发现(二)
前言 上篇文章<手把手教你使用spring cloud+dotnet core搭建微服务架构:服务治理(-)>实际上只讲了服务治理中的服务注册,服务与服务之间如何调用呢?传统的方式,服务A ...
- dotnet core CPU高问题定位 dotnet-dump
原文出处:dotnet core 高CPU定位 dotnet-dump篇 - linFen - 博客园 在windows操作系统,我们可以用Windbg定位,那在linux微软也提供dotnet-du ...
- 使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例)
引子 这一篇文章将用一个完整的实例,给大家介绍如何基于dotnet core(微软.NET的最新版本,支持跨平台,跨设备的应用开发,详情请参考 https://www.microsoft.com/ne ...
- spring cloud+dotnet core搭建微服务架构:Api网关(三)
前言 国庆假期,一直没有时间更新. 根据群里面的同学的提问,强烈推荐大家先熟悉下spring cloud.文章下面有纯洁大神的spring cloud系列. 上一章最后说了,因为服务是不对外暴露的,所 ...
- .net core通过多路复用实现单服务百万级别RPS吞吐
多路复用其实并不是什么新技术,它的作用是在一个通讯连接的基础上可以同时进行多个请求响应处理.对于网络通讯来其实不存在这一说法,因为网络层面只负责数据传输:由于上层应用协议的制订问题,导致了很多传统服务 ...
- 友盟+高吞吐、极速高并发智能推送服务,赋能值得买科技的精准化用户运营
数据智能产业创新服务媒体 --聚焦数智 · 改变商业 经过多年的发展,我国消费电商总体上处于商品溢出.内容溢出的状态.如何提升C端(消费者)和B端(品牌与商家)的连接效率,成为消费电商企业亟需解 ...
- 国产中标麒麟Linux部署dotnet core 环境并运行项目 (三) 部署运行WEB API项目
部署dotnet Core Web API 上一步的文章,是我们公司最核心的一个ORM组件,在中标麒麟系统完成了一个插入数据的任务,这一步是将正式的从dot net framework 迁移到 dot ...
最新文章
- 添加FB登陆时,需要curl扩展
- luogu1347 排序
- 老是说我编译版本不够_海思3518E编译环境搭建
- Stackint stack = new Stackint报错原因
- 利用 Excel 在 Altium Designer 中快速新建元器件库
- 机器人车间气管_大开眼界!机器人焊装车间火力全开
- Unity中一个简单的显示FPS帧率小工具
- 刷课在线支付系统(新手入门编写,大佬勿喷)
- 【Node.js】Node.js安装及环境配置
- 制作多个exe顺序安装程序(打包程序)
- 电力拖动自动控制系统复习(二)
- bootstrap专栏 03.图文处理 02.图文排版
- iOS调试技巧(转载)
- 国务院拟出台职工带薪年休假规定
- Android(三)原生开发基本知识
- 专业治疗选择困难症----帮你做选择
- java unlock_java – 古怪的StampedLock.unlock(长)行为?
- input使用自动输入autofill的时候,修改背景颜色
- okhttp 服务器性能,okHttp小结
- 三菱FX3U PLC如何开启外部输入中断