一個能夠在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": 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上的版本還暫未發布,原先發布的還不是最新代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM