/zbus-dotnet

zbus .NET client

Primary LanguageC#MIT LicenseMIT

            /\\\                                                                                            
            \/\\\                                                                                           
             \/\\\                                                                          /\\\            
 /\\\\\\\\\\\ \/\\\         /\\\    /\\\  /\\\\\\\\\\        /\\/\\\\\\       /\\\\\\\\   /\\\\\\\\\\\      
 \///////\\\/  \/\\\\\\\\\  \/\\\   \/\\\ \/\\\//////        \/\\\////\\\    /\\\/////\\\ \////\\\////      
       /\\\/    \/\\\////\\\ \/\\\   \/\\\ \/\\\\\\\\\\       \/\\\  \//\\\  /\\\\\\\\\\\     \/\\\         
      /\\\/      \/\\\  \/\\\ \/\\\   \/\\\ \////////\\\       \/\\\   \/\\\ \//\\///////      \/\\\ /\\    
     /\\\\\\\\\\\ \/\\\\\\\\\  \//\\\\\\\\\   /\\\\\\\\\\  /\\\ \/\\\   \/\\\  \//\\\\\\\\\\    \//\\\\\    
     \///////////  \/////////    \/////////   \//////////  \///  \///    \///    \//////////      \/////  

zbus-dotnet

zbus strives to make Message Queue and Remote Procedure Call fast, light-weighted and easy to build your own service-oriented architecture for many different platforms. Simply put, zbus = mq + rpc.

zbus carefully designed on its protocol and components to embrace KISS(Keep It Simple and Stupid) principle, but in all it delivers power and elasticity.

  • Working as MQ, compare it to RabbitMQ, ActiveMQ.
  • Working as RPC, compare it to many more.

Start zbus, please refer to https://github.com/rushmore/zbus

zbus's .NET client provides friendly and very easy API for .NET platform.

Getting started

zbus has a very few dependencies, simply install

PM> Install-Package Zbus

API Demo

Only demos the gist of API, more configurable usage calls for your further interest.

Produce message

using (MqClient client = new MqClient("localhost:15555"))
{   
    var data = new Message();
    data.Headers["cmd"] = "pub";
    data.Headers["mq"] = mq;
    data.Body = "Hello from C#";

    res = await client.InvokeAsync(data);
    Console.WriteLine(JsonKit.SerializeObject(res));
} 

Consume message

MqClient client = new MqClient("localhost:15555");

const string mq = "MyMQ";
const string channel = "MyChannel";
client.OnOpen += async (c) =>
{
    //Create MQ
    Message data = new Message();
    data.Headers["cmd"] = "create";
    data.Headers["mq"] =  mq;
    data.Headers["channel"] = channel;
        
    var res = await client.InvokeAsync(data);
    Console.WriteLine(JsonKit.SerializeObject(res));

    //Subscribe on MQ/Channel
    data = new Message();
    data.Headers["cmd"] = "sub";
    data.Headers["mq"] = mq;
    data.Headers["channel"] = channel;

    res = await client.InvokeAsync(data);
    Console.WriteLine(JsonKit.SerializeObject(res));
};

client.AddMqHandler(mq, channel, (msg) =>
{
    Console.WriteLine(JsonKit.SerializeObject(msg));
});

client.ConnectAsync().Wait();

RPC client

using (RpcClient rpc = new RpcClient("localhost:15555", "MyRpc"))
{ 
    string module = "";   
    //dynamic
    IService svc = rpc.CreateProxy<IService>(module);
    int c = svc.plus(1, 2);
    Console.WriteLine(c);

    string str = await svc.getString("hong"); //support remote await!
    Console.WriteLine(str);

    //Raw API
    int res = await rpc.InvokeAsync<int>("plus", new object[] { 1, 2 }, module: module);
    Console.WriteLine(JsonKit.SerializeObject(res)); 
} 

RPC service

class RpcServerExample
{
    
    public string echo(string msg)
    {
        return msg;
    }

    public string testEncoding()
    {
        return "中文";
    }

    public void noReturn()
    {

    }

    public int plus(int a, int b)
    {
        return a + b;
    }

    public void throwException()
    {
        throw new NotImplementedException();
    }

    [RequestMapping("/abc")]
    public Message home()
    {
        Message res = new Message();
        res.Status = 200;
        res.Headers["content-type"] = "text/html; charset=utf8";
        res.Body = "<h1>C# body</h1>";
        return res;
    }

    public Task<string> getString(string req)
    {
        return Task.Run(() =>
        {
            return "AsyncTask: " + req;
        });
    }

    static void Main(string[] args)
    {
        RpcProcessor p = new RpcProcessor();
        p.UrlPrefix = "";
        p.Mount("/example", new RpcServerExample());


        //RPC via MQ
        RpcServer server = new RpcServer(p);
        server.MqServerAddress = "localhost:15555";

        //server.AuthEnabled = true;
        //server.ApiKey = "2ba912a8-4a8d-49d2-1a22-198fd285cb06";
        //server.SecretKey = "461277322-943d-4b2f-b9b6-3f860d746ffd";

        server.Mq = "MyRpc"; 
        server.Start(); 
    } 
}