基于接口的调用远比基于基础消息交互来得更简单和便于维护,特别在业务展现上,接口作为业务表现更适合其便利性。为了让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]

SmartRoute之远程接口调用和负载的更多相关文章

  1. HttpClient远程接口调用-实名认证

    1.HttpClient远程接口调用 1)用户注册 注册按钮button提交表单时,要return false form表单 <!-- action="http://localhost ...

  2. HttpClient 远程接口调用方式

    远程接口调用方式HttpClient 问题:现在我们已经开发好了接口了,那该如何调用这个接口呢? 答:使用Httpclient客户端.   Httpclient简介 什么是httpclient Htt ...

  3. RMI(远程接口调用)

    1. RMI的原理: RMI系统结构,在客户端和服务器端都有几层结构. 方法调用从客户对象经占位程序(Stub).远程引用层(Remote Reference Layer)和传输层(Transport ...

  4. 【RPC】远程接口调用实例 的几种方式比较

    pring中,用JMS搞RPC时会用到: org.springframework.jms.remoting.JmsInvokerServiceExporter org.springframework. ...

  5. java之远程接口调用

    一.通过地址栏传值 1.项目结构 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi ...

  6. SpringBoot远程接口调用-RestTemplate使用

    在web服务中,调度远程url是常见的使用场景,最初多采用原生的HttpClient,现采用Spring整合的RestTemplate工具类进行.实操如下: 1. 配置 主要用以配置远程链接的相关参数 ...

  7. 以前写的一段aop,远程接口调用的日志。

    using System;using System.Collections.Generic;using System.Linq;using System.Text; using Microsoft.P ...

  8. [go]grpc远程接口调用实现

    // grpc序列化/反序列化成对应语言的对象 // 1.写idl(数据类型+方法) // 2.生成对应语言的序列化/反序列化代码 // 3.方法需要自己实现 // 环境(将gopath/bin加入p ...

  9. Java RMI远程方法调用

    RMI(远程接口调用) 1. RMI的原理: RMI系统结构,在客户端和服务器端都有几层结构. 方法调用从客户对象经占位程序(Stub).远程引用层(Remote Reference Layer)和传 ...

随机推荐

  1. Android面试题随笔1

    1.如何让一个应用在手机上产生两个或多个图标? 在清单文件中的activity节点下配置如下:[5,7行代码] <activity android:name=".MainActivit ...

  2. Tomcat热部署:Maven项目一键部署到Tomcat服务器 - 支持多环境

    参考:Eclipse中的Maven项目一键部署到Tomcat服务器 - 支持多环境部署 命令 debug模式设置关联源码 eclipse --> 项目右键 --> Debug As --& ...

  3. SSL证书指令

    转自:http://blog.csdn.net/madding/article/details/26717963 生成Self Signed证书 # 生成一个key,你的私钥,openssl会提示你输 ...

  4. MySQL show master / slave status 命令参数

    一.show master status 二.show slave status Slave_IO_State SHOW PROCESSLIST输出的State字段的拷贝.SHOW PROCESSLI ...

  5. IIS Default Web Site : The service did not response to the start or control request in a timely fashion

    IIS Default Web Site无法启动,提示错误:The service did not response to the start or control request in a time ...

  6. ios 字体设计

    ref: http://ju.outofmemory.cn/entry/217705 ref:http://gold.xitu.io/entry/57958a41128fe10056be13b1 下面 ...

  7. IOS开发-UI学习-UISlider(滑动条)的使用

    滑动条即UISlider,是我们常见的软件中设置音量,亮度等的滑条,初始化及基本设置如下: // 新建滑动条 UISlider *slider = [[UISlider alloc]initWithF ...

  8. Hibernate中sessionfactory和session的多线程问题

    http://blog.sina.com.cn/s/blog_7ffb8dd5010146i3.html

  9. ps--记录几个方法步骤

    1.图片文字去掉 1.1 矩形工具-->吸管-->alt+delete 1.2 钢笔工具-->Ctrl+回车(变换选区)-->吸管-->alt+delete 2.图层锁不 ...

  10. sql2000/sql2005/sql2008数据库变为0字节修复/MDF文件0字节恢复

    [数据恢复故障描述]  这个客户是生产型数据库,数据比较重要,产生量也比较大,客户要求必须尽快修复,保证生产尽快恢复运行.sql数据库文件,由于碎片链接过长,mdf文件突然变为0字节,开始客户尝试自行 ...