一.drpc 的介绍

  1.rpc

    RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

  2.drpc

    drpc(Distributed Remote Procedure Call) - 分布式的远程过程调用。

  我们回顾一下前面学习的storm知识,知道storm是一个分布式的流式计算框架,由1台nimbus 和多台supervisor 组成,nimbus主要是把任务分发到不同的supervisor 上,而supervisor是分布在不同节点上的。在一个完整的topology中,spout是用来收集上游jobs的,然后再由nimbus负责分发给相应的supervisor,然后由worker来执行jobs,而drcp的调用是当我们想调用这个topology中的函数时,直接通过调用supervisorr上的worker就行,然后由worker线程来执行调用的过程。

  个人理解是:storm的drcp就是满足用户直接调用这个topology处理信息的,以前的可能是固定的收集数据,现在需要时,可以随时调用

二.drcp的调用

  1.本地的调用 

  1. public class HelloDRPC {
  2.  
  3. private static final Logger LOG = LoggerFactory.getLogger(HelloDRPC.class);
  4.  
  5. public static void main(String[] args) throws AlreadyAliveException, InvalidTopologyException, AuthorizationException {
  6.  
  7. boolean isRemote = !(args.length == 0);
  8. LinearDRPCTopologyBuilder builder = new LinearDRPCTopologyBuilder("echo");
  9. builder.addBolt(new EchoBolt(),1);// 第2个参数是:并行度
  10.  
  11. Config conf = new Config();
  12. conf.setDebug(false);
  13. conf.setNumWorkers(2);
  14.  
  15. if(isRemote){
  16.  
  17. StormSubmitter.submitTopology("HelloDRPC", conf, builder.createRemoteTopology());
  18. LOG.warn("==================================================");
  19. LOG.warn("the topology {} is submitted.","HelloDRPC");
  20. LOG.warn("==================================================");
  21. }else{
  22. LocalDRPC drpc = new LocalDRPC();
  23. LocalCluster cluster = new LocalCluster();
  24. cluster.submitTopology("HelloDRPC", conf, builder.createLocalTopology(drpc));
  25. Arrays.asList("hello","world","storm","java","kafka").forEach(
  26. item ->
  27. {
  28. String result = drpc.execute("echo",item );
  29. LOG.warn(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ");
  30. LOG.warn(">>>>>>>>>>>>>>> result:{}",result);
  31. LOG.warn(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ");
  32. }
  33. );
  34. }
  35. }
  36.  
  37. public static class EchoBolt extends BaseBasicBolt{
  38.  
  39. @Override
  40. public void execute(Tuple input, BasicOutputCollector collector) {
  41. LOG.warn(" ================> tuple:{}",input.getFields());
  42. Object id = input.getValue(0);
  43. String name = input.getString(1);
  44. System.err.println("------------------------------");
  45. System.err.println("id: "+id +" name: "+ name);
  46. System.err.println("------------------------------");
  47. collector.emit(new Values(id,"echo: "+ name));
  48. }
  49.  
  50. @Override
  51. public void declareOutputFields(OutputFieldsDeclarer declarer) {
  52. declarer.declare(new Fields("id","value"));
  53. }
  54. }
  55. }
    //在无参情况下,直接运行 会将数据全部发出

  2.远程过程调用

    远程过程调用是将drcp当作一个服务端,然后由client去连接调用。

    1.drcp的配置

  1. drpc.servers:
  2. - "master"
  3. drpc.port: 3777
  4. storm.thrift.transport: "org.apache.storm.security.auth.plain.PlainSaslTransportPlugin"
  5.  
  6. 本测试共3台虚拟机,1nimbus 2supervisor 3storm.yaml 分别配置以上内容,然后启动3drcp服务
    storm drpc &  #后台启动

    2.启动服务端

     将HelloDRPC 当作服务端,打成jar包,然后启动

  1. storm jar storm_test-0.0.1-SNAPSHOT.jar com.drpc.HelloDRPC 1

    3.客户端连接

  1. public class HelloClientDRPC {
  2.  
  3. private static final Logger LOG = LoggerFactory.getLogger(HelloClientDRPC.class);
  4.  
  5. public static void main(String[] args) throws DRPCExecutionException, AuthorizationException, TException {
  6. Config conf = new Config();
  7. conf.put("storm.thrift.transport", "org.apache.storm.security.auth.plain.PlainSaslTransportPlugin");
  8. conf.put(Config.STORM_NIMBUS_RETRY_TIMES, 3);
  9. conf.put(Config.STORM_NIMBUS_RETRY_INTERVAL, 10);
  10. conf.put(Config.STORM_NIMBUS_RETRY_INTERVAL_CEILING, 20);
  11.  
  12. DRPCClient client = new DRPCClient(conf, "master", 3777);
  13. String result = client.execute("echo", "hello");
  14. System.out.println("result:"+result);
  15. LOG.info("=====================================> "+ result);
  16.  
  17. }
  18. }
  19.  
  20. //结果正常返回

storm drpc分布式本地和远程调用模式讲解的更多相关文章

  1. JavaEE(8) - 本地和远程调用的有状态以及无状态Session EJB

    1. 使用NetBeans开发Session Bean #1. 创建项目:File-->New Project-->Java EE-->EJB Module #2. 在项目中创建Se ...

  2. java RMI 远程调用

    1.背景 在学习代理模式的过程中接触到了远程调用,jdk有自己的RMI实现,所以这边自己实现了RMI远程调用,并记录下心得. 感受最深的是RMI和现在的微服务有点相似,都是通过"注册中心&q ...

  3. .net的远程调用

    .Net远程调用(转自:http://www.cnblogs.com/omilan/articles/3191378.html) 看到了这.net远程调用的讲解,觉得不错,拿来分享!! .Net对于远 ...

  4. dotNET使用DRPC远程调用运行在Storm上的Topology

    Distributed RPC(DRPC)是Storm构建在Thrift协议上的RPC的实现,DRPC使得你可以通过多种语言远程的使用Storm集群的计算能力.DRPC并非Storm的基础特性,但它确 ...

  5. Java[2] 分布式服务架构之java远程调用技术浅析(转http://www.uml.org.cn/zjjs/201208011.asp)

    转自:http://www.uml.org.cn/zjjs/201208011.asp 在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如: ...

  6. Atitit.分布式远程调用  rpc  rmi  CORBA的关系

    Atitit.分布式远程调用  rpc  rmi  CORBA的关系 1. 远程调用(包括rpc,rmi,rest)1 2. 分布式调用大体上就分为两类,RPC式的,REST式的1 3. RPC(远程 ...

  7. 分布式远程调用SpringCloud-Feign的两种具体操作方式(精华)

    一 前言 几大RPC框架介绍 1.支持多语言的RPC框架,google的gRPC,Apache(facebook)的Thrift 2.只支持特定语言的RPC框架,例如新浪的Motan 3.支持服务治理 ...

  8. spring代理模式 service远程调用,插件执行

    最近,研究了一下平台远程调用的过程,和service层插件执行的原理,记录一下. 1.远程service调用过程 首先看一下类的继承结构 封装调用处理过程 封装service调用接口 封装servic ...

  9. openoffice excel word 转换pdf 支持本地调用和远程调用

    OpenOffice.org 是一套跨平台的办公室软件套件,能在Windows.Linux.MacOS X (X11)和 Solaris 等操作系统上执行.它与各个主要的办公室软件套件兼容.OpenO ...

随机推荐

  1. 018_查看有多少远程的 IP 在连接本机(不管是通过 ssh 还是 web 还是 ftp 都统计)

    #!/bin/bash#使用 netstat -atn 可以查看本机所有连接的状态,-a 查看所有,-t 仅显示 tcp 连接的信息,-n 数字格式显示# Local Address(第四列是本机的 ...

  2. python 比较运算符

    x == y x < y x <= y x >= y x  != y x is y x is not y x in y x not in y >>> "f ...

  3. 创建全局变量用以保存传递MFC中不同窗口中的数据

    格式如下: //DATA_TEMP.h class CDATA_TEMP{public: CDATA_TEMP(); virtual ~CDATA_TEMP();public: static int ...

  4. 解决Virtualbox的根分区容量不够用问题

    现在Virtualbox新建一块磁盘.容量一定要比原来的大.然后执行克隆命令. 把原来的磁盘内容克隆到新磁盘上.然后重新启动电脑. 运行相关扩容命令即可. #克隆磁盘 cd C:\Program Fi ...

  5. Python经典练习题1:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

    Python经典练习题 网上能够搜得到的答案为: for i in range(1,85): if 168 % i == 0: j = 168 / i; if i > j and (i + j) ...

  6. oracle last_value使用过程中的一个细节

    测试结果集:select role_id,update_date from user_info where role_id='6505007898843021313' 使用last_value求出当前 ...

  7. nodejs 服务器模拟异常状态码429,以及前端vue axios捕获状态码

    nodejs 服务端发送429状态: extendInfo (req, res) { res.status(429).json('Too many requests, please try again ...

  8. TypeError: Data location must be "memory" for return parameter in function, but none was given.

      在用truffle编译智能合约时,报错 TypeError: Data location must be "memory" for return parameter in fu ...

  9. Wamp win10 1077error

    检查日志发现了1077错误 State of services:   The service 'wampapache64' is NOT started EXIT error code:1077 He ...

  10. [oracle]TX行锁发生的常见场景(转贴)

    TX行锁发生的常见场景: 1.当前会话要更新或删除的记录,已经被其他会话更新或删除. 2.对于表上有唯一索引的情况,多个会话插入或更新为相同的键值. 3.对于表上有位图索引的情况,多个会话即使更新不同 ...