文档章节

跨平台开源通讯组件elastic communication

泥水佬
 泥水佬
发布于 2015/12/01 14:47
字数 1070
阅读 639
收藏 26

    elastic communication是基于c#开发支持.net和mono的通讯组件(简称EC),EC的主要目的简化mono和.net下的通讯开发难度,通过EC可以非常快速地开发基于mono和.net的通讯交互应用。EC抽取的基础的通讯协议默认支持protobuf,msgpack的数据对象进行通讯交互,开发者不可以根据自己的制要制订更多的序列化方式支持;EC不紧紧支持简单的对像传输,还提供了控制器,方法控制器和更方便的远程接口调用功能。

    以下是ES希望实现的最终目标

    

    借助于Xamarin实现不同移动端的实现,由于这一块个人工作原因还没细化实现,通过开源相关代码可以让感兴趣的人更好进一步去完成相关功能。

功能简介

    EC实现通讯功能是非常方便的事情,下面通讯简单的几种场景来介绍一下EC在通讯上的应用。

HelloWord

  • 服务端
    namespace HelloWord.Server
    {
        [Controller] public class Program
        { static void Main(string[] args)
            {
                ECServer.Open();
                System.Threading.Thread.Sleep(-1);
            } public string HelloWord(ISession session,Hello e)
            { return string.Format("hello {0} [say time:{1}]", e.Name, DateTime.Now);
            }
        }
    
        [MessageID(0x1)]
        [ProtoContract] public class Hello
        {
            [ProtoMember(1)] public string Name { get; set; }
        }
    }
  • 客户端
    private EC.ProtoSyncClient mClient = new ProtoSyncClient("127.0.0.1");
    mClient.Send<string>(new Hello { Name=textBox1.Text })

远程方法访问

  EC支持远程方法调用,如果用过wcf那对这功能感觉应该不会陌生,而EC也是通过接口的方式来定义远程调用行为;wcf同一方法重载需要重新定义名称,而ec则支持同一方法多个重载版本。为了满足更复杂的需要,EC的远程调用同样支持out和ref参数。

  • 接口定义
    namespace Remoting.Service
    { public interface IUserService
        {
            User Register(string name, string email);
        }
    }
  • 服务端
    [SOAService(typeof(Service.IUserService))] class Program : IUserService
        { static void Main(string[] args)
            { ECServer.Open();
                System.Threading.Thread.Sleep(-1);
            } public Service.User Register(string name, string email)
            {
                User user = new User();
                user.EMail = email;
                user.Name = name;
                user.CreateTime = DateTime.Now; return user;
            }
        }
  • 客户端
    public partial class Form1 : Form
        { public Form1()
            {
                InitializeComponent();
            } private ProtoClient mClient = new ProtoClient("192.168.7.111"); private IUserService UserService; private void Form1_Load(object sender, EventArgs e)
            {
                UserService = mClient.CreateInstance<IUserService>();
            } private void cmdRegister_Click(object sender, EventArgs e)
            {
                User user= UserService.Register(txtName.Text, txtEMail.Text);
                txtCreateTime.Text = user.CreateTime.ToString();
            }
        }

