.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

相关文章
相关标签/搜索