zmq封装

ZmqBindlib

zmq常用封装

使用方法

基本使用

1.简单请求回复

复制代码
 ZmqRequest request = new ZmqRequest();
            request.RemoteAddress = localaddes;
            request.PubClient = "A";
            int num = 0;
            while (true)
            {
                //   Thread.Sleep(1000);
                //string msg = request.Request("hi");
                Person p=  request.Request<Person,Person>(new Person { Name = "jin", Description = "请求", Id = num++, Title = "rr" });
                Console.WriteLine(p.Description+p.Name);
            }

    ZmqResponse rep = new ZmqResponse();
            rep.LocalAddress = localaddes;
            rep.Start();
            int num = 0;
            //rep.ByteReceived += (sender, e) =>
            //{
            //    Console.WriteLine(System.Text.Encoding.Default.GetString(e));
            //    rep.Response("word"+num++);
            //};
            rep.StringReceived += (sender, e) =>
            {
                Console.WriteLine(e);
                if (e == "hi")
                {
                    Thread.Sleep(1000);
                }
                rep.Response("word" + num++);
            };

2.异步下的请求回复,类似TCP,支持多请求

复制代码
  server =new EhoServer();
            server.RouterAddress = "tcp://127.0.0.1:66666";//服务地址,请求的远端地址
            //  server.ByteReceived += Server_ByteReceived;
          // server.StringReceived += Server_StringReceived1; 
            server.Start();

 private static void Server_StringReceived1(object? sender, RspSocket<string> e)
        {
            Console.WriteLine(e.Message);
            if (e.Message == "hi")
            {
              //  Thread.Sleep(4000);
                e.Response("jinyu");
                return;
            }
            e.Response("word");
        }

		 private static  void recvice()
        {
            while (true)
            {
                var ss = server.GetMsg<Person>();
                ss.Message.Description = "回复"+ss.Message.Id;
                ss.Response(ss.Message);
            }
        }

3.订阅发布

复制代码
	````
	  ZmqSubscriber sub = new ZmqSubscriber();
        sub.Address = new string[] { localaddes };
        sub.Subscribe("A");
       // sub.ByteReceived += Sub_ByteReceived;
        sub.StringReceived += Sub_StringReceived;
复制代码
复制代码
		  ZmqPublisher pub = new ZmqPublisher();
        pub.LocalAddress =localaddes;
       // pub.IsProxy = true; 是否使用中间代理
        int num = 0;
        while (true)
        {
           // Thread.Sleep(1000);
            pub.Publish("A", "ssss"+num++);
        }
复制代码
复制代码
		static void Proxy()
    {
	//中间代理
        ZmqDDSProxy.PubAddress = "tcp://127.0.0.1:7771";//注意,客户端订阅此地址
        ZmqDDSProxy.SubAddress = "tcp://127.0.0.1:7772";//客户端发布此地址
        ZmqDDSProxy.Start();
    }

	
## 中心高可用部署
1.推荐方式
  使用IP漂移:
  1. windows  
     使用DNS+VLS;Panguha软件
  2.Linux
     使用keppalive

2.使用封装
  该功能前提是可以使用广播,可以允许少量数据丢失;
  (1)请求返回模式
      中心:

      EhoServer eho = new EhoServer();
        eho.IsCluster = true;
        eho.DealerAddress = "inproc://server";
        eho.RouterAddress = "tcp://127.0.0.1:5550";

        eho.StringReceived += EhoServer_StringReceived;
        eho.Start();

    客户端:与单个一致

    (2)订阅发布

    中心:

  ZmqDDSProxy.PubAddress = "tcp://127.0.0.1:2222";
        ZmqDDSProxy.SubAddress = "tcp://127.0.0.1:4444";
        ZmqDDSProxy.IsCluster=true;
     ZmqDDSProxy.Start();


    发布端:

        ZmqPublisher pub = new ZmqPublisher();
        pub.Address = "tcp://127.0.0.1:5678";
        pub.IsProxy = true; //是否使用中间代理
        pub.IsDDS = true;//高可用启动
        int num = 0;
        while (true)
        {
            Thread.Sleep(1000);
            try
            {
                pub.Publish("A", "ssss" + num++);
            }catch(Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }

        }


            订阅端:

          ZmqSubscriber sub = new ZmqSubscriber();
        sub.Address = new string[] { "tcp://127.0.0.1:1234" };
        sub.IsDDS = true;//高可用启动
        sub.Subscribe("");
       // sub.ByteReceived += Sub_ByteReceived;
        sub.StringReceived += Sub_StringReceived;

            对于发布订阅,中心何发布订阅端都需要启动高可用,会刷新地址

            (3)负载均衡式订阅发布
             该模式是仿照kafka功能的;
             中心:

           ZmqDDSProxy.PubAddress = "tcp://127.0.0.1:2222";
        ZmqDDSProxy.SubAddress = "tcp://127.0.0.1:4444";
        ZmqDDSProxy.IsCluster = true;//高可用
        ZmqDDSProxy.StartProxy(); //注意方法,启动和另外发布订阅方法不同

            发布端:和前面一样

            订阅端:

       ZmqSubscriberGroup zmqSubscriber=new ZmqSubscriberGroup();
        zmqSubscriber.Address = "tcp://127.0.0.1:1234";
        zmqSubscriber.IsDDS= true;//高可用
       // zmqSubscriber.Indenty = "test";//订阅在不同分组
        zmqSubscriber.Subscribe("A");
        zmqSubscriber.StringReceived += ZmqSubscriber_StringReceived;

            (4)kafka封装

         KafkaPublisher kafkaPublisher = new KafkaPublisher();
            int num = 0;
            while (true)
            {
                Thread.Sleep(1000);
                kafkaPublisher.Push("A", "SSSSS"+num++);
            }
复制代码
复制代码
            KafkaSubscriber  kafkaSubscriber = new KafkaSubscriber();
            kafkaSubscriber.Subscriber("A");
            kafkaSubscriber.Consume(p =>
            {
                if(p==null)
                {
                    return;
                }
                Console.WriteLine(string.Format("Received message at {0}:{1}", p.Topic, p.Value));
            
            });


		说明
		1.接收数据一端,定义了2个事件一个方法,顺序是ByteReceived、StringReceived、GetMsg<T>()方法。一旦前一个实现,后面就无效。


项目地址:https://github.com/jinyuttt/ZmqBindlib.git
相关推荐
小羊没烦恼!6 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
神仙别闹6 天前
基于C#+MySQL实现(WinForm)个人聊天室软件
c#
伞伞悦读6 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
C语言小火车6 天前
C/C++ 为什么需要编译器?
开发语言·c++
霍霍的袁6 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
kybs19916 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
孙启超6 天前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust
此生决int6 天前
深入理解C++系列(20)——C++11(下)
开发语言·c++
CoderYanger6 天前
A.每日一题:835. 图像重叠
java·开发语言·程序人生·leetcode·面试·职场和发展·学习方法
伞伞悦读6 天前
【第37期】Python JSON 与配置详解:序列化、反序列化、嵌套结构和配置文件
开发语言·python·json