一个能够在Asp.Net和Asp.NetCore之间能够互相通讯的Rpc
<h2>一、特性</h2><p>1、跨平台</p>
<p>2、提供负载均衡算法</p>
<p>3、支持ZK服务协调</p>
<p>4、提供了JSON、BinarySerializer、还有自定义的序列化方式</p>
<p>5、客户端提供Socket连接池,以便于快速交互,防止类似大文件上传时会阻塞</p>
<p>6、支持异步方法</p>
<p>7、支持.net与.netcore之间通信</p>
<p>8、支持采用MongoDb收集请求信息(采用双缓冲队列,极限的不影响传输速度)</p>
<p>9、提供请求日志监控后台(还未全部完善)</p>
<h2>二、项目结构</h2>
<p><img src="https://images2018.cnblogs.com/blog/712425/201805/712425-20180517135054003-952116695.png" alt=""></p>
<p>编译器采用vs2017.</p>
<p>NRpcItem 是Framework下的NRpc源代码。NetCoreRpcItem是.NetCore下的源代码。NRpcSerializer是自己写的一个序列化方法,速度和json序列化对比稍慢一点,但是速度可以接收。</p>
<p>值得注意的是NRpcItem 里面采用Autofac来作为IOC容器,服务端的代码都必须要基于Autofac来实现依赖注入。</p>
<p>NRpc.AdminManage是日志监控后台,目前只有.netCore版本。</p>
<h2>三、自定义序列化方法性能测试</h2>
<p><img src="https://images2018.cnblogs.com/blog/712425/201805/712425-20180517140106001-271326222.png" alt=""></p>
<p>虽然在执行速度上比json稍慢,但是支持对byte[]类型的序列化,而且客户端不需要任何的标记,方便使用。实现过程中参考csharp-hessian的序列化实现方式,支持跨平台。</p>
<h2>四、如何使用Rpc</h2>
<p>1、服务端:</p>
<p> a、参考NetCoreRpc.Application项目,先定义好IStudentApplication以及他的实现类StudentApplication</p>
<p> b、参考NetCoreRpc.ServerTest项目中Program,先绑定好依赖注入信息,如果要使用zk,则加上.UseZK();扩展方法,不然不采用ZK的服务发现</p>
<div class="cnblogs_code"><img id="code_img_closed_2c976867-a496-4159-98b6-ac7816f932aa" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_2c976867-a496-4159-98b6-ac7816f932aa" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_2c976867-a496-4159-98b6-ac7816f932aa" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> IServiceProvider BuildDi()
{
IServiceCollection services </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ServiceCollection();
services.AddSingleton</span><ILoggerFactory, LoggerFactory><span style="color: rgba(0, 0, 0, 1)">();
services.AddSingleton(</span><span style="color: rgba(0, 0, 255, 1)">typeof</span>(ILogger<>), <span style="color: rgba(0, 0, 255, 1)">typeof</span>(Logger<><span style="color: rgba(0, 0, 0, 1)">));
services.AddSingleton</span><IStudentApplication, StudentApplication><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 0, 255, 1)">var</span> str = Configuration.GetValue<<span style="color: rgba(0, 0, 255, 1)">string</span>>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">MongoDB:Str</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> dbName = Configuration.GetValue<<span style="color: rgba(0, 0, 255, 1)">string</span>>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">MongoDB:DatabaseName</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
services.UseRpc()
.UseMongoDBMonitor(() </span>=><span style="color: rgba(0, 0, 0, 1)">
{
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MonogoDbConfig(str, dbName);
});</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">.UseZK();</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> serviceProvider =<span style="color: rgba(0, 0, 0, 1)"> services.BuildServiceProvider();
</span><span style="color: rgba(0, 0, 255, 1)">var</span> loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory><span style="color: rgba(0, 0, 0, 1)">();
loggerFactory.AddNLog(</span><span style="color: rgba(0, 0, 255, 1)">new</span> NLogProviderOptions { CaptureMessageTemplates = <span style="color: rgba(0, 0, 255, 1)">true</span>, CaptureMessageProperties = <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)"> });
loggerFactory.ConfigureNLog(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">NLog.config</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> serviceProvider;
}</span></pre>
</div>
<span class="cnblogs_code_collapse">绑定依赖注入信息</span></div>
<p> c、配置文件信息,配置ZK和MongoDb链接配置信息</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">NetCoreRpc</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Zookeeper</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Connection</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.100.34:2181</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ParentName</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/NetCoreRpc/ClientTest</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}
},
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">MongoDB</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Str</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">mongodb://root:root@192.168.100.125:27017</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">DatabaseName</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Rpc_Monitor</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}
}</span></pre>
</div>
<p> d、开启监听</p>
<div class="cnblogs_code"><img id="code_img_closed_4fede46a-5767-4d69-b317-f968cf73aca4" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_4fede46a-5767-4d69-b317-f968cf73aca4" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_4fede46a-5767-4d69-b317-f968cf73aca4" class="cnblogs_code_hide">
<pre> <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Main(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">[] args)
{
Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">请输入监听端口:</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> strPort =<span style="color: rgba(0, 0, 0, 1)"> Console.ReadLine();
</span><span style="color: rgba(0, 0, 255, 1)">var</span> builder = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ConfigurationBuilder()
.SetBasePath(Path.Combine(AppContext.BaseDirectory)).AddJsonFile(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">NetCoreRpc.json</span><span style="color: rgba(128, 0, 0, 1)">"</span>, optional: <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
Configuration </span>=<span style="color: rgba(0, 0, 0, 1)"> builder.Build();
</span><span style="color: rgba(0, 0, 255, 1)">var</span> servicesProvider =<span style="color: rgba(0, 0, 0, 1)"> BuildDi();
DependencyManage.SetServiceProvider(servicesProvider, Configuration);
NRpcServer nrpcServer </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> NRpcServer(<span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)">.Parse(strPort));
nrpcServer.Start(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">NetCoreRpc.Application</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Welcome to use NetCoreRpc!</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Input exit to exit</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> str =<span style="color: rgba(0, 0, 0, 1)"> Console.ReadLine();
</span><span style="color: rgba(0, 0, 255, 1)">while</span> (!<span style="color: rgba(0, 0, 255, 1)">string</span>.Equals(str, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">exit</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, StringComparison.OrdinalIgnoreCase))
{
str </span>=<span style="color: rgba(0, 0, 0, 1)"> Console.ReadLine();
}
nrpcServer.ShutDown();
}</span></pre>
</div>
<span class="cnblogs_code_collapse">开启监听</span></div>
<p>2、客户端如何调用</p>
<p> a、参考NetCoreRpc.ClientTest项目先配置一些基础的依赖信息</p>
<div class="cnblogs_code"><img id="code_img_closed_718f7bae-6da6-4b3e-ba08-720a72e1403a" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_718f7bae-6da6-4b3e-ba08-720a72e1403a" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_718f7bae-6da6-4b3e-ba08-720a72e1403a" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> IServiceProvider BuildDi()
{
IServiceCollection services </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ServiceCollection();
services.AddOptions();
services.Configure</span><RpcConfig>(Configuration.GetSection(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">NetCoreRpc</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));
services.AddSingleton</span><ILoggerFactory, LoggerFactory><span style="color: rgba(0, 0, 0, 1)">();
services.AddSingleton(</span><span style="color: rgba(0, 0, 255, 1)">typeof</span>(ILogger<>), <span style="color: rgba(0, 0, 255, 1)">typeof</span>(Logger<><span style="color: rgba(0, 0, 0, 1)">));
services.UseRpc().UseMongoDBMonitor(() </span>=><span style="color: rgba(0, 0, 0, 1)">
{
</span><span style="color: rgba(0, 0, 255, 1)">var</span> str = Configuration.GetValue<<span style="color: rgba(0, 0, 255, 1)">string</span>>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">MongoDB:Str</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> dbName = Configuration.GetValue<<span style="color: rgba(0, 0, 255, 1)">string</span>>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">MongoDB:DatabaseName</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MonogoDbConfig(str, dbName);
});</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">.UseZK();</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> serviceProvider =<span style="color: rgba(0, 0, 0, 1)"> services.BuildServiceProvider();
</span><span style="color: rgba(0, 0, 255, 1)">var</span> loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">configure NLog</span>
loggerFactory.AddNLog(<span style="color: rgba(0, 0, 255, 1)">new</span> NLogProviderOptions { CaptureMessageTemplates = <span style="color: rgba(0, 0, 255, 1)">true</span>, CaptureMessageProperties = <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)"> });
loggerFactory.ConfigureNLog(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">NLog.config</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> serviceProvider;
}</span></pre>
</div>
<span class="cnblogs_code_collapse">配置依赖</span></div>
<p> b、配置文件内容</p>
<div class="cnblogs_code"><img id="code_img_closed_5593ff2e-9949-4cc0-8b22-cb91d8cbc54f" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_5593ff2e-9949-4cc0-8b22-cb91d8cbc54f" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_5593ff2e-9949-4cc0-8b22-cb91d8cbc54f" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">NetCoreRpc</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">RequestTimeouMillis</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 128, 1)">10000</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Default</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.129.117:12345</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">"Group": [
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> "NameSpace": "",
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> "Address": "127.0.0.1:12345"
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">],</span>
<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Zookeeper</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Connection</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.100.34:2181</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ParentName</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/NetCoreRpc/ClientTest</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}
},
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">MongoDB</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Str</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">mongodb://root:root@192.168.100.125:27017</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">DatabaseName</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Rpc_Monitor</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">配置文件</span></div>
<p>配置服务端地址,也可以根据类的名字来配置服务端地址,因为一个客户端在业务多的时候可能调用了多个服务端,所以提供了根据类型的名字来配置服务端地址</p>
<p> c、如何开始调用</p>
<p> 首先接口类和Model类的命名控件必须要与服务端一致,比如例子中的IStudentApplication与TestModel这两个。</p>
<p> 然后通过代理类来实例化接口类,然后调用对应的方法即可。</p>
<div class="cnblogs_code"><img id="code_img_closed_13d34a62-c17a-4ecc-8231-72f46a7a276b" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_13d34a62-c17a-4ecc-8231-72f46a7a276b" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_13d34a62-c17a-4ecc-8231-72f46a7a276b" class="cnblogs_code_hide">
<pre> <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> Send()
{
</span><span style="color: rgba(0, 0, 255, 1)">var</span> studentApplication = ProxyFactory.Create<IStudentApplication><span style="color: rgba(0, 0, 0, 1)">();
Console.WriteLine(studentApplication.Age());
Console.WriteLine(studentApplication.IsYongPeople(</span><span style="color: rgba(128, 0, 128, 1)">15</span><span style="color: rgba(0, 0, 0, 1)">));
</span><span style="color: rgba(0, 0, 255, 1)">var</span> runTask = studentApplication.RunAsync(<span style="color: rgba(128, 0, 128, 1)">111</span><span style="color: rgba(0, 0, 0, 1)">);
studentApplication.Say(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Hello world</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
studentApplication.Say(Encoding.UTF8.GetBytes(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Hi!</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));
Console.WriteLine(Encoding.UTF8.GetString(studentApplication.Say()));
</span><span style="color: rgba(0, 0, 255, 1)">var</span> test =<span style="color: rgba(0, 0, 0, 1)"> studentApplication.Test();
Console.WriteLine(test.ToString());
studentApplication.Sleep();
Console.WriteLine(runTask.Result);
}</span></pre>
</div>
<span class="cnblogs_code_collapse">客户端调用</span></div>
<p>framework版本与.netcore版本大同小异,具体的实际使用请参考下各个项目的Test文件。</p>
<h2>五、调用案例结果</h2>
<p><img src="https://images2018.cnblogs.com/blog/712425/201805/712425-20180517141559335-996621972.png" alt=""></p>
<h2>六、服务端监控</h2>
<p><img src="https://images2018.cnblogs.com/blog/712425/201805/712425-20180517141659702-987373046.png" alt=""></p>
<p> </p>
<p> 监控应用还没有完善好,后续会完善的,对了监控应用必须基于MongoDB。</p>
<h2>七、项目开源地址</h2>
<p>https://github.com/yjqGitHub/NetCoreRpc 欢迎大家来吐槽,提建议,如果有兴趣一起来完善的就更好了。</p>
<p>还有Nuget上的版本还暂未发布,原先发布的还不是最新代码</p><br><br>
来源:https://www.cnblogs.com/yjq-code/p/Rpc.html
頁:
[1]