.Net Core開源通訊元件 SmartRoute(服務即叢集)

smark發表於2016-11-08

        SmartRoute是基於Dotnet Core設計的可執行在linux和windows下的服務通訊元件,其設計理念是去中心化和零配置即可實現服務通訊叢集。SmartRoute是通過訊息訂閱的機制實現服務與服務之間的通訊,它可以讓廣播網段內所有伺服器上的應用自動構建通訊叢集; 而通訊叢集完全是SmartRoute自動構建並不需要進行任何配置或安裝中間服務。通過這種全新的通訊開發方式可以讓開發者更輕鬆和簡單地構建基於服務的叢集通訊應用。

SmartRoute的發展目標

 

 

智慧整合服務通訊互動

不需要具備通訊專業知識即可輕鬆構建

零配置、零安裝引用元件即可用

可快速構建服務應用通訊,訊息分發,閘道器叢集和叢集負載應用

 

原理

        SmartRoute基於UDP廣播的方式來發現網內相同叢集名稱的服務應用,當然應用是基於同一叢集名稱的情況下,會發起TCP連線握手並進行驗證,當驗證通過後節點會建立的通訊關係。在同一叢集裡的任意一個節點產生的訂閱都會同步到所有節點上。SmartRoute的網路節點是基於網狀結構,並不需要中心服務維護,而這些特性都是自動化的開發人員完全不需要了解。

使用

        SmartRoute的使用並不會像傳統網路程式那樣構建服務,然後構建Client連線到相應服務那樣複雜。在SmartRoute中不存在服務和客戶端這一說法,任何節點即是服務的同時也是客戶端;SmartRoute的訊息是通過訂閱來處理,只要記住對方的名稱就可以向對方傳送訊息,你並不需要關注對方是在那個節點或服務上。

構建訂閱

    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

 

相關文章