rpc

dubbo系列----rpc初探

假如想象 提交于 2019-12-05 21:42:25
1 首先,什么是RPC RPC指的是远程服务调用。RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。rpc框架应该提供对于远程服务的透明化调用,不需要显式的区分本地or远程。说得通俗点,rpc应该能够做到像调用本地方法一样调用远程服务。 2 rpc调用方式 rpc调用和方法调用一样,对于调用者来说,分为同步和异步两种方式(同步异步本身就是一个很大的课题),这里不细说同步和异步的概念。 同步自不必多说,正常的http调用,对于浏览器来说,必须等到服务端响应才能继续(非AJAX) 异步就是AJAX 为什么这里要说这个 ,在这里抛个砖,后续当我们说到dubbo做SOA实践的时候,会讨论异步调用和同步调用对服务器吞吐能力的影响,这也可以参考我的另一篇文章 http://my.oschina.net/zhenglingfei/blog/492883 3 RPC调用过程 上图来自文章1,给出了一个rpc框架的思路,其实很多的rpc框架都是这样做的,至少我所了解的是这样(dubbo以及我曾经公司的rpc框架)。一般的过程是本地应用调用远程API(存在于本地),实际的调用工作会由初始化时生成的本地代理执行,本地代理通常会根据根据一些既定策略(路由,容错等)选择实际的远程服务进行通信,而服务端则是一个反向的过程 而一个rpc框架

深入浅出 RPC

亡梦爱人 提交于 2019-12-05 21:42:08
《深入篇》我们主要围绕 RPC 的功能目标和实现考量去展开,一个基本的 RPC 框架应该提供什么功能,满足什么要求以及如何去实现它? RPC 功能目标 RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。 为实现该目标,RPC 框架需提供一种透明调用机制让使用者不必显式的区分本地调用和远程调用,在前文《浅出篇》中给出了一种实现结构,基于 stub 的结构来实现。下面我们将具体细化 stub 结构的实现。 RPC 调用分类 RPC 调用分以下两种: 1. 同步调用 客户方等待调用执行完成并返回结果。 2. 异步调用 客户方调用后不用等待执行结果返回,但依然可以通过回调通知等方式获取返回结果。 若客户方不关心调用返回结果,则变成单向异步调用,单向调用不用返回结果。 异步和同步的区分在于是否等待服务端执行完成并返回结果。 RPC 结构拆解 《浅出篇》给出了一个比较粗粒度的 RPC 实现概念结构,这里我们进一步细化它应该由哪些组件构成,如下图所示。 RPC 服务方通过 RpcServer 去导出(export)远程接口方法,而客户方通过 RpcClient 去引入(import)远程接口方法。客户方像调用本地方法一样去调用远程接口方法,RPC 框架提供接口的代理实现,实际的调用将委托给代理 RpcProxy

Windows Hook经验总结之四:COM组件Hook原理及实践

