一个能够在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上的版本还暂未发布,原先发布的还不是最新代码

作者:yjq
欢迎任何形式的转载,但请务必注明出处。
.netcore相关功能需要定制的可以找我。有丰富的并发处理,性能优化经验。单点登录,限流,熔断,读写分离等功能均可定制。也可以帮忙系统优化处理,系统诊断,请联系博主(备注添加原因)。微信:yjq425527169 QQ:425527169
本篇文章如有些许帮助请点击推荐让更多需要帮助的人可以看到,请支持原创,请大方打赏(右边点击打赏)

posted @   yjq_net  阅读(2410)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示