文档章节

SmartRoute之远程接口调用和负载

泥水佬
 泥水佬
发布于 2017/02/15 11:08
字数 1006
阅读 235
收藏 1

        基于接口的调用远比基于基础消息交互来得更简单和便于维护,特别在业务展现上,接口作为业务表现更适合其便利性。为了让SmartRoute更适合业务应用集成,在新的一年开始SmartRoute集成了远程接口调用功能。基于SmartRoute的基础特性,在这基础上扩展的接口调用会变得更简单灵活,其特别点如下:并不需要知道服务地址,只需要明确接口和方法即可以实现远程服务调用;无需任何配置即可实现负载和故障迁移。而这一系列的更利功能都归攻于SmartRoute基础建设!

        SmartRoute的远程接口调用是基于Protobuf的RPC实现,其制定服务是以接口为基础有点似于wcf,但调会变得更透明简单.以下针对组件实现一个简单的远程接口调用和负载处理。

接口定义

        组件对接口的定义并没有什么特别要求或添加特性,但接口方法的定义不支持同名称重载,现有版本的组件暂不支持。对于out和ref类型的参数也暂不支持。以下是定义一个简单的用户操作接口:    

public interface IUserService
	{
		DateTime Register(string name, string email);
		void ChangePWD(string name, string oldpwd, string newpwd);
	}

注册口服务

        接口定义后需要针对接口进行实现才能注册到服务中,组件是通过SwitchSubscriber来挂载接口服务;首先是初始化通讯节点,然后在这节点服务基础上构建相应的SwitchSubscriber订阅器,基于订阅器即可以进行服务注册。

public class Program : IUserService
	{
		public static void Main(string[] args)
		{
			INode node = SmartRoute.NodeFactory.Default;
			node.Loger.Type = LogType.ALL;
			node.AddLogHandler(new SmartRoute.ConsoleLogHandler(LogType.ALL));
			node.Open();
			SwitchSubscriber rmiserver = new SwitchSubscriber(node);
			rmiserver.Register<IUserService>(new Program());
			System.Threading.Thread.Sleep(-1);
		}

		public void ChangePWD(string name, string oldpwd, string newpwd)
		{
			Console.WriteLine("ChangePWD {0}/{1}/{2}", name, oldpwd, newpwd);
		}

		public DateTime Register(string name, string email)
		{
			Console.WriteLine("register {0}/{1}", name, email);
			return DateTime.Now;
		}
	}

        对于以上服务注册代码相信有朋友会感觉奇怪,为什么没有绑定服务地址类似的代码?其实这也是组件的特点之一,在整个通讯应用过程中都不需要了解服务地址这一概念,通讯所需要的要求在组件中都完全被透明化了。

调用实现

        基于服务的调用也是在SwitchSubscriber的基础上进行处理,由于组件暂没实现接口代理的动态实现,所以现阶段只能通过手动实现接口的代理类了。

public class UserService : IUserService
	{
		public UserService(SwitchSubscriber context)
		{
			this.Context = context;
		}

		public SwitchSubscriber Context { get; set; }

		public void ChangePWD(string name, string oldpwd, string newpwd)
		{
			Context.MethodInvoke("IUserService", "ChangePWD", name, oldpwd, newpwd);
		}

		public DateTime Register(string name, string email)
		{
			return Context.MethodInvoke<DateTime>("IUserService", "Register", name, email);
		}
	}

        接口的实现通过SwitchSubscriber调用相关接口方法名称传入相关参数即可,由于组件并不需要知道通讯细节所以也不需要指定接口服务地址的工作。调用和服务处理一样定义节点并开启构建相关SwitchSubscriber对象即可使用。 

    INode node = NodeFactory.Default;
    node.Loger.Type = LogType.ALL;
    node.AddLogHandler(new ConsoleLogHandler(LogType.ALL));
    node.Open();
    SwitchSubscriber rmiserver = new SwitchSubscriber(node);
    mUserService = new UserService(rmiserver);
    DateTime result = mUserService.Register("henry" + i, "hrenyfan@msn.com");
    Console.WriteLine(result);

        实际应用效果截图

