文档章节

SmartRoute之远程接口调用和负载

泥水佬
 泥水佬
发布于 2017/02/15 11:08
字数 1006
阅读 234
收藏 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]

© 著作权归作者所有

共有 人打赏支持
泥水佬

泥水佬

粉丝 65
博文 78
码字总数 46392
作品 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

没有更多内容

加载失败,请刷新页面

加载更多

cacti监控安装

cacti是用PHP实现的一个软件,它用snmp服务获取数据,然后用rrdtool存储和更新数据,并生成图表展示。比较适合用于交换机、路由器的网络监控,插件众多,可图示化显示网络状况。 cacti官方推...

hiwill
29分钟前
1
0
shell特殊符号、cut、sort、uniq、wc、tee、tr、split命令

10月15日任务 8.10 shell特殊符号cut命令 8.11 sort_wc_uniq命令 8.12 tee_tr_split命令 8.13 shell特殊符号下 cut 命令 cut作用:截取字符串 用法如下:cat /etc/passwd |head -2 |cut -d ...

hhpuppy
58分钟前
1
0
Springboot实现filter拦截token验证和跨域

背景 web验证授权合法的一般分为下面几种 1使用session作为验证合法用户访问的验证方式 使用自己实现的token 使用OCA标准 在使用API接口授权验证时,token是自定义的方式实现起来不需要引入其...

funnymin
今天
3
0
linux使用ntfs-3g操作ntfs格式硬盘

Linux内核目前只支持对微软NTFS文件系统的读取。 NTFS-3G 是微软 NTFS 文件系统的一个开源实现,同时支持读和写。NTFS-3G 开发者使用 FUSE 文件系统来辅助开发,同时对可移植性有益。 安装 ...

linuxprobe16
今天
2
0
kubeadm部署kubernetes集群

一、环境要求 这里使用RHEL7.5 master、etcd:192.168.10.101,主机名:master node1:192.168.10.103,主机名:node1 node2:192.168.10.104,主机名:node2 所有机子能基于主机名通信,编辑...

人在艹木中
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部