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

    下载Git工具:下载链接 https://git-scm.com/downloads/ 然后配置Git:配置教程链接  http://jingyan.baidu.com/article/ceb9fb1 ...

  2. Pycharm之远程编程

    mac上似乎暂时不支持. File->New Project 然后Location里选择你存放项目的地址 然后在Interpreter后面的齿轮状(下图红色处)点击后选择Add Remote. ...

  3. .NET防止重复提交数据

    最近在做一个销售系统的时候,操作人员提交数据的时候数据库竟然会出现多条数据相同的记录,并且是在1秒之内,客户反馈给我们,第一反应是重复提交的问题,检查了下代码,程序执行完成后应该是跳转到别的页面的,可 ...

  4. linux在线预览pdf文件开发思路

    准备:swftools,flexpaper 基本思路: 1,将pdf文件转化成swf文件 2,使用flexpaper预览swf文件 主要代码: 1,在linux中安装swftools.官网下载swft ...

  5. centos 6.5中安装hadoop2.2

    1.配置集群机器之间ssh免密码登录 (1) ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa 将id_dsa.pub 公钥 加入授权的key中去 这条命令的功能是把公 ...

  6. Xcode 使用技巧

    Xcode 之 设置文件生成时的模板 Xcode 之 修改 Create by Xcode 之 添加前缀 Xcode 之 alcatraz (插件管理器) Xcode 之 重构功能 Xcode 之 s ...

  7. swift 定位 根据定位到的经纬度转换城市名

    好久没写随笔了   最近这段时间项目有点紧  天天在加班  国庆 一天假都没放  我滴娃娃   好啦  牢骚就不发了  毕竟没有什么毛用    待我那天闲了专门写一篇吐槽的随笔  

  8. 验证浏览器是否安装已flash插件的js脚本

    function flashChecker() { var hasFlash = 0; //是否安装了flash var flashVersion = 0; //flash版本 if(document ...

  9. linux:基本命令

    1.显示日期与时间:date 显示2009/08/17形式的格式:date +%Y/%m/%d 显示17:04时间格式:date +%H/%M 2.显示日历:cal 常用的命令:cal 2009:ca ...

  10. Flash神奇的视频利器StageVideo

    在过去的几年里,视频已经成为web网页上最主流的趋势之一,这主要是由Adobe Flash Player来推动的.2007年Flash Player 9中引入了H.264和全屏支持技术,通过在web页 ...