一、特性

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的更多相关文章

  1. ASP.NET和ASP.NETCore多环境配置对比

    前言 多环境配置应该都很熟悉了,最为常见的便是Debug和Release,例如下图是新建的一个asp.net项目,配置文件展开共有三个文件组成 据我所知,大多公司从来没编辑过Web.Debug.con ...

  2. 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(4)

    chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...

  3. 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(3)

    chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...

  4. 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(2)

    chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...

  5. 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(1)

    chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...

  6. ASP.NET路由[ASP.NET Routing]

    ASP.NET路由[ASP.NET Routing] ASP.NET路由允许你在使用URL时不必匹配到网站中具体的文件,因为这个URL不必匹配到一个文件,你使用了描述用户行为且更容易被用户理解的URL ...

  7. .NET、C#和ASP.NET,ASP.NET MVC 四者之间的区别

    经常,会有一些人搞不清楚.NET和c#和ASP.NET这三者之间的关系,她们都是什么呢?他们之间有什么关系呢?总结一下 首先:什么是.NET? .NET是微软公司下的一个开发平台,.NET核心就是.N ...

  8. [ASP.NET MVC] ASP.NET Identity登入技术应用

    [ASP.NET MVC] ASP.NET Identity登入技术应用 情景 ASP.NET Identity是微软所贡献的开源项目,用来提供ASP.NET的验证.授权等等机制.在ASP.NET I ...

  9. [ASP.NET MVC] ASP.NET Identity登入技术剖析

    [ASP.NET MVC] ASP.NET Identity登入技术剖析 前言 ASP.NET Identity是微软所贡献的开源项目,用来提供ASP.NET的验证.授权等等机制.本篇文章介绍ASP. ...

随机推荐

  1. How to Simulate the Price Order or Price Line Function using API QP_PREQ_PUB.PRICE_REQUEST Includes

    How to Simulate the Price Order or Price Line Function using API QP_PREQ_PUB.PRICE_REQUEST Includes ...

  2. 非阻塞IO模式原理

    与阻塞模式对应的另一种模式叫非阻塞IO模式,在整个通信过程中读和写操作不会阻塞,当前处理线程不存在阻塞情况.从A机器到B机器它的通信过程是:A机器一条线程将通道设置为写事件后往下执行,而另外一条线程遍 ...

  3. Java-HttpServlet

    /** * * Provides an abstract class to be subclassed to create * an HTTP servlet suitable for a Web s ...

  4. Media Player Classic - HC 源代码分析 7:详细信息选项卡(CPPageFileInfoDetails)

    ===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...

  5. saiku应用的调试

    ubuntu下解压saiku包后使用: 运行.sh命令(.bat是windows命令).运行时注意权限.可以先chmod a+x *.sh 提示,catali?.sh出错. 这是tomcat的一个文件 ...

  6. SpriteBuilder中的CCB Node尺寸

    当你创建一个类型为Layer的CCB文件时,你将注意到它的默认尺寸大小为568x384. 568个点是4英寸iphone的宽度,同时iPad屏幕只有512个点宽,更准确的说--SpriteBuilde ...

  7. 苹果新的编程语言 Swift 语言进阶(十)--类的继承

    一.类的继承 类能够从其它类继承方法.属性以及其它特性,当一个类从另外的类继承时,继承的类称为子类,它继承的类称为超类.在Swift中,继承是类区别与其它类型(结构.枚举)的基础行为. 1.1 .类的 ...

  8. DB Query Analyzer 6.02 is released, 71 articles concerned have been published

    DB Query Analyzer is presented by Master Genfeng, Ma from Chinese Mainland. It has English version n ...

  9. 超高速前端开发工具——Emmet

    [由于 CSDN 不支持富文本编辑器写的文章迁移到 Markdown 编辑器中修改,已重发了一个重新排版的版本, 新版链接:http://blog.csdn.net/ys743276112/artic ...

  10. leetcode之旅(10)-Roman to Integer

    题目描述: Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range fr ...