rpc如何调用服务器
Ⅰ UE4网络之(二) 远程调用函数(RPC)
所有示例使用第三人称模板创建的项目并带有初始资源StarterContent
Function Replicateion(简称RPC)是在本地调用但在其他机器上远程执行的函数。RPC可以实现客户端或服务器之间相互发送消息。RPC可以设置为Reliable或Unreliable,其中Reliable调用必定发生,而Unreliable调用可能会因为网络问题被丢弃。因此大多处理视觉效果的RPC应该设置为Unreliable来避免过多地占用网络。
RPC主要包括Multicast(广播)、Run On Server(在服务端执行)和Run On Owning Client(在客户端执行)三种类型。其中广播类型在服务器上调用执行,然后自动转发给客户端;在服务端执行的函数有客户端调用,然后仅在服务器执行。在客户端执行的函数由服务器调用,然后仅在自己的客户端上执行。
1、打开ThirdPersonBP/Blueprints中的ThirdPersonCharacter蓝图,添加一个按下空格时在玩家为之生成火焰特效的事件。蓝图非常简单直接上图。
2、更改Number of Players改为4后运行。
可以看到所有窗口只有自己按下空格时才铅辩能生成火焰特效并且只能看到自己的特效。
3、在ThirdPersonCharacter蓝图添加一个MulticasTest事件并将Replicates设置为Multicast,将蓝图改为如图所示。
4、点击Play运行。
看到服务器上生成的特效在所有客户端都能看到,而客户端生成的特效只有自己才能看到。
重复步骤3将Replicates分别改为Run On Server。此处直接上效果图。
此时不论谁按空格键槐伏缺,只有服务器上相应的角色可以生成特效,客户端并不能看到任何效果。如果想要厅嫌在客户端也能看到效果,我们需要确保特效设置为Replicates。
打开特效蓝图,并选中Replicates选项后重新开始运行。
1、打开ThirdPersonCharacter蓝图,创建一个String类型的变量Inventory并设置为Instance Editable和Replicated
2、添加按P键打印Inventory的事件蓝图。
3、在场景中添加一个Box Trigger
4、取消Rendering下面的Actor Hidden In Game
5、添加蓝图,重叠触发器时,如果重叠发生在服务器上,在服务器上运行 Add Item 事件,并将它复制到自己的客户端;当人物退出触发器盒时,在服务器上运行 Remove Item 事件,并将其复制到自己的客户端。其中Add Item 和 Remove Item 事件为自定义事件,并且Replicates属性全都为Run on owning Client。
6、编译运行。
可以看出刚开始启动时,每个角色打印的都为空,当一个角色进入触发器后会显示文本Item added ,按P时文本改为"has the item ",人物退出触发器会打印“Item Removed”,再次按P会打印空字符
Ⅱ rpc服务器不可用怎么解决
在服务器上运行 Dcpromo 时可能出现“RPC server is unavailable”错误。如果只有一台 DC,并且该 DC 的网卡上没有启键州用文件和打印机共享,则会发生此问穗握题。出现这种情况可以按照以下方法解决:
1、首先打开电脑的运行窗口,按下win+r即可打开,然后在里面我们输入services.msc。
(2)rpc如何调用服务器扩展阅读:
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用过程接收答复信息,获得进程结果,然后调用执行继续进行。
Ⅲ rpc服务器不可用怎么办
rpc服务器是一种远程的调用协议,对于需要使用远程服务的用户,比如远程打印等,禁止后就会出现颂老闷rpc服务器错误的提示。
rpc服务器不可用野弯解决办法如下:
工具/原料:matebook14、windows11、rpc服务器2022。
1、【win+R】键打开【运行】,输入“services.msc”。
Ⅳ 从 0 到 1:全面理解 RPC 远程调用
责编 | 胡巍巍
什么是RPC呢?网络给出的解释是这样的:“RPC(Remote Procere Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议”。
这个概念听起来还是比较抽象,没关系,继续往后看,后面概念性的东西,我会讲得足够清楚,让你完全掌握 RPC 的基础内容。
在 OpenStack 里的进程间通信方式主要有两种,一种是基于HTTP协议的RESTFul API方式,另一种则是RPC调用。
那么这两种方式在应用场景上有何区别呢?
有使用经验的人,就会知道:
首先,给你提两个问题,带着这两个问题再往下看:
1、RPC 和 REST 区别是什么?2、为什么要采用RPC呢?
首先,第一个问题:RPC 和 REST 区别是什么?
你一定会觉得这个问题很奇怪,是的,包括我,但是你在网络上一搜,会发现类似对比的文章比比皆是,我在想可能很多初学者由于基础不牢固,才会将不相干的二者拿出来对比吧。既然是这样,那为了让你更加了解陌生的RPC,就从你熟悉得不能再熟悉的 REST 入手吧。
01、所属类别不同
REST,是Representational State Transfer 的简写,中文描述表述性状态传递(是指某个瞬间状态的资源数据的快照,包括资源数据的内容、表述格式(XML、JSON)等信息。)
REST 是一种软件架构风格。这种风格的典型应用,就是HTTP。其因为简单、扩展性强的特点而广顷肢受开发者的青睐。
而RPC 呢,是 Remote Procere Call Protocol 的简写,中文描述是远程过程调用,它可以实现客户端像调用本地服务(方法)一样调用服务器的服务(方法)。
而 RPC 可以基于 TCP/UDP,也可以基于 HTTP 协议进行传输的,按理说它和REST不是一个层面意义上的东西,不应该放在一起讨论,但是谁让REST这么流行呢,它是目前最流行的一套互联网应用程序的API设计标准,某种意义下,我们说 REST 可以其实就是指代 HTTP 协议。
02、使用方式不同
03、面向对象不同
从设计上来看,RPC,所谓的远程过程调用 ,是面向方法的 ,REST:所谓的 Representational state transfer ,是面向资源的,除此之外,还有一种叫做 SOA,所谓的面向服务的架构,它是面向消息的,这个接触不多,就不多说了。
04、序列化协议不同
接口调用通常包含两个部分,序列化和通信协议。
通信协议,上面已经提及了,REST 是 基于 HTTP 协议,而 RPC 可以基于 TCP/UDP,也可以基于 HTTP 协议进行传输的。
常见的序列化协议,有:json、xml、hession、protobuf、thrift、text、bytes等,REST 通常使用的是 JSON或者XML,而 RPC 使用的是渣历 JSON-RPC,或者 XML-RPC。
通过以上几点,我们知道了 REST 和 RPC 之间有很明显的差异。
然后第二个问题:为什么要采用RPC呢?
那到底为何要使用 RPC,单纯的依靠RESTful API不可以吗?为什么要搞这么多复杂的协议,渣渣表示真的学不过来了。
关于这一点,以下几点仅是我的个人猜想,仅供交流哈:
说了这么多,我们该如何选择这两者呢?我总结了如下两点,供你参考:
“远程调用”意思就是:被调用方法的具体实现不在程序运行本地,而是在别的某个地方(分布到各个服务器),调用者只想要函数运算的结果,却不需要实现函数的具体细节。
光说不练嘴把式,接下来,我将分别用三种不同的方式全面地让你搞明白 rpc 远程调用是如何实现的。
01、基于 xml-rpc
Python实现 rpc,可以使用标准库里的 SimpleXMLRPCServer,它是基于XML-RPC 协议的。
有了这个模块,开如乎搜启一个 rpc server,就变得相当简单了。执行以下代码:
有了 rpc server,接下来就是 rpc client,由于我们上面使用的是 XML-RPC,所以 rpc clinet 需要使用xmlrpclib 这个库。
然后,我们通过 server_proxy 对象就可以远程调用之前的rpc server的函数了。
SimpleXMLRPCServer是一个单线程的服务器。这意味着,如果几个客户端同时发出多个请求,其它的请求就必须等待第一个请求完成以后才能继续。
若非要使用 SimpleXMLRPCServer 实现多线程并发,其实也不难。只要将代码改成如下即可。
02、基于json-rpc
SimpleXMLRPCServer 是基于 xml-rpc 实现的远程调用,上面我们也提到 除了 xml-rpc 之外,还有 json-rpc 协议。
那 python 如何实现基于 json-rpc 协议呢?
答案是很多,很多web框架其自身都自己实现了json-rpc,但我们要独立这些框架之外,要寻求一种较为干净的解决方案,我查找到的选择有两种
第一种是 jsonrpclib
第二种是 python-jsonrpc
先来看第一种 jsonrpclib
它与 Python 标准库的 SimpleXMLRPCServer 很类似(因为它的类名就叫做 SimpleJSONRPCServer ,不明真相的人真以为它们是亲兄弟)。或许可以说,jsonrpclib 就是仿照 SimpleXMLRPCServer 标准库来进行编写的。
它的导入与 SimpleXMLRPCServer 略有不同,因为SimpleJSONRPCServer分布在jsonrpclib库中。
服务端
客户端
再来看第二种python-jsonrpc,写起来貌似有些复杂。
服务端
客户端
调用过程如下
还记得上面我提到过的 zabbix API,因为我有接触过,所以也拎出来讲讲。zabbix API 也是基于 json-rpc 2.0协议实现的。
因为内容较多,这里只带大家打个,zabbix 是如何调用的:直接指明要调用 zabbix server 的哪个方法,要传给这个方法的参数有哪些。
03、基于 zerorpc
以上介绍的两种rpc远程调用方式,如果你足够细心,可以发现他们都是http+rpc 两种协议结合实现的。
接下来,我们要介绍的这种(zerorpc),就不再使用走 http 了。
zerorpc 这个第三方库,它是基于TCP协议、 ZeroMQ 和 MessagePack的,速度相对快,响应时间短,并发高。zerorpc 和 pyjsonrpc 一样,需要额外安装,虽然SimpleXMLRPCServer不需要额外安装,但是SimpleXMLRPCServer性能相对差一些。
调用过程如下
客户端除了可以使用zerorpc框架实现代码调用之外,它还支持使用“命令行”的方式调用。
客户端可以使用命令行,那服务端是不是也可以呢?
是的,通过 Github 上的文档几个 demo 可以体验到这个第三方库做真的是优秀。
比如我们可以用下面这个命令,创建一个rpc server,后面这个 time Python 标准库中的 time 模块,zerorpc 会将 time 注册绑定以供client调用。
经过了上面的学习,我们已经学会了如何使用多种方式实现rpc远程调用。
通过对比,zerorpc 可以说是脱颖而出,一支独秀。
为此,我也做了一番思考:
OpenStack 组件繁多,在一个较大的集群内部每个组件内部通过rpc通信频繁,如果都采用rpc直连调用的方式,连接数会非常地多,开销大,若有些 server 是单线程的模式,超时会非常的严重。
OpenStack 是复杂的分布式集群架构,会有多个 rpc server 同时工作,假设有 server01,server02,server03 三个server,当 rpc client 要发出rpc请求时,发给哪个好呢?这是问题一。
你可能会说轮循或者随机,这样对大家都公平。这样的话还会引出另一个问题,倘若请求刚好发到server01,而server01刚好不凑巧,可能由于机器或者其他因为导致服务没在工作,那这个rpc消息可就直接失败了呀。要知道做为一个集群,高可用是基本要求,如果出现刚刚那样的情况其实是很尴尬的。这是问题二。
集群有可能根据实际需要扩充节点数量,如果使用直接调用,耦合度太高,不利于部署和生产。这是问题三。
引入消息中间件,可以很好的解决这些问题。
解决问题一:消息只有一份,接收者由AMQP的负载算法决定,默认为在所有Receiver中均匀发送(round robin)。
解决问题二:有了消息中间件做缓冲站,client 可以任性随意的发,server 都挂掉了?没有关系,等 server 正常工作后,自己来消息中间件取就行了。
解决问题三:无论有多少节点,它们只要认识消息中间件这一个中介就足够了。
既然讲到了消息队列,如果你之前没有接触过这块内容,最好花几分钟的时间跟我好好过下关于消息队列的几个基础概念。
首先,RPC只是定义了一个通信接口,其底层的实现可以各不相同,可以是 socket,也可以是今天要讲的 AMQP。
AMQP(Advanced Message Queuing Protocol)是一种基于队列的可靠消息服务协议,作为一种通信协议,AMQP同样存在多个实现,如Apache Qpid,RabbitMQ等。
以下是 AMQP 中的几个必知的概念:
Publisher:消息发布者
Queue:用来保存消息的存储空间,消息没有被receiver前,保存在队列中。
Exchange:用来接收Publisher发出的消息,根据Routing key 转发消息到对应的Message Queue中,至于转到哪个队列里,这个路由算法又由exchange type决定的。
Exchange type:主要四种描述exchange的类型。
direct:消息路由到满足此条件的队列中(queue,可以有多个):routing key = binding key
topic:消息路由到满足此条件的队列中(queue,可以有多个):routing key 匹配 binding pattern. binding pattern是类似正则表达式的字符串,可以满足复杂的路由条件。
fanout:消息路由到多有绑定到该exchange的队列中。
binding :binding是用来描述exchange和queue之间的关系的概念,一个exchang可以绑定多个队列,这些关系由binding建立。前面说的binding key /binding pattern也是在binding中给出。
为了让你明白这几者的关系,我画了一张模型图。
关于AMQP,有几下几点值得注意:
前面铺垫了那么久,终于到了讲真实应用的场景。在生产中RPC是如何应用的呢?
其他模型我不太清楚,在 OpenStack 中的应用模型是这样的
至于为什么要如此设计,前面我已经给出了自己的观点。
接下来,就是源码解读 OpenStack ,看看其是如何通过rpc进行远程调用的。如若你对此没有兴趣(我知道很多人对此都没有兴趣,所以不浪费大家时间),可以直接跳过这一节,进入下一节。
目前Openstack中有两种RPC实现,一种是在oslo messaging,一种是在openstack.common.rpc。
openstack.common.rpc是旧的实现,oslo messaging是对openstack.common.rpc的重构。openstack.common.rpc在每个项目中都存在一份拷贝,oslo messaging即将这些公共代码抽取出来,形成一个新的项目。oslo messaging也对RPC API 进行了重新设计,对多种 transport 做了进一步封装,底层也是用到了kombu这个AMQP库。(注:Kombu 是Python中的messaging库。Kombu旨在通过为AMQ协议提供惯用的高级接口,使Python中的消息传递尽可能简单,并为常见的消息传递问题提供经过验证和测试的解决方案。)
关于oslo_messaging库,主要提供了两种独立的API:
因为 notify 实现是太简单了,所以这里我就不多说了,如果有人想要看这方面内容,可以收藏我的博客(http://python-online.cn) ,我会更新补充 notify 的内容。
OpenStack RPC 模块提供了 rpc.call,rpc.cast, rpc.fanout_cast 三种 RPC 调用方法,发送和接收 RPC 请求。
rpc.call 和 .rpc.cast 从实现代码上看,他们的区别很小,就是call调用时候会带有wait_for_reply=True参数,而cast不带。
要了解 rpc 的调用机制呢,首先要知道 oslo_messaging 的几个概念主要方法有四个:
transport:RPC功能的底层实现方法,这里是rabbitmq的消息队列的访问路径
transport 就是定义你如何访连接消息中间件,比如你使用的是 Rabbitmq,那在 nova.conf中应该有一行transport_url的配置,可以很清楚地看出指定了 rabbitmq 为消息中间件,并配置了连接rabbitmq的user,passwd,主机,端口。
target用来表述 RPC 服务器监听topic,server名称和server监听的exchange,是否广播fanout。
rpc server 要获取消息,需要定义target,就像一个门牌号一样。
rpc client 要发送消息,也需要有target,说明消息要发到哪去。
endpoints:是可供别人远程调用的对象
RPC服务器暴露出endpoint,每个 endpoint 包涵一系列的可被远程客户端通过 transport 调用的方法。直观理解,可以参考nova-conctor创建rpc server的代码,这边的endpoints就是 nova/manager.py:ConctorManager
dispatcher:分发器,这是 rpc server 才有的概念
只有通过它 server 端才知道接收到的rpc请求,要交给谁处理,怎么处理?
在client端,是这样指定要调用哪个方法的。
而在server端,是如何知道要执行这个方法的呢?这就是dispatcher 要干的事,它从 endpoint 里找到这个方法,然后执行,最后返回。
Serializer:在 python 对象和message(notification) 之间数据做序列化或是反序列化的基类。
主要方法有四个:
每个notification listener都和一个executor绑定,来控制收到的notification如何分配。默认情况下,使用的是blocking executor(具体特性参加executor一节)
模仿是一种很高效的学习方法,我这里根据 OpenStack 的调用方式,抽取出核心内容,写成一个简单的 demo,有对 OpenStack 感兴趣的可以了解一下,大部分人也可以直接跳过这章节。
注意以下代码不能直接运行,你还需要配置 rabbitmq 的连接方式,你可以写在配置文件中,通过 get_transport 从cfg.CONF 中读取,也可以直接将其写成url的格式做成参数,传给 get_transport 。而且还要nova或者其他openstack组件的环境中运行(因为需要有ctxt这个环境变量)
简单的 rpc client
简单的 rpc server
【End】
热 文 推 荐
☞Facebook 发币 Libra;谷歌十亿美金为穷人造房;第四代树莓派 Raspberry Pi 4 发布 | 开发者周刊
☞WebRTC 将一统实时音视频天下?
☞小米崔宝秋:小米 AIoT 深度拥抱开源
☞华为在美研发机构 Futurewei 意欲分家?
☞老司机教你如何写出没人敢维护的代码!
☞Python有哪些技术上的优点?比其他语言好在哪儿?
☞上不了北大“图灵”、清华“姚班”,AI专业还能去哪上?
☞公链史记 | 从鸿蒙初辟到万物生长的十年激荡……
☞边缘计算容器化是否有必要?
☞马云曾经偶像,终于把阿里留下的1400亿败光了!
你点的每个“在看”,我都认真当成了喜欢
Ⅳ rpc服务器不可用 如何修复Windows上的RPC服务器不可用错误
导致RPC错误的原因有很多。因此,每个问题也都有解决方案。尝试所有这些以摆脱它:
1、方法1.确保RCP服务正常工作。单击Win + R键以打开“ 运行”窗口。键入services.msc,然后单击Enter。在“ 服务”窗口中,找到DCOM Server Process Launcher, 远程过程调用(RPC)和RPC Endpoint Mapper。检查其状态是否设置为“正在运行”并将启动设置为“ 自动”。
2、方法2.检查Windows防火墙设置。修复“RPC服务器不可用”错误的另一种方法是检查防火墙是否不阻止RPC连接。为了搏世州检查Windows Defender防火墙是否存在任何问题,[2]请按照下列步骤操作:
打开“ 开始”,然后在搜索框中键入防火墙。从结果中打开Windows Defender防火墙。在Windows Defender防火墙中,单击 左窗格中的“ 通过Windows Defender防火墙允许应用程序或功能”选项。在允许的应用和功能列表中,找到远程协助并确保允许它。如果没有,请单击“ 更改设置”按钮并选中“ 私人和公共”复选框。单击“ 确定”以保存更改。
3、方法3.检查网络连接。
如果网络连接中断,则“RPC服务器不可用”错误可能也出现在屏幕上。要检查它,请按照以下步骤操作:单击Win + R键以打开“ 运行”对话返宴框。在“运行”对话框窗口中键入ncpa.cpl,然后单击“ 输入”。在“ 网络连接”基蔽窗口中,右键单击您使用的网络连接。从菜单中选择“ 属性 ”。检查是否启用了Microsoft网络和Internet协议版本6(TCP / IPv6)选项的文件 和打印机共享。如果没有,请勾选复选框。
Ⅵ SOFARPC源码解析-服务调用
简介摘要
SOFARPC服务调用创建服务引用配置ConsumerConfig,自定义设置接口名称、调用协议、直连调用地址以及连接超时时间等基础配置;通过服务消费者启动类ConsumerBootstrap引用服务,客户端集群Cluster调迹没用消费端调用器ConsumerInvoker实现Client发送数据给Server调用过程。
SOFARPC以基于Netty实现的网络通信框架SOFABolt用作远程通信框架,使用者不用关心如何实现私有协议的细节,直接使用内置RPC通信协议,启动客户端与服务端同时注册用户请求处理器即可完成远程调用:
1.调用方式
SOFARPC服务调用提供同步Sync、异步Future、回调Callback以及单向Oneway四种调用类型:
使用Future异步调用SOFABoot配置服务引用需要设置sofa:global-attrs元素的type属性声明调用方式为future:
如上设置为异步调用的方式。客户端获取响应结果有两种方式:
(1)通过 SofaResponseFuture直接获取结果。第一个参数是获取结果的超时时间,第二个参数表示是否清除线程上下文中的结果。
(2)获取原生Futrue,该种方姿基纳式获取JDK原生的Future,参数表示是否清除线程上下文中的结果。因为响应结果放在JDK原生的Future,需要通过JDK Future的get()方法获取响应结果。
当前线程发起调用得到RpcResponseFuture对象,当前线程可以继续执行下一次调用。在任意时刻使用RpcResponseFuture对象的get()方法来获取结果,如果响应已经回来此时就马上得到结果;如果响应没有回来则阻塞锋粗住当前线程直到响应回来或者超时时间到。
(3)Callback回调调用
客户端提前设置回调实现类,在发起调用后不会等待结果,是真正的异步调用,永远不会阻塞线程,结果处理是在异步线程里执行。SOFA-RPC在获取到服务端的接口后会自动执行该回调实现,目前支持 bolt 协议。客户端回调类需要实现com.alipay.sofa.rpc.core.invoke.SofaResponseCallback接口:
如上设置是服务级别的设置,也可以进行调用级别的设置:
使用Callback回调调用SOFABoot配置服务引用需要设置sofa:global-attrs元素的type属性声明调用方式为callback,通过callback-ref属性声明回调的实现类,使用该服务引用发起调用时结果返回时由SOFARPC自动执行该回调类:
当前线程发起调用则本次调用马上结束执行下一次调用。发起调用时需要注册回调,该回调需要分配异步线程池以待响应回来后在回调的异步线程池来执行回调逻辑。
(4)Oneway单向调用
客户端发送请求后不会等待服务端返回的结果,并且会忽略服务端的处理结果,目前支持bolt协议:
使用Oneway单向调用SOFABoot配置服务引用需要设置sofa:global-attrs元素的type属性声明调用方式为oneway:
当前线程发起调用后,不关心调用结果不做超时控制,只要请求已经发出就完成本次调用。单向调用不关心响应结果,请求线程不会被阻塞,使用Oneway调用需要注意控制调用节奏防止压垮接收方。注意Oneway调用不保证成功,而且发起方无法知道调用结果。因此通常用于可以重试,或者定时通知类的场景,调用过程是有可能因为网络问题、机器故障等原因导致请求失败,业务场景需要能接受这样的异常场景才能够使用。
2.直连调用
SOFARPC支持指定地址进行调用的场景,设置直连地址即可:
3.泛化调用
SOFARPC泛化调用方式能够在客户端不需要依赖服务端的接口情况下发起调用,目前支持bolt协议。由于不知道服务端的接口,因此需要通过字符串的方式将服务端的接口,调用的方法,参数及结果类进行描述:
如上通过setGeneric设置该服务为泛化服务,设置服务方的接口名。以GenericService作为泛化服务,通过GenericService能够发起泛化调用。发起调用时需要传入方法名、方法类型、方法参数。如果参数或者返回结果在客户端也需要泛化表示则通过GenericObject来实现获取序列化结果等:
(1)接口描述:所有泛化调用都需要在服务引用的时候声明interface为com.alipay.sofa.rpc.api.GenericService,这是SOFARPC提供的类。真正的服务接口通过sofa:global-attrs元素的generic-interface属性声明完成接口的描述。
(2)参数描述:由于客户端没有调用服务的参数类,因此通过GenericObject进行描述,GenericObject持有Map<String, Object>类型的变量,能够通过GenericObject提供的对该变量的操作方法将参数类的属性放到Map以此来描述参数类。
(3)发起泛化调用:接口描述通过XML配置声明泛化引用的bean,通过该泛化引用能够发起服务调用,发起泛化调用的第一个参数就是方法名,第二个参数就是参数类的全类名,第三个参数就是描述参数类的 GenericObject。
(4)获取泛化结果:发起泛化调用如果客户端同样没有泛化结果的类,那么同样以GenericObject对调用结果进行描述,通过GenericObject的getField方法能够获取结果类的属性值,通过GenericObject的getType方法能够获取结果类的全类名。
(5)泛化调用示例:SOFARPC泛化调用完整的泛化调用方式:
源码解析
1.调用方式
参考sofa-rpc-boot-projects范例模块( com.alipay.sofa.rpc.samples.invoke ):
运行调用方式服务端范例类InvokeServerApplication查看调用方式服务端输出日志: