使用NBear.MQ分布式服务消息队列模块开发分布式系统

时间:2022-04-18 09:29:18

NBear.MQ是NBearFramework中新增的分布式消息队列模块,作为NBear Framework的新成员,NBear.MQ秉承NBear一贯的易于使用和零配置需要的特点,大大改善开发基于消息队列的分布式系统的效率。本文通过介绍一个基于NBear.MQ的Sample - TestServiceMQ,演示基于NBear.MQ开发分布式系统的基本方法。

下载

从SF.NET下载NBear_v1.8.0(包括全部框架及示例源码)
如果你只想先体验一下已编译的示例程序,您也可以从这里下TestServiceMQ_bin.zip 
(请按如下顺序执行bin中的代码:TestRemotingServer.exe, TestServiceHost.exe,TestClientApp.exe,ServiceHost和Client可以是多个,server将自动随机分配调用service的请求到各个service host进行处理)

注:示例程序会使用本机的8000端口,如果本机8000端口已被占用或被禁用,请修改代码以使用其它端口代替或先启用8000端口。

解析

1、TestRemotingServer

首先是我们的Server,对于Server,如果您使用NBear.MQ内置的MemoryServiceMQ,则几乎不需要编码,只需要运行并发布server实例为remoting service。

 1 使用NBear.MQ分布式服务消息队列模块开发分布式系统     class  Program
 2 使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统     {
 3使用NBear.MQ分布式服务消息队列模块开发分布式系统        static void Main(string[] args)
 4使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统        {
 5使用NBear.MQ分布式服务消息队列模块开发分布式系统            MemoryServiceMQ mq = new MemoryServiceMQ();
 6使用NBear.MQ分布式服务消息队列模块开发分布式系统            mq.OnLog = new LogHandler(Console.WriteLine);
 7使用NBear.MQ分布式服务消息队列模块开发分布式系统            RemotingServiceHelper rh =
 8使用NBear.MQ分布式服务消息队列模块开发分布式系统                new RemotingServiceHelper(RemotingChannelType.TCP, "127.0.0.1"8000new LogHandler(Console.WriteLine));
 9使用NBear.MQ分布式服务消息队列模块开发分布式系统            rh.PublishServiceInstance("MMQ"typeof(IServiceMQ), mq, System.Runtime.Remoting.WellKnownObjectMode.Singleton);
10使用NBear.MQ分布式服务消息队列模块开发分布式系统
11使用NBear.MQ分布式服务消息队列模块开发分布式系统            while (Console.ReadLine() != "q")
12使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统            {
13使用NBear.MQ分布式服务消息队列模块开发分布式系统            }

14使用NBear.MQ分布式服务消息队列模块开发分布式系统        }

15使用NBear.MQ分布式服务消息队列模块开发分布式系统    }

注意,关键是第8-9行这里,我们调用RemotingServiceHelper类发布MemoryServiceMQ的实例mq到tcp://127.0.0.1:8000/MMQ。

如果你不希望使用MemoryServiceMQ,而希望使用基于其它MQ如MSMQ或ActiveMQ系统的MQ控制,您可以自己实现IServiceMQ接口,用来代替这里的mq。

2、TestServiceHost

