RPC(Remote Procedure Call Protocol)——远程过程调用协议

运行时,一次客户机对服务器的RPC调用,其内部操作大致有如下十步:
1.调用客户端句柄;执行传送参数
2.调用本地系统内核发送网络消息
4.服务器句柄得到消息并取得参数
5.执行远程过程

 
6.执行的过程将结果返回服务器句柄
7.服务器句柄返回结果,调用远程系统内核
8.消息传回本地主机
9.客户句柄由内核接收消息
10.客户接收句柄返回的数据
 
rebbitmq通过消息交互来实现远程方法的调用,
主要过程包括两端:
被调用端:
             //创建链接
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
{
//创建渠道
using (var channel = connection.CreateModel())
{
//创建消息队列,接收rpc请求
channel.QueueDeclare(queue: "rpc_queue", durable: false, exclusive: false, autoDelete: false, arguments: null); //监听并消费消息,收到消息需要通知发送方
var consumer = new QueueingBasicConsumer(channel);
channel.BasicConsume(queue: "rpc_queue", noAck: false, consumer: consumer);
while (true)
{
Thread.Sleep();
Console.WriteLine(string.Format("等待RPC请求..."));
string response = null;
var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
var body = ea.Body;
var props = ea.BasicProperties;
var replyProps = channel.CreateBasicProperties();
//约定ID
replyProps.CorrelationId = props.CorrelationId;
var message = Encoding.UTF8.GetString(body);
try
{
Console.WriteLine(string.Format("执行方法{0}", message));
response = Request(message);
}
catch (Exception ex)
{
Console.WriteLine(string.Format("执行{0}异常,异常信息:{1}", message, ex.Message));
response = "";
}
finally
{
var responseBytes = Encoding.UTF8.GetBytes(response);
//按照发送方的要求(等待返回的接收队列、约定ID),返回消息
channel.BasicPublish(exchange: "", routingKey: props.ReplyTo, basicProperties: replyProps, body: responseBytes);
//收到消息需要通知发送方
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
}
}
}
}

调用端:

             //创建链接
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
{
//创建渠道
using (var channel = connection.CreateModel())
{
//创建接收返回消息的队列
string replyQueueName = channel.QueueDeclare().QueueName; //监听并消费消息,收到消息无需通知发送方
var consumer = new QueueingBasicConsumer(channel);
channel.BasicConsume(queue: replyQueueName, noAck: true, consumer: consumer); var props = channel.CreateBasicProperties();
props.ReplyTo = replyQueueName;
var corrId= Guid.NewGuid().ToString();
props.CorrelationId =corrId; var messageByte = Encoding.UTF8.GetBytes(message);
//发送消息,并携带接收返回消息的相关内容(接收队列、约定ID)
channel.BasicPublish(exchange: "", routingKey: "rpc_queue", basicProperties: props, body: messageByte); while (true)
{
Thread.Sleep();
Console.WriteLine(string.Format("等待请求requst:{0}返回...", message));
var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
if (ea.BasicProperties.CorrelationId==corrId)
{
Console.WriteLine(string.Format("请求requst:{0};response:{1}", message, Encoding.UTF8.GetString(ea.Body)));
break;
}
}
}
}

