当前位置: 首页 > 科技观察

什么是RPC?为什么要学习RPC?

时间:2023-03-19 23:25:53 科技观察

随着近年来分布式和微服务架构的流行,RPC在开发工作中的使用越来越多,也越来越重要。今天我们来看看RPC是什么,为什么要了解RPC,学习RPC我们可以掌握什么?什么是“RPC”?由客户端发送请求消息到已知的远程服务器,以使用提供的参数执行指定的过程。远程服务器向客户端发送响应,应用程序继续其进程。首先,这里的重点是“协议”,其次是RPC中的R——“Remote”。所以这里的RPC的意思是一种调用和执行远程方法的协议。我们的方法调用一般是这样的Echoecho=child.say("HelloWorld");这里一般是指调用自己本地的方法,比如Java应用就是指调用同一个JVM中的方法。如果上面的代码要以RPC的形式被我们调用,那么写法有什么不同呢?事实上,没有。我们在调用的时候还是按照这种形式,只需要在配置中指定这个方法对应的“远程地址”即可。再举一个生活中的例子。假设你是一个招揽游客的小贩。每次聚集所有游客时,你都在努力呐喊,在各种神奇的网站上搜索,寻找相应景点的攻略。然后有一天,你和街上的几家印刷店谈起了合作。符合条件并能导览相应景点的,可到打印店“登记”。下次来的时候,根据记录,直接“联系”到对应的人,省事不少。这里我们看到两种使用RPC的方式:直接在配置中写远程方法的地址,请求一步到位。配置中提供的“注册中心”的地址,请求方法的时候,先查看注册中心中方法的地址,然后执行看到这个,不禁要说,调用一个不难远程方法,有什么可看的。那我们继续这个栩栩如生的例子。当你召集游客联系你的常客时,他生病了。你在找谁?你说我有“备份”,注册表有很多记录。那么,在这么多的导游中,你“选”了哪一位呢?你说,靠,我这么在乎,随便挑一个打电话。那么,此时您已经在使用RPC中的“负载平衡”,但您的策略是“随机”的。如果导游报名时每人都提供照片和历史认证评级,那你可能不会随便挑十几张,你看照片,哪个感觉靠谱,哪个评级高。这时候,这些项目就作为你联系他的“砝码”。在多个导游中,这个权重决定了他们被联系的次数。此时,你的LB不再是简单的随机,而是基于“权重”。又比如你们合作过很多次,固定的景点都是固定的导游,老熟人,每次带人总是找他。这时候你的策略就变成了“consistentHash”。后来有导游告诉你,最近发现像他们这样的自营导游主动招揽生意,可能会被罚款,所以下次联系他的时候不要说那么多。于是你立下一个简单的“约定”:先说“0或1”代表你有空,然后说“1到100”代表你要带游客参观的景点。此外,“0或1”表示是否可以带货购物。你会发现此时你的协议里面有“编码”和压缩。大家在听到对方的信息的时候,需要在这里进行解码,还原成真实的信息。RPC中也是如此。在调用方法之前,需要将相应的参数序列化,以指定的“格式”传入,到达后返回执行相应的方法。一段时间后,你的生意发展壮大,一个景点附近的导游自动组成一个团队。当您要求到达时,将根据上述权重自动选择该景区的一名导游。这些导游组成一个“集群”。去每个导游团判断景区能不能提供。此时,秘书组正在“监视”。(一口老血,编不下去了。。。)接下来我想说的是为什么要学习RPC。为什么要学习RPC为什么要学习RPC?我们在开头也提到,微服务和分布式应用的开发越来越普遍,RPC是一个非常重要的组件。通过对RPC的学习,可以更好地理解和设计开发更大的应用程序。同时,RPC涉及的各种技术也将拓宽学习者的知识面,每一方面都值得深化。而对于技术,尤其是源码的学习,反过来会促进对RPC的更好理解,才能写出更好的代码。学习RPC我们可以掌握什么?在上面的生活例子中,我们提到了这些技术:Registry、集群、负载均衡、协议、序列化编码、解码、一致性Hash监控……这些技术在RPC中也是非常重要的。我们来看一下Dubbo的源码,从代码的组织上也可以窥见一斑。在这张图中,比我们在上面例子中提到的技术多了“Filter”、“Config”和“Remoting”,包括更完善的RPC配置管理、请求过滤、多协议支持等。对于RPC学习来说,这样的作为负载均衡,除了技术,还可以学习一个idea,这是一个可以迁移的东西。这种负载均衡的使用和实现,在使用Nginx和Apache做反向代理,应用服务器搭建集群的时候都会用到。和consistentHash一样,通过Hash思想实现请求均衡,consistentHash的思想可以保证请求Hash更大程度上发往原服务器,减少增删服务器时的影响。再比如“注册中心”Registry,我们可以了解到注册中心是通过zk、redis,甚至广播来实现的。这种注册中心的学习可以为我们后续的微服务以及分布式应用中常用的“注册中心”提供实现思路。再比如我们远程调用时,参数和信息的序列化。我们Java默认的序列化在性能上无法满足RPC这种高频序列化的应用场景。那么提高序列化性能的最佳方法是什么?你会发现Dubbo集成了kryo、hessian2、fastjson等支持,可以对比学习这些不同的序列化实现。当您在自己的业务场景中需要它时,您会在您的技能工具箱中找到另一个工具。类似的内容还有很多,学习这些可以让我们更好的成长。【本文为专栏作家“侯书城”原创稿件,转载请通过作者微信公众号“Tomcat物语”获得授权】点此查看本作者更多好文