当前位置: 首页 > news >正文

长春网站快照优化公司如何做网络营销推广唯选一 诺

长春网站快照优化公司,如何做网络营销推广唯选一 诺,响应式网站茶叶网站,wordpress 无法找到该页文章目录 什么是 RPCRPC 基本原理RPC核心功能服务寻址数据编解码网络传输一次RPC的调用过程 实践基于HTTP协议的RPC基于TCP协议的RPC 什么是 RPC RPC#xff08;Remote Procedure Call#xff09;#xff0c;即远程过程调用#xff0c;它允许像调用本地服务一样调用远程服… 文章目录 什么是 RPCRPC 基本原理RPC核心功能服务寻址数据编解码网络传输一次RPC的调用过程 实践基于HTTP协议的RPC基于TCP协议的RPC 什么是 RPC RPCRemote Procedure Call即远程过程调用它允许像调用本地服务一样调用远程服务。是一种服务器-客户端Client/Server模式。 远程指的是需要经过网络的而不是应用内部、机器内部进行的。过程也就是方法。 那“远程过程调用”就是可以跨过一段网络调用另外一个网络节点上的方法。以上就是对远程过程调用的简单理解。 RPC 调用分以下两种 同步调用客户方等待调用执行完成并返回结果。异步调用客户方调用后不用等待执行结果返回但依然可以通过回调通知等方式获取返回结果。 若客户方不关心调用返回结果则变成单向异步调用单向调用不用返回结果。 异步和同步的区分在于是否等待服务端执行完成并返回结果。 RPC 基本原理 RPC核心功能 知道什么是RPC以后就会发现RPC需要解决一些问题 既然是远程调用那么客户端如何知道服务端的地址如果客户端和服务端使用的是不同语言写的程序那么参数该如何表达和解析如何进行网络传输 这三个问题的解决方案也是RPC的核心功能服务寻址、数据编解码和网络传输。 服务寻址 如果是本地调用被调用的方法在同一个进程内操作系统或者是虚拟机可以去地址空间去找但是在远程调用中这是行不通的因为两个进程的地址空间是完全不一样的肯定也无法知道远端的进程在那。 如果要想实现远程调用我们需要对服务消费者和服务提供者两者进行约束在远程过程调用中所有的函数都必须有一个 ID这个 ID 在整套系统中是唯一存在确定的。服务消费者在做远程过程调用时发送的消息体中必须要携带这个 ID。服务消费者和服务提供者分别维护一个函数和 ID 的对应表。当服务消费者需要进行远程调用时它就查一下这个表找出对应的 ID然后把它传给服务端服务端也通过查表来确定客户端需要调用的函数然后执行相应函数的代码就行。 服务寻址的实现方式有很多种常见的是服务注册中心。要调用服务首先你需要一个服务注册中心去查询对方服务都有哪些实例然后根据负载均衡策略择优选一。 从服务提供者的角度看当提供者服务启动时需要自动向注册中心注册服务当提供者服务停止时需要向注册中心注销服务提供者需要定时向注册中心发送心跳。如果一段时间未收到来自提供者的心跳后注册中心会判定提供者已经停止服务并从注册中心下架对应的服务。从调用者的角度看:调用者启动时订阅注册中心的消息并从注册中心获取提供者的地址当有提供者上线或者下线时注册中心会告知到调用者;调用者下线时取消订阅。 数据编解码 对计算机网络稍微有一点熟悉的同学都知道数据在网络中传输都是二进制的01010101010101010类似这种只有二进制数据才能在网络间传。选择好的序列化协议特别重要一个好的序列化协议能减少序列化数据带来的性能损耗。常见的RPC序列化协议如下 XMLExtensible Markup Language是一种常用的序列化和反序列化协议具有跨机器跨语言等优点。狭义web service就是基于SOAP消息传递协议一个基于XML的可扩展消息信封格式来进行数据交换的。 JSONJavascript Object Notation起源于弱类型语言Javascript 是采用Attributevalue的方式来描述对象协议。与XML相比其协议比较简单解析速度比较快。 Protocol Buffers 是google提供的一个开源序列化框架是一种轻便高效的结构化数据存储格式可以用于结构化数据串行化或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。同 XML 相比 Protobuf 的主要优点在于性能高。它以高效的二进制方式存储比 XML 小 3 到 10 倍快 20 到 100 倍。 以上每种协议都有其优点和适用场景需要根据具体的需求和环境来选择合适的协议。 网络传输 提起网络传输大家脑海里肯定马上就能想到 TCP/IP四层模型、OSI 七层模型那通常 RPC 会选择那一层作为传输协议呢 在回答这个问题前先来看下 RPC 需要网络传输实现什么样的功能。客户端的数据经过序列化后就需要通过网络传输到服务端。网络传输层需要把前面说的函数 ID 和序列化后的参数字节流传给服务端服务端处理完然后再把序列化后的调用结果传回客户端。 原则上只要能实现上面这个功能的都可以作为传输层来使用具体协议没有限制。我们先来看下 TCP 协议TCP 连接可以是按需连接需要调用的时候就先建立连接调用结束后就立马断掉也可以是长连接客户端和服务器建立起连接之后保持长期持有不管此时有无数据包的发送可以配合心跳检测机制定期检测建立的连接是否存活有效。 由此可见 TCP 的性能确实很好因此市面上大部分 RPC 框架都使用 TCP 协议但也有少部分框架使用其他协议比如 gRPC 用的是 HTTP2 来实现。 一次RPC的调用过程 忽略服务端向注册中心注册服务的流程下面是客户端和服务端之间进行一次RPC调用的完整过程。 客户端Client通过本地调用的方式调用服务以接口方式调用客户端存根Client Stub接收到调用请求后负责将方法、入参等信息进行组装序列化成能够进行网络传输的消息体将消息体对象序列化为二进制流客户端存根Client Stub找到远程的服务地址并且将消息通过网络发送给服务端通过sockets发送消息服务端存根Server Stub收到消息后进行反序列化操作即解码将二进制流反序列化为消息对象服务端存根Server Stub通过解码结果调用本地的服务进行相关处理服务端Server将处理结果返回给服务端存根服务端存根Server Stub序列化处理结果将结果消息对象序列化为二进制流服务端存根Server Stub将序列化结果通过网络发送至客户端通过sockets发送消息客户端存根Server Stub接收到消息进行反序列化解码将结果二进制流反序列化为消息对象客户端得到最终的结果。 这里面有一个词语存根Stub。这里存根的作用我认为和Linux内核里面的库打桩机制有点类似。在Linux中一个桩stub就是一个程序或函数的临时替代品桩可以模拟出类似于真实的程序或函数的行为。所以在RPC中客户端存根和服务器存根的作用是隐藏RPC底层机制的复杂性让开发者可以像调用本地函数一样调用远程函数。 实践 基于HTTP协议的RPC 服务端代码 type Args struct {A, B int }type Compute intfunc (c *Compute) Add(args *Args, reply *int) error {*reply args.A args.Breturn nil }func main() {compute : new(Compute)rpc.HandleHTTP() // 注册 HTTP 路由// 注册 RPC 服务if err : rpc.Register(compute); err ! nil {log.Fatal(Register error:, err)}listen, err : net.Listen(tcp, :8080)if err ! nil {log.Fatal(Listen error:, err)}if err http.Serve(listen, nil); err ! nil {log.Fatal(Serve error:, err)} }rpc库对注册的方法有一定的限制方法必须满足签名func (t *T) MethodName(argType T1, replyType *T2) error{} 方法名必需是可导出的。方法接收两个参数这两个参数都是可导出的且第二个参数必需为指针类型。方法必需返回一个error类型的参数。 客户端代码 type Args struct {A, B int }func main() {client, err : rpc.DialHTTP(tcp, localhost:8080)if err ! nil {log.Fatal(dialing:, err)}args : Args{3, 5}// 同步调用var reply1 intif err client.Call(Compute.Add, args, reply1); err ! nil {log.Fatal(Compute error:, err)}fmt.Printf(同步调用的sum: %d\n, reply1)// 异步调用var reply2 intdivCall : client.Go(Compute.Add, args, reply2, nil)_ -divCall.Done // 接收调用结果fmt.Printf(异步调用的sum: %d\n, reply2) }运行结果如下 PS D:\GolandProjects\RPC\client go run .\client.go 同步调用的sum: 8 异步调用的sum: 8基于TCP协议的RPC 服务端代码 type Args struct {A, B int }type Compute intfunc (c *Compute) Add(args *Args, reply *int) error {*reply args.A args.Breturn nil }func main() {compute : new(Compute)if err : rpc.Register(compute); err ! nil {log.Fatal(Register error:, err)}listen, err : net.Listen(tcp, :8080)if err ! nil {log.Fatal(Listen error:, err)}rpc.Accept(listen) }客户端代码 type Args struct {A, B int }func main() {client, err : rpc.Dial(tcp, localhost:8080)if err ! nil {log.Fatal(dialing:, err)}args : Args{6, 8}// 同步调用var reply1 intif err client.Call(Compute.Add, args, reply1); err ! nil {log.Fatal(Compute error:, err)}fmt.Printf(同步调用的sum: %d\n, reply1)// 异步调用var reply2 intdivCall : client.Go(Compute.Add, args, reply2, nil)_ -divCall.Done // 接收调用结果fmt.Printf(异步调用的sum: %d\n, reply2) }运行结果 PS D:\GolandProjects\RPC\client go run .\client.go 同步调用的sum: 14 异步调用的sum: 14
http://www.hkea.cn/news/14327758/

