.Net Core開源通信組件 SmartRoute(服務即集羣)

        SmartRoute是基於Dotnet Core設計的可運行在linux和windows下的服務通信組件,其設計理念是去中心化和零配置便可實現服務通信集羣。SmartRoute是經過消息訂閱的機制實現服務與服務之間的通信,它可讓廣播網段內全部服務器上的應用自動構建通信集羣; 而通信集羣徹底是SmartRoute自動構建並不須要進行任何配置或安裝中間服務。經過這種全新的通信開發方式可讓開發者更輕鬆和簡單地構建基於服務的集羣通信應用。node

SmartRoute的發展目標linux

智能集成服務通信交互git

不須要具有通信專業知識便可輕鬆構建github

零配置、零安裝引用組件便可用windows

可快速構建服務應用通信,消息分發,網關集羣和集羣負載應用服務器

 

原理

        SmartRoute基於UDP廣播的方式來發現網內相同集羣名稱的服務應用,固然應用是基於同一集羣名稱的狀況下,會發起TCP鏈接握手並進行驗證,當驗證經過後節點會創建的通信關係。在同一集羣裏的任意一個節點產生的訂閱都會同步到全部節點上。SmartRoute的網絡節點是基於網狀結構,並不須要中心服務維護,而這些特性都是自動化的開發人員徹底不須要了解。網絡

使用

        SmartRoute的使用並不會像傳統網絡程序那樣構建服務,而後構建Client鏈接到相應服務那樣複雜。在SmartRoute中不存在服務和客戶端這一說法,任何節點便是服務的同時也是客戶端;SmartRoute的消息是經過訂閱來處理,只要記住對方的名稱就能夠向對方發送消息,你並不須要關注對方是在那個節點或服務上。spa

構建訂閱

    SmartRoute默認會提供一個節點,主要是能夠快速地構建通信交互(若是怕和其餘集羣有衝突能夠在打開默認節點以前修改一下它的Cluster和TokenKey)。設計

public class Program
    {
        static long mCount;
        public static void Main(string[] args)
        {
            INode node = NodeFactory.Default;
            node.Loger.Type = LogType.ALL;
            node.AddLogHandler(new SmartRoute.ConsoleLogHandler(LogType.ALL));
            node.Open();
            EventSubscriber henry = node.Register<EventSubscriber>("henry");
            henry.Register<User>(OnUser);
            henry.Register<Employee>(OnEmployees);
            Console.Read();
        }
        private static void OnEmployees(Message msg, Employee emp)
        {
            System.Threading.Interlocked.Increment(ref mCount);
            msg.Reply(Employee.GetEmployee());
        }
        private static void OnUser(Message msg, User user)
        {
            System.Threading.Interlocked.Increment(ref mCount);
            msg.Reply(new User { Name = "henry" });
        }
    }

        以上代碼是註冊一個名稱爲Henry的訂閱,並向這個訂閱註冊兩個消息處理方法;henry接收到相關消息會自動地把消息路由到方法上,能夠經過調用Message.Reply便可以向發送者返回一個響應消息。路由

訂閱,發現和推送消息

        接下來就構建別一個訂閱,當發現henry這個訂閱後向它發送一個消息;

public class Program
    {
        static long mCount;
        public static void Main(string[] args)
        {
            INode node = NodeFactory.Default;
            node.Loger.Type = LogType.ALL;
            node.AddLogHandler(new SmartRoute.ConsoleLogHandler(LogType.ALL));
            node.Open();
            EventSubscriber ken = node.Register<EventSubscriber>("ken");
            ken.Register<User>(OnUser);
            ken.Register<Employee>(OnEmployees);
            node.SubscriberRegisted = (n, s) =>
            {
                if (s.Name == "henry")
                {
                    ken.Publish("henry", Employee.GetEmployee());
                }
            };

            while (true)
            {
                Console.WriteLine(mCount);
                System.Threading.Thread.Sleep(1000);
            }
            Console.Read();
        }
       
        private static void OnEmployees(Message msg, Employee emp)
        {
            System.Threading.Interlocked.Increment(ref mCount);
            msg.Reply(Employee.GetEmployee());
        }
        private static void OnUser(Message msg, User user)
        {
            System.Threading.Interlocked.Increment(ref mCount);
            msg.Reply(Employee.GetEmployee());
        }
    }

訂閱代碼都基於一致,一樣註冊一個ken訂閱並註冊相應消息的處理方法。

總結

經過SmartRoute實現的通信服務和傳統的有很大差異,使用起來會變得更簡單和透明。這種模式更像咱們使用的MQ方式,但SmartRoute的特別之處是不須要任何中間服務支持便可以進行交互,這樣可讓應用構建會更簡單靈活。不過現有SmartRoute的應用侷限性只適應用於內部網服務交互,訂閱方式也比較單一,後期也會加入一下多路訂閱功能以便更好的適應不一樣的應用狀況。若是你對SmartRoute感興趣能夠關注這個項目

https://github.com/IKende/SmartRoute

相關文章
相關標籤/搜索