Service host顾名思义就是服务的提供者,本示例的TestServiceHost定义了两个service,MathService和HelloWorldService,如下:

 1 使用NBear.MQ分布式服务消息队列模块开发分布式系统     public   class  MathService : BaseAutoService
 2 使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统     {
 3使用NBear.MQ分布式服务消息队列模块开发分布式系统        public MathService(IServiceMQ mq)
 4使用NBear.MQ分布式服务消息队列模块开发分布式系统            : base("demo.math", mq)
 5使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统        {
 6使用NBear.MQ分布式服务消息队列模块开发分布式系统        }

 7使用NBear.MQ分布式服务消息队列模块开发分布式系统
 8使用NBear.MQ分布式服务消息队列模块开发分布式系统        private int getResult(char op, int x, int y)
 9使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统        {
10使用NBear.MQ分布式服务消息队列模块开发分布式系统            int rt = 0;
11使用NBear.MQ分布式服务消息队列模块开发分布式系统            switch (op)
12使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统            {
13使用NBear.MQ分布式服务消息队列模块开发分布式系统                case '+':
14使用NBear.MQ分布式服务消息队列模块开发分布式系统                    rt = x + y;
15使用NBear.MQ分布式服务消息队列模块开发分布式系统                    break;
16使用NBear.MQ分布式服务消息队列模块开发分布式系统                case '-':
17使用NBear.MQ分布式服务消息队列模块开发分布式系统                    rt = x - y;
18使用NBear.MQ分布式服务消息队列模块开发分布式系统                    break;
19使用NBear.MQ分布式服务消息队列模块开发分布式系统                case '*':
20使用NBear.MQ分布式服务消息队列模块开发分布式系统                    rt = x * y;
21使用NBear.MQ分布式服务消息队列模块开发分布式系统                    break;
22使用NBear.MQ分布式服务消息队列模块开发分布式系统                case '/':
23使用NBear.MQ分布式服务消息队列模块开发分布式系统                    rt = x / y;
24使用NBear.MQ分布式服务消息队列模块开发分布式系统                    break;
25使用NBear.MQ分布式服务消息队列模块开发分布式系统
26使用NBear.MQ分布式服务消息队列模块开发分布式系统            }

27使用NBear.MQ分布式服务消息队列模块开发分布式系统            return rt;
28使用NBear.MQ分布式服务消息队列模块开发分布式系统        }

29使用NBear.MQ分布式服务消息队列模块开发分布式系统
30使用NBear.MQ分布式服务消息队列模块开发分布式系统        protected override ResponseMessage Run(RequestMessage msg)
31使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统        {
32使用NBear.MQ分布式服务消息队列模块开发分布式系统            Parameter[] parms = msg.Parameters;
33使用NBear.MQ分布式服务消息队列模块开发分布式系统            int rt = getResult(parms[0].Value.ToString()[0], int.Parse(parms[1].Value.ToString()), int.Parse(parms[2].Value.ToString()));
34使用NBear.MQ分布式服务消息队列模块开发分布式系统            ResponseMessage retMsg = new ResponseMessage();
35使用NBear.MQ分布式服务消息队列模块开发分布式系统            retMsg.ServiceName = msg.ServiceName;
36使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统            retMsg.Parameters = new Parameter[] new Parameter("Result", rt) };
37使用NBear.MQ分布式服务消息队列模块开发分布式系统            retMsg.MessageId = Guid.NewGuid();
38使用NBear.MQ分布式服务消息队列模块开发分布式系统            retMsg.TransactionId = msg.TransactionId;
39使用NBear.MQ分布式服务消息队列模块开发分布式系统            retMsg.RequestHeader = msg.Header;
40使用NBear.MQ分布式服务消息队列模块开发分布式系统            retMsg.Timestamp = DateTime.Now;
41使用NBear.MQ分布式服务消息队列模块开发分布式系统            retMsg.Expiration = DateTime.Now.AddDays(1);
42使用NBear.MQ分布式服务消息队列模块开发分布式系统
43使用NBear.MQ分布式服务消息队列模块开发分布式系统            return retMsg;
44使用NBear.MQ分布式服务消息队列模块开发分布式系统        }

45使用NBear.MQ分布式服务消息队列模块开发分布式系统    }