rebbitmq-RPC(C#)的更多相关文章

  1. RabbitMQ 消息队列 实现RPC 远程过程调用交互

    #!/usr/bin/env python # Author:Zhangmingda import pika,time import uuid class FibonacciRpcClient(obj ...

  2. 从RPC开始(一)

    这是一篇关于纯C++RPC框架的文章.所以,我们先看看,我们有什么? 1.一个什么都能干的C++.(前提是,你什么都干了) 2.原始的Socket接口,还是C API.还得自己去二次封装... 3.C ...

  3. RPC 使用中的一些注意点

    最近线上碰到一点小问题,分析其原因发现是出在对 RPC 使用上的一些细节掌握不够清晰导致.很多时候我们做业务开发会把 RPC 当作黑盒机制来使用,但若不对黑盒的工作原理有个基本掌握,也容易犯一些误用的 ...

  4. 谈谈如何使用Netty开发实现高性能的RPC服务器

    RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议.说的再直白一点,就是客户端在不必知道 ...

  5. 游戏编程系列[1]--游戏编程中RPC协议的使用[3]--体验

    运行环境,客户端一般编译为.Net 3.5 Unity兼容,服务端因为用了一些库,所以一般为4.0 或往上.同一份代码,建立拥有2个项目.客户端引用: WindNet.Client服务端引用: OpL ...

  6. python通过protobuf实现rpc

    由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc.rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行g ...

  7. spider RPC入门指南

    本部分将介绍使用spider RPC开发分布式应用的客户端和服务端. spider RPC中间件基于J2SE 8开发,因此需要确保服务器上安装了JDK 8及以上版本,不依赖于任何额外需要独立安装和配置 ...

  8. Netty实现高性能RPC服务器优化篇之消息序列化

    在本人写的前一篇文章中,谈及有关如何利用Netty开发实现,高性能RPC服务器的一些设计思路.设计原理,以及具体的实现方案(具体参见:谈谈如何使用Netty开发实现高性能的RPC服务器).在文章的最后 ...

  9. 基于Netty打造RPC服务器设计经验谈

    自从在园子里,发表了两篇如何基于Netty构建RPC服务器的文章:谈谈如何使用Netty开发实现高性能的RPC服务器.Netty实现高性能RPC服务器优化篇之消息序列化 之后,收到了很多同行.园友们热 ...

  10. Redola.Rpc 的一个小目标

    Redola.Rpc 的一个小目标 Redola.Rpc 的一个小目标:20000 tps. Concurrency level: 8 threads Complete requests: 20000 ...

随机推荐

  1. this、访问修饰符——Java笔记(五)

    this         表示当前对象         谁调用方法谁就是当前对象 用static修饰的代码块里面不能使用this 方法里面有一个和字段同名的局部变量时,不能省略this   this还 ...

  2. request的setAttribute()怎么用的?

    request.setAttribute()怎么用的?JSP1代码String [] test=new String[2];test[0]="1";test[1]="2& ...

  3. 开发现代ASP.NET应用程序

    新思想.新技术.新架构——更好更快的开发现代ASP.NET应用程序(续1)   今天在@张善友和@田园里的蟋蟀的博客看到微软“.Net社区虚拟大会”dotnetConf2015的信息,感谢他们的真诚付 ...

  4. C# WinForm开发系列 - WebBrowser

    原文:C# WinForm开发系列 - WebBrowser 介绍Vs 2005中带的WebBrowser控件使用以及一些疑难问题的解决方法, 如如何正确显示中文, 屏蔽右键菜单, 设置代理等; 收集 ...

  5. centos7的安装

    初装centos7还是在九月份,那时候关于win7 下centos7硬盘安装的资料很少,现在就好多, 在这里备份下东西吧 首先是安装的时候,关于找从那个地方找image的问题. hda ,sda分别表 ...

  6. zoj 3822 Domination(dp)

    题目链接:zoj 3822 Domination 题目大意:给定一个N∗M的棋盘,每次任选一个位置放置一枚棋子,直到每行每列上都至少有一枚棋子,问放置棋子个数的期望. 解题思路:大白书上概率那一张有一 ...

  7. C# 程序自动批量生成 google maps 的KML文件

    原文:C# 程序自动批量生成 google maps 的KML文件 google maps 的 KML 文件可以用于静态的地图标注,在某些应用中,我们手上往往有成百上千个地址,我们需要把这些地址和描述 ...

  8. JS操作cookie的实例

    <script type="text/javascript"> //写cookies函数 function SetCookie(name, value)//两个参数,一 ...

  9. inux平台的C与C++

    课堂里学不到的C与C++那些事(一) 首先,声明一下这是一个系列的文章.至于整个系列有多少篇,笔者也不知道,不知道有多少篇,也不知道多久会更新一篇.反正只有一个原则,写出来的文 章能见得人才会公布出来 ...

  10. Critical thinking and Thoughtful writing

    Critical thinkers are able to : Articulate their ideas clearly and persuasively in writing Understan ...