.Net C# 实现RPC分布式是否需要推到重建?

.Net C# 实现RPC分布式是否需要推到重建?

说到.Net的RPC,大家首先想到的是微软自己的WCF,然后就是谷歌的gRPC,然后然后视乎没有更好的选择。

更加麻烦的是这些解决方案,对原有项目几乎都要推到重建;

这个给大家推荐一个代码侵入性小,学习成本低的.Net的RPC;

实现思路和其他的RPC有本质的区别

1.利用接口实现AOP参数拦截;

2.使用.Net动态编译技术,在客户端生成接口实体代理类方法;

3.通过TCP建立连接,把参数和执行方法发送到服务器;[数据传输协议下文章专题介绍]

4.服务器在解析数据,映射实体类,委托运行;

5.运行结果转换成JSON,发送给客户端,有代理类返回实现;

 

说了技术实现原理,我们来看看怎么用吧;

Install-Package UcAsp.RPC
 

服务器配置文件

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <sectionGroup name="service">
      <section name="server" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null" />
    </sectionGroup>
  </configSections>
  <service>
    <server>
      <add key="port" value="9966" />  <!--服務器端口--->
      <add key="username" value="admin" />
      <add key="password" value="admin" />
    </server>
    <assmebly>
      <add key="Face" value="Face.dll" /><!--需要被外部應用的類庫--->
    </assmebly>
  </service>
</configuration>

标签assmebly表示,如果客官您是按照三层模式编写的代码,那么就是Bll的dll;

服务器端启动一个服务

代码如下

服務器端设置

ApplicationContext context = new ApplicationContext();
context.Start(AppDomain.CurrentDomain.BaseDirectory+ "Application.config", AppDomain.CurrentDomain.BaseDirectory);

客戶端配置

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <sectionGroup name="client">
      <section name="server" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null" />
    </sectionGroup>
  </configSections>
  <client>
    <server>
      <add key="ip" value="127.0.0.1:9966" /> <!---服務器地址--->
      <add key="mode" value="tcp" />
      <add key="pool" value="10" />
      <add key="username" value="admin" />
      <add key="password" value="admin" />
    </server>
    <relation>
      <add key="ISCS.WMS2.Model" value="ISCS.WMS2.Model.dll" /><!--関聯類庫-->
    </relation>
  </client>

</configuration>

标签relation 注意了是指bll返回类型会依赖的类;

客户端设置

客戶端創建對象

static ApplicationContext context= new ApplicationContext();
context.Start(AppDomain.CurrentDomain.BaseDirectory + "Application.config", AppDomain.CurrentDomain.BaseDirectory);

實例一個對象

IFace.ITest clazz = context.GetProxyObject();
int o = (int)i;
string x = clazz.R(ref o);

 

如有疑问欢迎到网站留言:http://www.ucasp.net

 

 丰富接口:

留言