46 使用NBear.MQ分布式服务消息队列模块开发分布式系统
47 使用NBear.MQ分布式服务消息队列模块开发分布式系统     public   class  HelloWorldService : BaseAutoService
48 使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统     {
49使用NBear.MQ分布式服务消息队列模块开发分布式系统        public HelloWorldService(IServiceMQ mq) : base("demo.helloworld", mq)
50使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统        {
51使用NBear.MQ分布式服务消息队列模块开发分布式系统        }

52使用NBear.MQ分布式服务消息队列模块开发分布式系统
53使用NBear.MQ分布式服务消息队列模块开发分布式系统        protected override ResponseMessage Run(RequestMessage msg)
54使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统        {
55使用NBear.MQ分布式服务消息队列模块开发分布式系统            Parameter[] parms = msg.Parameters;
56使用NBear.MQ分布式服务消息队列模块开发分布式系统            ResponseMessage retMsg = new ResponseMessage();
57使用NBear.MQ分布式服务消息队列模块开发分布式系统            retMsg.ServiceName = msg.ServiceName;
58使用NBear.MQ分布式服务消息队列模块开发分布式系统            retMsg.MessageId = Guid.NewGuid();
59使用NBear.MQ分布式服务消息队列模块开发分布式系统            retMsg.TransactionId = msg.TransactionId;
60使用NBear.MQ分布式服务消息队列模块开发分布式系统            retMsg.RequestHeader = msg.Header;
61使用NBear.MQ分布式服务消息队列模块开发分布式系统            retMsg.Timestamp = DateTime.Now;
62使用NBear.MQ分布式服务消息队列模块开发分布式系统            retMsg.Expiration = DateTime.Now.AddDays(1);
63使用NBear.MQ分布式服务消息队列模块开发分布式系统
64使用NBear.MQ分布式服务消息队列模块开发分布式系统            retMsg.Text = "hello world";
65使用NBear.MQ分布式服务消息队列模块开发分布式系统            retMsg.Bytes = System.Text.UTF8Encoding.UTF8.GetBytes(retMsg.Text);
66使用NBear.MQ分布式服务消息队列模块开发分布式系统            retMsg.Data = new System.Data.DataSet("hello world data");
67使用NBear.MQ分布式服务消息队列模块开发分布式系统
68使用NBear.MQ分布式服务消息队列模块开发分布式系统            return retMsg;
69使用NBear.MQ分布式服务消息队列模块开发分布式系统        }

70使用NBear.MQ分布式服务消息队列模块开发分布式系统    }

大家可以看到,这里的service都是从BaseAutoService继承的,您也可以实现IService或继承BaseService。一个可以被NBear.MQ使用的Service基本上做的事情就是接受一个RequestMessage类型的输入参数,返回一个ResponseMessage类型的返回结果。

RequestMessage和ResponseMessage都从Message类型继承,除了包含请求和返回相关的一组参数(.net基本数据类型),每个Message包含Text、Bytes和Data属性,分别允许存放和传递string,byte[]和Dataset类型的数据。可见Message实际是一个比较通用的DTO。

下面,我们要将示例service注册到server,这个过程可以非常方便的通过SimpleServiceContainer来实现:

 1 使用NBear.MQ分布式服务消息队列模块开发分布式系统     class  Program
 2 使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统     {
 3使用NBear.MQ分布式服务消息队列模块开发分布式系统        static void Main(string[] args)
 4使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统        {
 5使用NBear.MQ分布式服务消息队列模块开发分布式系统            IServiceMQ mq = new RemotingClientHelper(RemotingChannelType.TCP, "127.0.0.1"80000new LogHandler(Console.WriteLine)).GetClientInstance<IServiceMQ>("MMQ");
 6使用NBear.MQ分布式服务消息队列模块开发分布式系统            IServiceContainer container = new SimpleServiceContainer(mq);
 7使用NBear.MQ分布式服务消息队列模块开发分布式系统
 8使用NBear.MQ分布式服务消息队列模块开发分布式系统            container.RegisterComponent("math host 1"typeof(MathService));
 9使用NBear.MQ分布式服务消息队列模块开发分布式系统            container.RegisterComponent("math host 2"typeof(MathService));
10使用NBear.MQ分布式服务消息队列模块开发分布式系统            container.RegisterComponent("helloworld 1"typeof(HelloWorldService));
11使用NBear.MQ分布式服务消息队列模块开发分布式系统
12使用NBear.MQ分布式服务消息队列模块开发分布式系统            while (Console.ReadLine() != "q")
13使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统            {
14使用NBear.MQ分布式服务消息队列模块开发分布式系统            }

15使用NBear.MQ分布式服务消息队列模块开发分布式系统        }

16使用NBear.MQ分布式服务消息队列模块开发分布式系统    }