相关文章:

  • 开的免费网站能赚钱吗广州前端培训机构
  • 免费注册com的网站菏泽建设集团
  • 南山建站公司瑞安网
  • 网站开发维护的好处wordpress 中文 字体大小
  • 石家庄网站制作报价虚拟主机建设二个网站
  • ps网站页面设计教程网站建好用电脑做服务器
  • 电子商务网站开发课程教案吉林大学建设工程学院网站
  • 网站 推广 工具网上注册公司需要哪些材料和流程
  • 嘉兴企业网站建设文字生成网址
  • 网站制作工作室制作平台微信网站推广
  • 学网站开发首先学哪些基础扬中市人才网官网
  • 门户网站属于什么类型的模式5 电子商务网站建设的步骤
  • 网站应急响应机制建设建设网站审批
  • 网站 建设 维护 公司网站建设销售工资多少
  • 广州越秀网站制作荣耀华为手机商城官方网站
  • 网站首页制作网站网站建设预算描述
  • 网站广告位一般多少钱网站项目建设管理
  • 建设五证在那个网站可以查您身边的网站建设顾问
  • 建站教程视频下载wordpress页面添加自定义字段
  • 广东城乡建设厅网站首页网站制作素材代码
  • 网络营销策略定义win10系统优化工具
  • 中国建设部网站能查叉车证建设模板网站报价
  • 网站视频链接怎么做网络公司经营范围有哪些类型
  • 建立企业网站的形式网站集约建设
  • 怎样用vs做简单网站wordpress淘宝客源码
  • 汕头模版网站建设织梦dedecms医院类网站在线预约挂号插件
  • 14版哥斯拉的官方做的宣传网站网站建设学习内容
  • 网站设计制作托管维护临桂建设局安全股网站
  • 古城做网站的公司太原手手工网站建设公司
  • 常州做网站哪家好emlog 迁移Wordpress