负载和迁移

        在实际应用中服务必须存在负载和故障迁移,如何为接口服务添加这些复杂功能呢?由于组件基础已经集成了这些功能,所以在代码上并不需要任何调用就能实现多节点负载和故障处理;只要编写的服务启动一个新的实例,调用者就会自动发现并进行负载调用;同样如果一个节点现出通讯异常后,调用者会自动路由到正常的节点服务中,这一系列的措施都是全自动并不需要配置或代码来处理!

[组件开源地址:https://github.com/IKende/SmartRoute]

© 著作权归作者所有

共有 人打赏支持
泥水佬

泥水佬

粉丝 69
博文 83
码字总数 53391
作品 7
广州
架构师
私信 提问
消息智能路由组件SmartRoute

消息传递在软件开发过程中是一件很常见的事情,而在不同的场景所使用消息传递方式也有所不同,在对象之间制定相关接口方法和对象结构,对于进程之间可能使用内存共享或一些通讯产品,在不同服务器...

泥水佬
2015/08/17
0
1
smartroute集成聊天通讯集群

在制定一个规模比较多大的聊天应用时,往往需要制定部署多个应用服务,其一可以保障服务的可靠性,其二可以增加用户负载量.但制定这样一种应用体系是一件复杂的事情,毕竟同一群体的用户实际上会...

泥水佬
2015/08/26
0
0
SmartRoute应用-helloWorld示例

本章主要是通过helloWorld来介绍SmartRoute组件的使用,SmartRoute和一般的通讯组件使用方式用点差别,使用方式主要强调就用零配置和零安装即可用.在传统通讯应用中需要开启服务端然后由另一方...

泥水佬
2015/08/24
0
0
SmartRoute零配置零安装实现分布式负载应用

随着应用规模的增长服务则需要扩展集群休部署,在集群化部署过程首先要考虑服务负载处理的问题,在实现应用场中有很多集群化的负载方式,如网络通讯层面的LVS,HTTP应用协议层面的nginx.然而这...

泥水佬
2016/01/14
174
0
基于 Dotnet Core 的服务通讯组件--SmartRoute

SmartRoute 是基于Dotnet Core设计的可运行在linux和windows下的服务通讯组件,其设计理念是去中心化和零配置即可实现服务通讯集群。SmartRoute是通过消息订阅的机制实现服务与服务之间的通讯...

泥水佬
2016/11/08
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

【Visual Studio 扩展工具】使用 ComponentOne迷你图控件,进行可视化数据趋势分析

概述 迷你图 —— Sparklines是迷你的轻量级图表,有助于快速可视化数据。 它们是由数据可视化传奇人物Edward Tufte发明的,他将其描述为“数据密集,设计简单,字节大小的图形。”虽然迷你图...

葡萄城技术团队
9分钟前
2
0
java中重试的使用工具

spring-retry easy-retry guava-retry spring-retry中应该注意的东西 @EnableRetry Retryable注解 被注解的方法发生异常时会重试 value:指定发生的异常进行重试 include:和value一样,默认...

writeademo
21分钟前
2
0
NEO改进协议提案8(NEP-8)

文章目录 摘要 动机 原理 详述 CALL_I CALL_E CALL_ED CALL_ET CALL_EDT 向后兼容性 实现 摘要 本NEP提议NeoVM计算栈堆栈隔离,以确保动态调用的安全性,并为将来的新功能提供支持。 动机 现...

NEO-FANS
23分钟前
1
0
TiDB DevCon 2019 报名开启:年度最高规格的 TiDB 技术大会

年度最高规格的 TiDB 技术大会 海内外动态及成果的综合呈现 最新核心技术解读 多个成果首次亮相 2019 RoadMap 展望 14 位海内外基础架构领域技术大咖 8 个跨行业多场景的用户实战经验 1 小时...

TiDB
24分钟前
0
0
struts2返回json

返回action中成员变量jsonResult,注意设置get set方法 struts配置文件 <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Co......

安卓工程师王恒
26分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部