您可以看到,我们首先要通过RemotingClientHelper类获得我们的server发布出来的mq实例。然后,创建一个SimpleServiceContainer实例,并将我们的示例service添加到container,就这么简单。SimpleSeviceContainer会自动为我们注册和绑定service和mq,您也可以注册多个相同和不同类型的service到container。

3、TestClientApp

Client是一个WinForm程序,自然就是调用Service了。代码如下:

  1 使用NBear.MQ分布式服务消息队列模块开发分布式系统using  System;
  2 使用NBear.MQ分布式服务消息队列模块开发分布式系统 using  System.Collections.Generic;
  3 使用NBear.MQ分布式服务消息队列模块开发分布式系统 using  System.ComponentModel;
  4 使用NBear.MQ分布式服务消息队列模块开发分布式系统 using  System.Data;
  5 使用NBear.MQ分布式服务消息队列模块开发分布式系统 using  System.Drawing;
  6 使用NBear.MQ分布式服务消息队列模块开发分布式系统 using  System.Text;
  7 使用NBear.MQ分布式服务消息队列模块开发分布式系统 using  System.Windows.Forms;
  8 使用NBear.MQ分布式服务消息队列模块开发分布式系统
  9 使用NBear.MQ分布式服务消息队列模块开发分布式系统 using  NBear.MQ.ServiceMQ;
 10 使用NBear.MQ分布式服务消息队列模块开发分布式系统 using  NBear.MQ;
 11 使用NBear.MQ分布式服务消息队列模块开发分布式系统 using  NBear.Common;
 12 使用NBear.MQ分布式服务消息队列模块开发分布式系统 using  NBear.Common.Remoting;
 13 使用NBear.MQ分布式服务消息队列模块开发分布式系统
 14 使用NBear.MQ分布式服务消息队列模块开发分布式系统 namespace  TestClientApp
 15 使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统 {
 16使用NBear.MQ分布式服务消息队列模块开发分布式系统    public partial class Form1 : Form
 17使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统    {
 18使用NBear.MQ分布式服务消息队列模块开发分布式系统        public Form1()
 19使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统        {
 20使用NBear.MQ分布式服务消息队列模块开发分布式系统            InitializeComponent();
 21使用NBear.MQ分布式服务消息队列模块开发分布式系统        }

 22使用NBear.MQ分布式服务消息队列模块开发分布式系统
 23使用NBear.MQ分布式服务消息队列模块开发分布式系统        private void Form1_Load(object sender, EventArgs e)
 24使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统        {
 25使用NBear.MQ分布式服务消息队列模块开发分布式系统            comboOP.SelectedIndex = 0;
 26使用NBear.MQ分布式服务消息队列模块开发分布式系统
 27使用NBear.MQ分布式服务消息队列模块开发分布式系统            rh = new RemotingClientHelper(RemotingChannelType.TCP, "127.0.0.1"80000new LogHandler(Console.WriteLine));
 28使用NBear.MQ分布式服务消息队列模块开发分布式系统            mq = rh.GetClientInstance<IServiceMQ>("MMQ");
 29使用NBear.MQ分布式服务消息队列模块开发分布式系统            mq.OnLog = new LogHandler(Console.WriteLine);
 30使用NBear.MQ分布式服务消息队列模块开发分布式系统            container = new SimpleServiceContainer(mq);
 31使用NBear.MQ分布式服务消息队列模块开发分布式系统        }

 32使用NBear.MQ分布式服务消息队列模块开发分布式系统
 33使用NBear.MQ分布式服务消息队列模块开发分布式系统        private void txtX_TextChanged(object sender, EventArgs e)
 34使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统        {
 35使用NBear.MQ分布式服务消息队列模块开发分布式系统            txtResult.Text = string.Empty;
 36使用NBear.MQ分布式服务消息队列模块开发分布式系统        }

 37使用NBear.MQ分布式服务消息队列模块开发分布式系统
 38使用NBear.MQ分布式服务消息队列模块开发分布式系统        private void comboOP_SelectedIndexChanged(object sender, EventArgs e)
 39使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统        {
 40使用NBear.MQ分布式服务消息队列模块开发分布式系统            txtResult.Text = string.Empty;
 41使用NBear.MQ分布式服务消息队列模块开发分布式系统        }

 42使用NBear.MQ分布式服务消息队列模块开发分布式系统
 43使用NBear.MQ分布式服务消息队列模块开发分布式系统        private void txtY_TextChanged(object sender, EventArgs e)
 44使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统        {
 45使用NBear.MQ分布式服务消息队列模块开发分布式系统            txtResult.Text = string.Empty;
 46使用NBear.MQ分布式服务消息队列模块开发分布式系统        }

 47使用NBear.MQ分布式服务消息队列模块开发分布式系统
 48使用NBear.MQ分布式服务消息队列模块开发分布式系统        RemotingClientHelper rh = null;
 49使用NBear.MQ分布式服务消息队列模块开发分布式系统        IServiceMQ mq = null;
 50使用NBear.MQ分布式服务消息队列模块开发分布式系统        IServiceContainer container = null;
 51使用NBear.MQ分布式服务消息队列模块开发分布式系统
 52使用NBear.MQ分布式服务消息队列模块开发分布式系统        private void btnCompute_Click(object sender, EventArgs e)
 53使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统        {
 54使用NBear.MQ分布式服务消息队列模块开发分布式系统            try
 55使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统            {
 56使用NBear.MQ分布式服务消息队列模块开发分布式系统                int.Parse(txtX.Text);
 57使用NBear.MQ分布式服务消息队列模块开发分布式系统                if (comboOP.SelectedIndex == 3)
 58使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统                {
 59使用NBear.MQ分布式服务消息队列模块开发分布式系统                    if (int.Parse(txtY.Text) != 0)
 60使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统                    {
 61使用NBear.MQ分布式服务消息队列模块开发分布式系统                    }

 62使用NBear.MQ分布式服务消息队列模块开发分布式系统                }

 63使用NBear.MQ分布式服务消息队列模块开发分布式系统                else
 64使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统                {
 65使用NBear.MQ分布式服务消息队列模块开发分布式系统                    int.Parse(txtY.Text);
 66使用NBear.MQ分布式服务消息队列模块开发分布式系统                }

 67使用NBear.MQ分布式服务消息队列模块开发分布式系统            }

 68使用NBear.MQ分布式服务消息队列模块开发分布式系统            catch
 69使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统            {
 70使用NBear.MQ分布式服务消息队列模块开发分布式系统                MessageBox.Show("x, y must be number, and y must not be 0 when OP is '/'!");
 71使用NBear.MQ分布式服务消息队列模块开发分布式系统                return;
 72使用NBear.MQ分布式服务消息队列模块开发分布式系统            }

 73使用NBear.MQ分布式服务消息队列模块开发分布式系统
 74使用NBear.MQ分布式服务消息队列模块开发分布式系统            RequestMessage msg = new RequestMessage();
 75使用NBear.MQ分布式服务消息队列模块开发分布式系统            msg.Expiration = DateTime.Now.AddDays(1);
 76使用NBear.MQ分布式服务消息队列模块开发分布式系统            msg.MessageId = Guid.NewGuid();
 77使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统            msg.Parameters = new Parameter[] new Parameter("op", comboOP.Text), new Parameter("x"int.Parse(txtX.Text)), new Parameter("y"int.Parse(txtY.Text)) };
 78使用NBear.MQ分布式服务消息队列模块开发分布式系统            msg.ServiceName = "demo.math";
 79使用NBear.MQ分布式服务消息队列模块开发分布式系统            msg.Timestamp = DateTime.Now;
 80使用NBear.MQ分布式服务消息队列模块开发分布式系统            msg.TransactionId = Guid.NewGuid();
 81使用NBear.MQ分布式服务消息队列模块开发分布式系统
 82使用NBear.MQ分布式服务消息队列模块开发分布式系统            ResponseMessage retMsg = container.CallService(msg.ServiceName, msg);
 83使用NBear.MQ分布式服务消息队列模块开发分布式系统
 84使用NBear.MQ分布式服务消息队列模块开发分布式系统            if (retMsg != null)
 85使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统            {
 86使用NBear.MQ分布式服务消息队列模块开发分布式系统                txtResult.Text = retMsg.Parameters[0].Value.ToString();
 87使用NBear.MQ分布式服务消息队列模块开发分布式系统            }

 88使用NBear.MQ分布式服务消息队列模块开发分布式系统            else
 89使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统            {
 90使用NBear.MQ分布式服务消息队列模块开发分布式系统                MessageBox.Show("Call service failed!");
 91使用NBear.MQ分布式服务消息队列模块开发分布式系统            }

 92使用NBear.MQ分布式服务消息队列模块开发分布式系统        }

 93使用NBear.MQ分布式服务消息队列模块开发分布式系统
 94使用NBear.MQ分布式服务消息队列模块开发分布式系统        private void btnHelloWorld_Click(object sender, EventArgs e)
 95使用NBear.MQ分布式服务消息队列模块开发分布式系统使用NBear.MQ分布式服务消息队列模块开发分布式系统        {
 96使用NBear.MQ分布式服务消息队列模块开发分布式系统            RequestMessage msg = new RequestMessage();
 97使用NBear.MQ分布式服务消息队列模块开发分布式系统            msg.Expiration = DateTime.Now.AddDays(1);
 98使用NBear.MQ分布式服务消息队列模块开发分布式系统            msg.MessageId = Guid.NewGuid();
 99使用NBear.MQ分布式服务消息队列模块开发分布式系统            msg.ServiceName = "demo.helloworld";
100使用NBear.MQ分布式服务消息队列模块开发分布式系统            msg.Timestamp = DateTime.Now;
101使用NBear.MQ分布式服务消息队列模块开发分布式系统            msg.TransactionId = Guid.NewGuid();
102使用NBear.MQ分布式服务消息队列模块开发分布式系统
103使用NBear.MQ分布式服务消息队列模块开发分布式系统            msg.Text = "who r u?";
104使用NBear.MQ分布式服务消息队列模块开发分布式系统
105使用NBear.MQ分布式服务消息队列模块开发分布式系统            ResponseMessage retMsg = container.CallService(msg.ServiceName, msg);
106使用NBear.MQ分布式服务消息队列模块开发分布式系统
107使用NBear.MQ分布式服务消息队列模块开发分布式系统            MessageBox.Show(retMsg.Text);
108使用NBear.MQ分布式服务消息队列模块开发分布式系统        }

109使用NBear.MQ分布式服务消息队列模块开发分布式系统    }

110使用NBear.MQ分布式服务消息队列模块开发分布式系统}

Line 23-31  在Form Load是初始化container,这和service host是完全一样的。

调用service只需通过container.CallService方法,如Line 82 和 105。

问题

1、您可能会问,client的代码除了调用service和service host的代码几乎相同,那么是否可以在client中既使用service又提供service呢 ?当然可以,你也完全可以在client这里register service,当client调用一个service时,container会首先检查是否存在本地service,存在则调用本地,不存在则向server请求远程service。

2、本示例是在一台服务器上演示这个分布式构架,您也可以修改地址,并分别把server, service host和client部署到互相连接的多台server上。

运行

请按如下顺序执行bin中的代码:TestRemotingServer.exe, TestServiceHost.exe,TestClientApp.exe,ServiceHost和Client可以是多个,server将自动随机分配调用service的请求到各个service host进行处理。在运行过程中,请尝试多次点击client的按钮,并观察,server和service host的日志,看是不是负载均衡。您也可以尝试在运行过程中关闭某些service host或client,或者再新增一些,注意server会自动维护service host和client的绑定和回调。

致谢

NBear.MQ很多地方参考了 alex兄的QPG分布式构架,并得到了alex兄的许多指点,在此表示最高的谢意!