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
