一个能够在Asp.Net和Asp.NetCore之间能够互相通讯的Rpc
一、特性
1、跨平台
2、提供负载均衡算法
3、支持ZK服务协调
4、提供了JSON、BinarySerializer、还有自定义的序列化方式
5、客户端提供Socket连接池,以便于快速交互,防止类似大文件上传时会阻塞
6、支持异步方法
7、支持.net与.netcore之间通信
8、支持采用MongoDb收集请求信息(采用双缓冲队列,极限的不影响传输速度)
9、提供请求日志监控后台(还未全部完善)
二、项目结构

编译器采用vs2017.
NRpcItem 是Framework下的NRpc源代码。NetCoreRpcItem是.NetCore下的源代码。NRpcSerializer是自己写的一个序列化方法,速度和json序列化对比稍慢一点,但是速度可以接收。
值得注意的是NRpcItem 里面采用Autofac来作为IOC容器,服务端的代码都必须要基于Autofac来实现依赖注入。
NRpc.AdminManage是日志监控后台,目前只有.netCore版本。
三、自定义序列化方法性能测试

虽然在执行速度上比json稍慢,但是支持对byte[]类型的序列化,而且客户端不需要任何的标记,方便使用。实现过程中参考csharp-hessian的序列化实现方式,支持跨平台。
四、如何使用Rpc
1、服务端:
a、参考NetCoreRpc.Application项目,先定义好IStudentApplication以及他的实现类StudentApplication
b、参考NetCoreRpc.ServerTest项目中Program,先绑定好依赖注入信息,如果要使用zk,则加上.UseZK();扩展方法,不然不采用ZK的服务发现
private static IServiceProvider BuildDi()
{
IServiceCollection services = new ServiceCollection(); services.AddSingleton<ILoggerFactory, LoggerFactory>();
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
services.AddSingleton<IStudentApplication, StudentApplication>();
var str = Configuration.GetValue<string>("MongoDB:Str");
var dbName = Configuration.GetValue<string>("MongoDB:DatabaseName");
services.UseRpc()
.UseMongoDBMonitor(() =>
{ return new MonogoDbConfig(str, dbName);
});//.UseZK();
var serviceProvider = services.BuildServiceProvider(); var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>(); loggerFactory.AddNLog(new NLogProviderOptions { CaptureMessageTemplates = true, CaptureMessageProperties = true });
loggerFactory.ConfigureNLog("NLog.config"); return serviceProvider;
}
绑定依赖注入信息
c、配置文件信息,配置ZK和MongoDb链接配置信息
{
"NetCoreRpc": {
"Zookeeper": {
"Connection": "192.168.100.34:2181",
"ParentName": "/NetCoreRpc/ClientTest"
}
},
"MongoDB": {
"Str": "mongodb://root:root@192.168.100.125:27017",
"DatabaseName": "Rpc_Monitor"
}
}
d、开启监听
private static void Main(string[] args)
{
Console.WriteLine("请输入监听端口:");
var strPort = Console.ReadLine();
var builder = new ConfigurationBuilder()
.SetBasePath(Path.Combine(AppContext.BaseDirectory)).AddJsonFile("NetCoreRpc.json", optional: true);
Configuration = builder.Build();
var servicesProvider = BuildDi();
DependencyManage.SetServiceProvider(servicesProvider, Configuration);
NRpcServer nrpcServer = new NRpcServer(int.Parse(strPort));
nrpcServer.Start("NetCoreRpc.Application");
Console.WriteLine("Welcome to use NetCoreRpc!");
Console.WriteLine("Input exit to exit");
var str = Console.ReadLine();
while (!string.Equals(str, "exit", StringComparison.OrdinalIgnoreCase))
{
str = Console.ReadLine();
}
nrpcServer.ShutDown();
}
开启监听
2、客户端如何调用
a、参考NetCoreRpc.ClientTest项目先配置一些基础的依赖信息
private static IServiceProvider BuildDi()
{
IServiceCollection services = new ServiceCollection();
services.AddOptions();
services.Configure<RpcConfig>(Configuration.GetSection("NetCoreRpc"));
services.AddSingleton<ILoggerFactory, LoggerFactory>();
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
services.UseRpc().UseMongoDBMonitor(() =>
{
var str = Configuration.GetValue<string>("MongoDB:Str");
var dbName = Configuration.GetValue<string>("MongoDB:DatabaseName");
return new MonogoDbConfig(str, dbName);
});//.UseZK();
var serviceProvider = services.BuildServiceProvider(); var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>(); //configure NLog
loggerFactory.AddNLog(new NLogProviderOptions { CaptureMessageTemplates = true, CaptureMessageProperties = true });
loggerFactory.ConfigureNLog("NLog.config"); return serviceProvider;
}
配置依赖
b、配置文件内容
{
"NetCoreRpc": {
"RequestTimeouMillis": ,
"Default": "192.168.129.117:12345",
//"Group": [
// {
// "NameSpace": "",
// "Address": "127.0.0.1:12345"
// }
//],
"Zookeeper": {
"Connection": "192.168.100.34:2181",
"ParentName": "/NetCoreRpc/ClientTest"
}
},
"MongoDB": {
"Str": "mongodb://root:root@192.168.100.125:27017",
"DatabaseName": "Rpc_Monitor"
}
}
配置文件
配置服务端地址,也可以根据类的名字来配置服务端地址,因为一个客户端在业务多的时候可能调用了多个服务端,所以提供了根据类型的名字来配置服务端地址
c、如何开始调用
首先接口类和Model类的命名控件必须要与服务端一致,比如例子中的IStudentApplication与TestModel这两个。
然后通过代理类来实例化接口类,然后调用对应的方法即可。
private static void Send()
{
var studentApplication = ProxyFactory.Create<IStudentApplication>();
Console.WriteLine(studentApplication.Age());
Console.WriteLine(studentApplication.IsYongPeople());
var runTask = studentApplication.RunAsync();
studentApplication.Say("Hello world");
studentApplication.Say(Encoding.UTF8.GetBytes("Hi!"));
Console.WriteLine(Encoding.UTF8.GetString(studentApplication.Say()));
var test = studentApplication.Test();
Console.WriteLine(test.ToString());
studentApplication.Sleep();
Console.WriteLine(runTask.Result);
}
客户端调用
framework版本与.netcore版本大同小异,具体的实际使用请参考下各个项目的Test文件。
五、调用案例结果

