一、特性
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": 10000, "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(15)); var runTask = studentApplication.RunAsync(111); 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上的版本還暫未發布,原先發布的還不是最新代碼