数据访问示例

   数据访问应该是最常见的一种应用场,以下是定义一个简单的数据查询示例。

  • 服务端
     [EC.Controller] public class Program
        { static void Main(string[] args)
            {
                DBContext.SetConnectionDriver<SqliteDriver>(DB.DB1);
                DBContext.SetConnectionString(DB.DB1, "Data Source=northwindEF.db;Pooling=true;FailIfMissing=false;");
                ECServer.Open();
                System.Threading.Thread.Sleep(-1);
            } public IList<Employee> OnEmployeeSearch(ISession session, EmployeeSearch e)
            { return new Expression().List<Models.Employees, Employee>();
            } public IList<Customer> OnCustomerSearch(ISession session, CustomerSearch e)
            { return new Expression().List<Models.Customers, Customer>();
            } public IList<Order> OnOrderSearch(ISession session, OrderSearch e)
            {
                Expression exp = new Expression(); if (e.CustomerID != null)
                    exp &= Models.Orders.customerID == e.CustomerID; if (e.EmployeeID > 0)
                    exp &= Models.Orders.employeeID == e.EmployeeID; return exp.List<Models.Orders, Order>();
            } public IList<OrderDetail> GetOrderDetail(ISession session, GetDetail e)
            {
                Expression exp = Models.OrderDetails.orderID == e.OrderID;
                JoinTable jt = Models.OrderDetails.productID.InnerJoin(Models.Products.productID);
                jt.Select("OrderDetails.*", Models.Products.productName.Name); return exp.List<OrderDetail>(jt);
            }
    
        }
  • 客户端
    private ProtoSyncClient mClient = new ProtoSyncClient("127.0.0.1"); private void FrmMain_Load(object sender, EventArgs e)
            {
                cbEmployees.Items.Add(new Employee()); foreach (Employee item in mClient.Send<IList<Employee>>(new EmployeeSearch()))
                {
                    cbEmployees.Items.Add(item);
                }
                cbCustomers.Items.Add(new Customer()); foreach (Customer item in mClient.Send<IList<Customer>>(new CustomerSearch()))
                {
                    cbCustomers.Items.Add(item);
                }
                
            } private void cmdSearch_Click(object sender, EventArgs e)
            {
                OrderSearch os = new OrderSearch(); if (cbCustomers.SelectedItem != null)
                    os.CustomerID = ((Customer)cbCustomers.SelectedItem).CustomerID; if (cbEmployees.SelectedItem != null)
                    os.EmployeeID = ((Employee)cbEmployees.SelectedItem).EmployeeID;
                gdOrder.DataSource = mClient.Send<IList<Order>>(os);
            } private void gdOrder_SelectionChanged(object sender, EventArgs e)
            { if (gdOrder.SelectedRows.Count > 0)
                {
                    Order order = (Order)gdOrder.SelectedRows[0].DataBoundItem;
                    GetDetail getdetail = new GetDetail();
                    getdetail.OrderID = order.OrderID;
                    gdDetail.DataSource = mClient.Send<IList<OrderDetail>>(getdetail);
                }
            }

AppModule

     AppModule类似于asp.net的httpModule,它可以在EC服务中载实始化的时候进行加载,通过AppModule可以实现消息处理,处理日志,全局信息定义等相关主要功能。

public class FilterModel : IAppModel
    { public string Name
        { get { return "Filter"; }
        } private System.Threading.Timer mTimer; public void Init(IApplication application)
        { //application.Filters.Add(new LoginFilter()); application.Disconnected += (o, e) => { "{0} disposed applicaion event".Log4Info(e.Session.Channel.EndPoint);

            };
            application.Connected += (o, e) => { "{0} connect applicaion event".Log4Info(e.ChannelConnectArgs.Channel.EndPoint);

            };
              application.SendCompleted += (o, e) => { "{0} send completed applicaion event".Log4Info(e.Session.Channel.EndPoint);
              };
             application.MethodProcess += (o, e) => { //application e.Application["Path"] = @"c:\"; //sexxion e.Session["folder"] = "aaa";
             };
            application.Error += (o, e) => { "{0} channel error {1}".Log4Error(e.Info.Channel.EndPoint, e.Info.Error.Message);
            };
            mTimer = new System.Threading.Timer(o => {
                application.Server.Send(new User { Name = Guid.NewGuid().ToString("N"),CreateTime = DateTime.Now }, application.Server.GetOnlines());
            }, null, 1000, 1000);

        } public string Command(string cmd)
        { throw new NotImplementedException();
        }
    }

Filter

    这个特性在EC上是提供比较有用的功能,通讯filter可以对调用方法加入权限,日志,拦载等逻辑功能。  

