微服务和消息队列的基础都是RPC框架,比较有名的有WCF、gRPC、Dubbo等,我们的NewLife.ApiServer建立在网络库NewLife.Net之上,支持.Net Core,追求轻量级和高性能,只有最简单的远程调用功能。
现在是网络系列文章的第五篇,前面四篇快速过了一遍网络库基本用法,也做了压力测试并给出数字。
本章正式进入应用层面,并且采用.Net Core作为例程,说明我们一开始就支持.Net Core,也算是回答了很多支持者的疑问。
老规矩,先上代码:https://github.com/nnhy/NewLife.Net.Tests (例程RpcTest)
ApiServer源码:https://github.com/NewLifeX/X/tree/master/NewLife.Core/Remoting
ApiServer实在太小了,就让它和Net一起分别作为X组件核心库的一个目录。
一、 背景
ApiServer开始于2014年,我们为了建立物联网云平台,解决云端、硬件设备端、手机端、网页端相互通信,而建立的一套完整的通信体系。
公司业务需要,在ApiServer上建立了包括服务治理、注册发现、负载均衡、设备鉴权、通信加密、压缩、P2SP网络、WebSocket等等一系列模块。
这一套物联网云平台已经用在很多家公司上,根据NewLife两年解封惯例,大概在2019年开源放出大部分源码。
本文所指的ApiServer,仅指开源的RPC部分。
2017年4月1日晚,我们想知道ApiServer的表现,做了一次最大并发数测试,目标是单节点支持100万设备接入。
租用60台阿里云ECS,实际测试单节点最大支持84.5万模拟设备接入,设备端的心跳包(5~60s) 拖垮了32核服务端。
二、功能特点
先看看例程最终效果:
ApiServer主要特点如下:
支持.Net Core/Net40/Net45,这个最近太热门了,其实X组件绝大部分功能都支持.Net Core
多年积累。从2014年起,遇到并解决了很多问题,也去掉了很多可选功能,只保留必要功能
性能尚可。网络库2266tps,ApiServer在40核服务器上单客户端带业务测试得到16万tps
简单易用。高仿MVC的Controller风格,支持上下文和执行前后过滤器,客户端直接Invoke,无需生成Stub代码,参数无需完全一致,便于多版本兼容
容易调试。默认通信参数和返回采用Json封送,打开编码器日志后,远程调用的收发一目了然。(网络库的高性能就是用来给Json浪费的……)
大包请求。支持收发大数据包(如1M~1000M),特殊服务接口避开Json序列化,直接走二进制。
支持异常。服务接口抛出的异常,能够封装传递到客户端
三、服务端例程
新建.Net Core 2.0项目RpcTest,我们把服务端客户端代码写到一起。
服务暴露高仿MVC,一个控制器内可以暴露多个服务方法
/// <summary>自定义控制器。包含多个服务</summary> class MyController { /// <summary>添加,标准业务服务,走Json序列化</summary> /// <param></param> /// <param></param> /// <returns></returns> public Int32 Add(Int32 x, Int32 y) => x + y; /// <summary>RC4加解密,高速业务服务,二进制收发不经序列化</summary> /// <param></param> /// <returns></returns> public Packet RC4(Packet pk) { var data = pk.ToArray(); var pass = "NewLife".GetBytes(); return data.RC4(pass); } }