两盒软妹~` 提交于 2019-12-05 19:27:29
前面 已经介绍过API的hook方法及具体实践,本文则讲述COM组件的Hook方式。COM组件可简单理解为一个二进制可执行程序或DLL,内部包含一系列的接口和函数。Hook COM本质上也是进行函数地址切换,让它跳到我们自定义的函数执行我们想要的功能。但这一切同样是发生在系统架构下,自定义函数的执行时机不由我们触发。 一次完整的Hook流程包括以下三步: 定位COM,确定自己需要hook的目标。可以从msdn和vs sdk上寻求帮助,获取目标COM的接口细节,比如组件的CLSID、接口的IID等信息,可关注shellapi.h、shobjidl.h等头文件。 参考目标COM的接口信息,实现自定义的COM功能。 将自定义COM注册生效。 本文以IFileOperation的文件拷贝接口为例进行阐述。 定位COM XP时代,文件目录操作以一个个独立的API函数形式存在于kernel32.dll中,如CopyFile、CreateDirectory、DeleteFile等。WIN7之后,微软改了这一层的实现,改用IFileOperation囊括原有的API集。当然,这一信息来自baidu、msdn。然后就是确定IFileOperation的接口虚函数表,这个已在vs2008的shobjidl.h头文件中声明,摘录如下。 IFileOperation : public IUnknown {

RPC框架GPRC浅析

一个人想着一个人 提交于 2019-12-05 16:54:34
RPC框架中数据的传输通常有两种:二进制传输,和文本类传输 。 二进制传输的优点是:传输性能好,因为要写协议文件,所以更严谨。 缺点是:二进制难以跨语言, 文本类传输的优点是:可以跨语言,而且由于不用写协议文件,使用更灵活 。 缺点是:传输性能稍微要差一些。 GRPC的特点是不仅采用了二进制传输,保证了传输性能,还满足跨语言,保证了灵活性。 序列化 GPRC的二进制序列化协议是Protocol Buffers。 Protocol Bufers 是一款压缩效率极高的序列化协议,有很多设计精巧的序列化方法。 对于 int 类型 32 位的,一般都需要 4 个 Byte 进行存储。在 Protocol Bufers 中,使用的是变长整数的形式。对于每一个 Byte 的 8 位,最高位都有特殊的含义。 如果该位为 1 ,表示这个数字没完,后续的 Byte 也属于这个数字;如果该位为 0 ,则这个数字到此结束。其他的 7 个 Bit才是用来表示数字的内容。因此,小于 128 的数字都可以用一个 Byte 表示;大于 128 的数字,比如 130 ,会用两个字节来表示。 对于每一个字段,使用的是 TLV ( Tag , Length , Value )的存储办法。 其中 Tag = (feld_num << 3) | wire_type 。 feld_num 就是在 proto 文件中

Connecting to WMI: 0x800706ba errors on some machines (but not all)

江枫思渺然 提交于 2019-12-05 12:30:05
When I try to connect to WMI from Powershell, ConfigMgr, or WMI explorer, I can talk to the majority of my computers, but some (maybe 30%?) return an 0x800706ba (RPC server is unavailable). If I turn the firewall off on the remote machine, the queries start working. I have tried a bunch of different configurations of firewall settings, though, and I can't seem to figure out what the right combination of exceptions is. Here's the relevant bits of my firewall config on the remote machine. The crazy part is that there are no drops listed in pfirewall.log when it doesn't work - but again, if I

Linux远程目录挂载

自古美人都是妖i 提交于 2019-12-05 11:35:44
原文内容来自于LZ(楼主)的印象笔记,如出现排版异常或图片丢失等问题,可查看当前链接: https://app.yinxiang.com/shard/s17/nl/19391737/ad99ab1d-1040-45e0-aaf6-f5d69c247862 问题: 1、如何使A服务器的某个目录挂载到B服务器的某个目录下,使其达到B服务下的目录文件一旦变更,可以实时的在A服务的目录下体现出来; Lnux的解决方式 1、首先将B服务器的该目录,设置为共享文件夹(只有将其设置为共享文件夹后才能再另外的机器上进行该目录的远程连接访问,共享文件夹这个概念与windows 很有相似之处) 2、A服务器则通过 mount 的方式,指定对应的远程主机所抛出来的共享文件夹进行连接 linux如何实现共享文件夹的效果呢? 1、A服务器新创建的文件夹远程挂载到B服务器的某个 10G以上大小内容的文件夹下后,实际情况下A服务器的磁盘并没有因为挂载了10G的远程文件,而被消耗掉10G的磁盘空间,这说明实际情况下的挂载,并非将远程服务的文件实时Copy到目标文件夹中,当然这也不符合共享文件夹的特征; 那么既然是已经挂载了远程目录后,此时A服务访问自身文件夹时,是如何实时展示B服务的文件夹内容的呢? 原因是, A服务每次对于自身挂载文件夹的访问,实际上都是发送了一次新的RPC请求,请求目标服务器

模拟Hadoop底层实现RPC通信机制

岁酱吖の 提交于 2019-12-05 08:26:16
最近研究Hadoop,发现Hadoop底层使用Hadoop RPC机制,为了进一步了解Hadoop底层代码,自己实现了一套RPC机制。 不同的地方是,我使用的传统的ServerSocket做的服务端。并没有使用nio中的知识。 《RPC通信机制的实现 》http://www.maoxiangyi.cn/index.php/archives/305 来源: oschina 链接: https://my.oschina.net/u/725837/blog/152866

Determining the COM object blocking finalizer

 ̄綄美尐妖づ 提交于 2019-12-05 07:52:42
We have a .NET background processing application (console app) that executes some arbitrary workloads (basically internal users supply .NET DLLs implementing "Execute" interface). Background processing application then loads the dll via reflection and executes it. One of the supplied DLLs apparently has a COM object in it which is not properly disposed (likely). As the processing time is quite long, AND we have COM objects created on the main thread and not disposed properly, this causes a Finalizer Thread to be blocked, which subsequently causes the process to accumulate a significant amount

NFS

馋奶兔 提交于 2019-12-05 06:46:41
NFS 基础概述 提供RPC服务的程序 配置NFS 基础概述 包默认都是安装上的,报名叫nfs-utils 启动服务 提供RPC服务的程序 叫做portmapper -p(probe,探测) 列出所有在host用portmap注册的RPC程序,如果没有指定host,就查找本机上的RPC程序。 配置NFS 来源: https://www.cnblogs.com/hao-ran/p/11911423.html

Gitblit push error “error: RPC failed; result=52, HTTP code = 0”

こ雲淡風輕ζ 提交于 2019-12-05 06:25:00
Setup gitlbit on my Mac OS X 10.8, but keeps failing to push! In the Gitblit web interface, I created an empty repository called empty and cloned it to local storage by the following command: git clone https://localhost:8443/git/test/empty.git I added a file and commit the change and added a remote git remote add gitblit https://localhost:8443/git/test/empty.git then I try to push with: git push -v gitblit master and the error shows: Pushing to https://localhost:8443/git/test/empty.git Counting objects: 3, done. Writing objects: 100% (3/3), 215 bytes, done. Total 3 (delta 0), reused 0 (delta 0