public class AdminFilter : FilterAttribute
    { public override void Execute(IMethodContext context)
        { "admin filter ->{0}".Log4Debug(context.Handler); base.Execute(context);
        }
    }
    [Controller] public class Controller
    {
        [SkipFilter(typeof(LoginFilter))]
        [ThreadPool] public User Regisetr(ISession session, User user)
        {
            user.CreateTime = DateTime.Now; "Register invoke[Name:{0} Email:{1}]".Log4Debug(user.Name, user.EMail); return user;
        }

        [AdminFilter] public IList<User> Search(ISession session, Query query)
        { "Search invoke".Log4Debug();
            List<User> users = new List<User>();
            users.Add(new User());
            users.Add(new User()); return users;
        }
    }

开源地址

  https://github.com/IKende/ec/

  https://github.com/IKende/ec/tree/master/Samples


© 著作权归作者所有

泥水佬

泥水佬

粉丝 77
博文 95
码字总数 65026
作品 7
广州
架构师
私信 提问
小白都会超详细--ELK日志管理平台搭建教程

目录 一、介绍 二、安装JDK 三、安装Elasticsearch 四、安装Logstash 五、安装Kibana 六、Kibana简单使用 系统环境:CentOS Linux release 7.4.1708 (Core) 当前问题状况 开发人员不能登录线...

渣渣辉
2018/07/15
0
0
Elastic 在年度用户大会 Elastic{ON} 2018 上发布众多新功能和技术预览

下载超过 2.25 亿次,Elastic 公开 X-Pack 源代码 旧金山 (Elastic{ON} 2018) – 2018 年 2 月 27 日 – Elastic,Elasticsearch 和 Elastic Stack背后的公司,今天宣布其产品累计下载次数达...

Medcl
2018/03/01
7
0
初探 ELK - 每天5分钟玩转 Docker 容器技术(89)

在开源的日志管理方案中,最出名的莫过于 ELK 了。ELK 是三个软件的合称:Elasticsearch、Logstash、Kibana。 Elasticsearch 一个近乎实时查询的全文搜索引擎。Elasticsearch 的设计目标就是...

CloudMAN
2017/11/03
491
0
基于ELK实时日志分析的最佳实践

在2018云栖大会深圳峰会大数据分析与可视化专场上,由阿里巴巴搜索引擎事业部开放搜索团队的吴迪带来了“基于ELK实时日志分析的最佳实践”的主题分享。介绍了传统的日志分析、ELK的概念和ELK...

smile小太阳
2018/05/06
0
0
安装Elasticsearch-Apm

概述 Elastic APM是一个基于Elastic Stack构建的应用程序性能监控系统。它允许您实时监控软件服务和应用程序,收集有关传入请求的响应时间,数据库查询,高速缓存调用,外部HTTP请求等的详细...

Linux_Anna
02/25
355
0

没有更多内容

加载失败,请刷新页面

加载更多

让《强化学习(第2版)》架起一座通往强化学习经典知识宝库的桥梁

上交大计算科学与工程系俞凯教授,5分钟口述讲解,带你快速认识了解年度重磅图书《强化学习(第二版)》! 在 AlphaGo战胜李世石之后,AlphaZero以其完全凭借自我学习超越人类在各种棋类游戏...

博文视点Bv
6分钟前
3
0
TLA7-EVM开发板的处理器、NOR FLASH、DDR3

TLA7-EVM开发板是一款由广州创龙基于Xilinx Artix-7系列FPGA自主研发的核心板+底板方式的开发板,可快速评估FPGA性能。核心板尺寸仅70mm*50mm,底板采用沉金无铅工艺的6层板设计,专业的PCB...

Tronlong创龙
15分钟前
3
0
UUID的变种-有序

为了解决UUID无序的问题,NHibernate在其主键生成方式中提供了Comb算法(combined guid/timestamp)。保留GUID的10个字节,用另6个字节表示GUID生成的时间(DateTime)。 /// <summary> //...

Canaan_
15分钟前
3
0
Netty学习(6)——通道间数据传输

1. FileChannel实现通道间的数据传输 在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel传输到另外一个channel。 transferFrom() FileChannel的transferF...

江左煤郎
19分钟前
3
0
AngularDOM操作

gtandsn
20分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部