六、服务端监控

监控应用还没有完善好,后续会完善的,对了监控应用必须基于MongoDB。
七、项目开源地址
https://github.com/yjqGitHub/NetCoreRpc 欢迎大家来吐槽,提建议,如果有兴趣一起来完善的就更好了。
还有Nuget上的版本还暂未发布,原先发布的还不是最新代码
一个能够在Asp.Net和Asp.NetCore之间能够互相通讯的Rpc的更多相关文章
- ASP.NET和ASP.NETCore多环境配置对比
前言 多环境配置应该都很熟悉了,最为常见的便是Debug和Release,例如下图是新建的一个asp.net项目,配置文件展开共有三个文件组成 据我所知,大多公司从来没编辑过Web.Debug.con ...
- 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(4)
chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...
- 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(3)
chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...
- 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(2)
chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...
- 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(1)
chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...
- ASP.NET路由[ASP.NET Routing]
ASP.NET路由[ASP.NET Routing] ASP.NET路由允许你在使用URL时不必匹配到网站中具体的文件,因为这个URL不必匹配到一个文件,你使用了描述用户行为且更容易被用户理解的URL ...
- .NET、C#和ASP.NET,ASP.NET MVC 四者之间的区别
经常,会有一些人搞不清楚.NET和c#和ASP.NET这三者之间的关系,她们都是什么呢?他们之间有什么关系呢?总结一下 首先:什么是.NET? .NET是微软公司下的一个开发平台,.NET核心就是.N ...
- [ASP.NET MVC] ASP.NET Identity登入技术应用
[ASP.NET MVC] ASP.NET Identity登入技术应用 情景 ASP.NET Identity是微软所贡献的开源项目,用来提供ASP.NET的验证.授权等等机制.在ASP.NET I ...
- [ASP.NET MVC] ASP.NET Identity登入技术剖析
[ASP.NET MVC] ASP.NET Identity登入技术剖析 前言 ASP.NET Identity是微软所贡献的开源项目,用来提供ASP.NET的验证.授权等等机制.本篇文章介绍ASP. ...
随机推荐
- Android官方技术文档翻译——开发工具的构建概述
本文译自Android官方技术文档<Build Overview>,原文地址:http://tools.android.com/build. 因为<Android Lint Chec ...
- Java-ServletContextEvent-ServletContextAttributeEvent
//这是一个事件类用来通知一个web 应用的servlet 上下文的改变 public class ServletContextEvent extends java.util.EventObject ...
- Linux文件系统构成(第二版)
Linux文件系统构成 /boot目录: 内核文件.系统自举程序文件保存位置,存放了系统当前的内核[一般128M即可] 如:引导文件grub的配置文件等 /etc目录: 系统常用的配置文件,所以备份系 ...
- 【Android 应用开发】BluetoothAdapter解析
这篇文章将会详细解析BluetoothAdapter的详细api, 包括隐藏方法, 每个常量含义. 一 BluetoothAdapter简介 1.继承关系 该类仅继承了Object类; 2.该类作用 ...
- Linux进程通信学习总结
http://blog.csdn.net/xiaoweibeibei/article/details/6552498 SYSV子系统的相关概念 引用标识符:引用标识符是一个整数,表示每一个SYSV ...
- HFile
HFile存储格式 HBase中的所有数据文件都存储在Hadoop HDFS文件系统上,主要包括两种文件类型: 1. HFile, HBase中KeyValue数据的存储格式,HFile是Hadoop ...
- Salesforce Lightning开发学习(一)Hello World开发实践
一:什么是Lightning Component framework Lightning Component framework 简称Lightning,是Salesforce封装的一个前端框架,开发 ...
- 交换机设置IP
二成交换机所有端口在默认情况下都是属于vlan1的 代表整个交换机 你只需要设置vlan1的ip地址就行了 进入交换机配置界面后 命令如下:enableconfigure terminalinterf ...
- php coding中的一些小问题
最近在SAE上写微博应用,碰到一些小问题,记下来,以供参考: 1.出错提示: Fatal error: Can't use function return value in write context ...
- 畅通工程-HZNU寒假集训
畅通工程 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只 ...