rpc详解rpc框架
文章目录
- 概述
- rpc的优点
- 组件
- 工作流程&RPC的底层原理
- RPC的底层原理
- RPC框架
- rpc框架优点
- RPC 的实现基础
- RPC的应用场景
- RPC使用了哪些关键技术
- rpc 调用异常一般怎么处理
- rpc和http的区别
- 为什么RPC要比HTTP更快一些
- Dubbo和openfeign 区别
- 远程调用
- RPC框架传输协议传输速度
概述
在互联网应用开发中,随着业务的复杂度增加,一般都会采用分布式架构。分布式架构的核心,就是利用多台普通的计算机组成一个庞大的复杂计算网络,提供高并发、高性能、高可用的系统能力支撑。在分布式架构中,原本的单体应用服务被拆分成多个独立部署的服务,分布式在计算机网络上,这些服务必然,需要通过网络进行数据通信和交互。而RPC框架,就是解决在分布式架构中,各个服务之间的网络通信问题的框架。在Java应用中,JDK 1.1版本的时候就提供了对RPC的支持框架,叫做RMI。由于RMI不能实现跨域语言的远程调用。后面,广发采用WebService来实现远程调用,但是,WebService需要定义非常复杂的Scheme文件,导致无效数据内容过于臃肿。之后,就被HTTP加JSON的方案所代替了。
RPC发展到现在,实现的方式也非常多样,但是基本都实现了跨语言的远程调用。一般来说,RPC框架都应用于大型企业,只有在业务复杂度和用户体量都比较大的时候,需要对服务进行解耦,从而达到扩展性强、部署灵活的目的。目前比较流行的开源RPC框架有Goole的gRPC、Facebook的Thrift、Alibaba的Dubbo。这些框架除了提供基础的远程通信功能以外,还会在系统性能、传输效率、服务治理等方面做出一些优化设计。比如,阿里开源的RPC框架Dubbo就提供了非常丰富的服务治理功能。
RPC(远程过程调用)是一种计算机通信协议,用于在不同的进程或者计算机之间实现远程通信,使得一个进程可以调用另一个进程(通常是运行在不同机器上)的函数或方法,就像调用本地函数一样。
rpc的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的。为实现该目标,rpc框架器提供一种透明调用机制,让使用者不必是式的区分本地调用和远程调用。
基本原理:
- 客户端调用: 客户端调用远程服务的方法,就像调用本地函数一样,传递参数并等待结果。
- 远程过程执行: 远程过程在远程服务器上执行,接收客户端发送的参数,执行相应的计算或操作。
- 结果返回: 执行完成后,远程过程将结果返回给客户端。
rpc的优点
分布式设计
部署灵活
解耦服务
扩展性强
组件
- 客户端(Client): 发起RPC调用的应用程序部分。
- 服务端(Server): 提供RPC服务的应用程序部分。
- RPC协议(Protocol): 定义了客户端和服务端之间通信的规则、格式和消息交换方式。
- 序列化/反序列化(Serialization/Deserialization): 将数据结构或对象转换成字节流以便在网络上传输,并在接收端重新构造成相应的数据结构或对象。
- 网络传输(Network Transport): 用于在客户端和服务端之间传输数据的通信机制,通常使用TCP/IP或者HTTP等协议。
工作流程&RPC的底层原理

- 客户端调用: 客户端调用本地的Stub(存根)方法,传递参数。
- 参数序列化: 客户端将参数序列化成字节流。
- 网络传输: 序列化后的数据通过网络传输到远程服务端。
- 服务端接收: 远程服务端接收到请求,进行反序列化得到参数。
- 服务端处理: 服务端执行相应的方法或过程,传入参数,执行计算或操作。
- 结果序列化: 服务端将执行结果序列化成字节流。
- 网络传输: 序列化后的结果通过网络传输到客户端。
- 客户端接收: 客户端接收到结果,进行反序列化得到返回值。
- 客户端处理: 客户端处理返回值,完成RPC调用。
RPC的底层原理
RPC(Remote Procedure Call,远程过程调用)是一种用于在不同的计算机之间进行通信的技术,允许一个程序调用另一个程序中的函数或方法,就像调用本地函数一样,而无需程序员显式地编写通信代码。RPC的底层原理涉及通信协议、序列化和反序列化、网络传输、服务注册与发现等方面。
下面是RPC的一般工作原理:
- 定义接口: RPC的第一步是定义客户端和服务端之间通信的接口。这些接口中包含需要在远程服务器上调用的方法。
- 序列化: 当客户端调用远程方法时,客户端程序将方法的参数序列化为字节流。序列化是将对象转换为字节流的过程,以便在网络上传输。
- 网络传输: 序列化后的请求被传输到远程服务器,这通常通过网络协议(如HTTP、TCP等)实现。
- 反序列化: 一旦请求到达远程服务器,服务器程序将接收到的字节流反序列化为方法调用所需的参数。
- 调用远程方法: 远程服务器根据反序列化后的参数调用相应的方法或函数。
- 序列化结果: 服务器程序将方法执行的结果序列化为字节流。
- 网络传输结果: 序列化后的结果通过网络传输回客户端。
- 反序列化结果: 客户端程序接收到结果后,将结果字节流反序列化为方法调用的返回值。
- 返回结果: 最终,客户端程序将调用远程方法的返回值返回给调用方。
在实际的RPC实现中,还可能涉及到一些额外的步骤,如:
● 服务注册与发现: RPC框架通常会提供服务注册与发现的功能,允许服务提供者将其提供的服务注册到注册中心,并允许服务消费者从注册中心获取可用的服务地址。
● 负载均衡与容错: RPC框架通常还包括负载均衡和容错机制,以确保请求能够被均匀分布到不同的服务节点,并在某些节点发生故障时能够进行故障转移或重试。
● 连接管理: RPC框架通常会管理与远程服务之间的连接,包括连接的建立、保持和释放等。
总的来说,RPC的底层原理涉及到将方法调用的参数序列化、通过网络传输、反序列化、调用远程方法、序列化结果、再次通过网络传输、反序列化结果的过程。各种RPC框架会根据具体需求和场景进行优化和扩展。
RPC框架
RPC(Remote Procedure Call)框架是一种用于实现远程调用的技术,它可以让不同的进程或计算机之间通过网络进行通信和调用远程方法。以下是一些常见的 RPC 框架:
- Dubbo:阿里开源的高性能 Java RPC 框架,提供了完整的服务治理功能,支持多种协议和序列化方式。 Dubbo是 阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服 务的输出和输入功能,可以和 Spring框架无缝集成。提供了丰富的特性,包括负载均衡、服务注册与发现、容错处理等,广泛应用于大型分布式系统中
- gRPC:Google 开源的跨语言 RPC 框架,基于 HTTP/2 协议和 Protocol Buffers,性能高效,它支持多种编程语言,如C、C++、Java、Go、Python等,适用于跨语言的服务通信
- Thrift:Facebook 开源的跨语言 RPC 框架,支持多种语言和数据格式,性能优秀,包括C++、Java、Python等,适用于异构系统的集成
- Spring Cloud:基于 Spring Boot 的微服务架构框架,提供了丰富的分布式系统解决方案,包括 RPC 调用,提供了对RPC调用的支持,通过集成Ribbon、Feign等组件实现服务之间的远程调用
- Apache Avro:Apache 开源的跨语言数据序列化系统,同时也支持 RPC 框架。
- Apache Dubbo:原名 Apache Dubbox,是一款高性能 Java RPC 框架,提供了完善的服务治理功能。
- Apache Thrift:Apache 开源的跨语言 RPC 框架,支持多种语言,包括 C++, Java, Python 等。
- ZeroC ICE:一种面向对象的跨语言通信框架,适用于构建大规模分布式系统。基于对象代理的RPC框架,支持C++、Java、Python等多种语言,适用于大规模分布式系统的构建。
这些RPC框架在不同的场景和需求下有着各自的优势和特点,选择适合自己业务需求的RPC框架是非常重要的。每种框架都有其独特的特性和适用范围,因此在选择时需要综合考虑技术栈、性能需求、跨语言支持等因素,这些都是比较流行的 RPC 框架,每个框架都有其独特的特点和适用场景。选择合适的 RPC 框架取决于具体的需求、技术栈和团队经验。
1、RMI
利用java.rmi包实现,基于Java远程方法协议(Java Remote Method Protocol) 和java的原生序列 化。
2、Hessian
是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 基于HTTP协议,采 用二进制编解码。
3、protobuf-rpc-pro
是一个Java类库,提供了基于 Google 的 Protocol Buffffers 协议的远程方法调用的框架。基于
Netty 底层的 NIO 技术。支持 TCP 重用/ keep-alive、SSL加密、RPC 调用取消操作、嵌入式日志 等功能。
4、Thrift
是一种可伸缩的跨语言服务的软件框架。它拥有功能强大的代码生成引擎,无缝地支持C + +,
C#,Java,Python和PHP和Ruby。thrift允许你定义一个描述文件,描述数据类型和服务接口。
依据该文件,编译器方便地生成RPC客户端和服务器通信代码。
最初由facebook开发用做系统内个语言之间的RPC通信,2007年由facebook贡献到apache基金 ,现 在是apache下的opensource之一 。支持多种语言之间的RPC方式的通信:php语言client可以构造一 个对象,调用相应的服务方法来调用java语言的服务,跨越语言的C/S RPC调用。底层通讯基于 SOCKET
5、Avro
出自Hadoop之父Doug Cutting, 在Thrift已经相当流行的情况下推出Avro的目标不仅是提供一套类 似Thrift的通讯中间件,更是要建立一个新的,标准性的云计算的数据交换和存储的Protocol。支持 HTTP,TCP两种协议。Apache Avro:一个数据序列化系统,也提供了RPC框架的支持,具有快速、紧凑的特点,支持多种编程语言。
rpc框架优点
rpc框架一般使用长链接,不必每次通信都要3次握手,减少网络开销。
rpc框架一般都有注册中心,有丰富的监控管理,发布,下线接口,动态扩展等,对调用方来说是无感知,统一化的操作,协议私密,安全性较高
rpc协议更简单内容更小,效率更高,服务化架构,服务化治理,rpc框架是一个强力的支撑。
rpc基于tcp实现,也可以基于http2实现
- 简化远程调用:RPC 框架可以使远程服务的调用过程像本地调用一样简单,隐藏了底层网络通信细节,提供了更高层次的抽象。
- 跨语言支持:许多 RPC 框架支持跨多种编程语言进行通信,这使得不同语言编写的服务可以轻松地相互调用。
- 性能高效:RPC 框架通常针对高性能进行优化,能够在网络通信中提供低延迟和高吞吐量。
- 服务治理:许多 RPC 框架提供了完善的服务注册、发现、负载均衡、容错处理等服务治理功能,帮助管理和监控分布式系统中的服务。
- 扩展性:RPC 框架通常具有良好的扩展性,能够满足不断变化的业务需求和规模扩展。
- 代码生成:许多 RPC 框架支持自动生成客户端和服务端的代码,减少了开发人员的工作量。
- 安全性:RPC 框架通常提供了安全机制,包括数据传输加密、身份认证和授权等功能。
- 透明性:RPC 框架可以提供透明的远程调用,使得调用方无需关心调用的具体实现细节,从而降低了系统的耦合度。
总的来说,RPC 框架可以帮助开发人员构建可靠、高效、易于管理的分布式系统,使得不同服务之间的通信变得更加简单和可靠。
RPC 的实现基础
需要有非常高效的网络通信,比如一般选择 Netty 作为网络通信框架;
需要有比较高效的序列化框架,比如谷歌的 Protobuf 序列化框架;
可靠的寻址方式(主要是提供服务的发现),比如可以使用 Zookeeper 来注册服务等;
如果是带会话(状态)的 RPC 调用,还需要有会话和状态保持的功能;
跨进程,可以理解为同一台计算上的多个进程、多个JVM或者多台计算之间的进程。
那什么是RPC呢?RPC的全称是Remote Procedure Call,翻译过来叫远程过程调用。
它是一种通过网络从远程计算机程序上获取服务,而不需要了解代码网络技术实现的一种协议。凡是符合这种协议的框架,都可以称之为RPC框架。
通俗理解就是,A计算机提供一个服务,B计算机可以像调用本地服务一样去调用A计算机提供的服务,这就是RPC的主要作用。
其实,RPC的应用在很早之前就出现了。在40年以前,也就是1981年的时候,由一家叫做Nelson的公司提出,并把它应用到了分布式系统之间的通信协议。
RPC协议
要实现RPC,需要通过网络进行数据传输,并且对调用的过程进行封装。现在比较流行的RPC框架一般都是采用TCP协议作为底层的传输协议。当然,其他协议也是可以的,比如UDP。
RPC协议,强调的是过程调用,调用的过程对于用户来说是完全透明的,用户不需要关心调用细节。可以像调用本地服务一样去调用远程服务。
一个完整的RPC协议包含了四个组件,分别是Client、Server、Client Stub和Sever Stub。
Client客户端表示服务的调用方;
Sever服务端是真正的服务提供方;
Client Stub表示客户端存根,专门用来存放服务端的地址信息,再将客户端的请求参数打包成网络消息,也就是序列化,然后通过网络远程发送给服务提供方。
Server Stub表示服务端存根,用来接收客户端发送过来的消息,然后,解析消息内容,也就是反序列化,并且调用本地方法。
RPC的应用场景
1、分布式系统网络通讯
2、分布式子系统之间的服务治理
3、分布式负载均衡和流控
4、服务发现与注册
5、构建分布式调试环境
RPC使用了哪些关键技术
1、动态代理
生成Client Stub(客户端存根)和Server Stub(服务端存根)的时候需要用到Java动态代理技术,可
以使用JDK提供的原生的动态代理机制,也可以使用开源的:CGLib代理,Javassist字节码生成技术。
2、序列化和反序列化
在网络中,所有的数据都将会被转化为字节进行传送,所以为了能够使参数对象在网络中进行传输,需
要对这些参数进行序列化和反序列化操作。
序列化:把对象转换为字节序列的过程称为对象的序列化,也就是编码的过程。反序列化:把字节
序列恢复为对象的过程称为对象的反序列化,也就是解码的过程。 目前比较高效的开源序列化框架:如Kryo、FastJson和Protobuf等。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化,也就是解码的过程。 目前比较高
效的开源序列化框架:如Kryo、FastJson和Protobuf等。
3、NIO通信
出于并发性能的考虑,传统的阻塞式 IO 显然不太合适,因此我们需要异步的 IO,即 NIO。Java 提供 了 NIO 的解决方案,Java 7 也提供了更优秀的 NIO.2 支持。可以选择Netty或者MINA来解决NIO数据传输的问题。
4、服务注册中心
可选:Redis、Zookeeper、Consul 、Etcd。一般使用ZooKeeper提供服务注册与发现功能,解决单 点故障以及分布式部署的问题(注册中心)。
rpc 调用异常一般怎么处理
一般超时容错 、重试、超时处理、
处理远程过程调用(RPC)异常的方法取决于您使用的RPC框架和编程语言。一般来说,以下是一些处理RPC调用异常的常见方法:
- 捕获异常:在进行RPC调用时,使用try-catch语句捕获可能抛出的异常。这样可以在异常发生时捕获并处理异常情况。
- 重试机制:对于临时性的网络问题或服务端问题,可以考虑实现重试机制,当RPC调用失败时,自动尝试再次调用,直至达到最大重试次数或成功为止。
- 超时处理:设置合理的超时时间,并在超时发生时进行适当的处理,比如记录日志、返回错误信息或者进行重试。
- 回退策略:当发生异常时,可以考虑采用回退策略,例如切换到备用服务或者采用备用数据源。
- 错误信息传递:在捕获异常后,将错误信息传递给调用方,以便上层代码能够根据具体情况做出相应的处理。
- 断路器模式:引入断路器模式,当RPC调用失败次数达到一定阈值时,暂时关闭对该服务的访问,避免连锁故障。
- 监控和日志:建立完善的监控和日志系统,及时发现RPC调用异常,从而进行故障排查和修复。
以上方法并非孤立的,通常会结合多种方法来处理RPC调用异常,以实现系统的稳定性和容错能力。同时,针对不同的业务场景和需求,可能需要进一步细化和定制化异常处理策略。
处理Feign RPC调用异常时,可以采取以下常见策略: - 使用Feign的ErrorDecoder:Feign提供了ErrorDecoder接口,可以自定义处理HTTP错误状态码和异常信息。通过实现ErrorDecoder接口,可以对Feign调用返回的异常进行统一处理,例如将异常信息转换成特定格式并返回给调用方。
- 定义Fallback方法:在Feign接口中可以定义fallback方法,当RPC调用出现异常时,可以执行fallback方法来返回一个默认值或者进行其他补偿性操作,避免将异常抛给调用方。
- 超时处理:在Feign客户端接口中可以设置连接和读取超时时间,以及对应的超时处理策略,如重试、降级等。
- 熔断机制:对于频繁出现异常或错误的RPC调用,可以引入熔断机制,防止故障扩散,这可以通过Hystrix等框架来实现。
- 监控和日志:建立完善的监控和日志系统,及时发现RPC调用异常,从而进行故障排查和修复。Feign本身并不提供监控和管理功能,通常需要结合其他监控系统进行监控。
- 全局异常处理器:在应用程序中可以编写全局异常处理器来捕获Feign调用产生的异常,然后进行统一的异常处理和记录日志。
综合利用上述策略,可以有效地处理Feign RPC调用过程中可能出现的异常,提高系统的稳定性和容错能力。同时,根据具体业务需求,还可以进一步细化和定制化异常处理策略。
rpc和http的区别
传输协议
RPC,可以基于TCP协议,也可以基于HTTP协议
HTTP,基于HTTP协议传输效率
RPC,使用自定义的TCP协议,可以让请求报文体积更小,或者使用HTTP2协议,也可以很好的减少报文的体积,提高传输效率
HTTP,如果是基于HTTP1.1的协议,请求中会包含很多无用的内容,如果是基于HTTP2.0,那么简单的封装以下是可以作为⼀个RPC来使用的,这时标准RPC框架更多的是服务治理
性能消耗,主要在于序列化和反序列化的耗时
RPC,可以基于thrift实现高效的二进制传输
HTTP,大部分是通过json来实现的,字节大小和序列化耗时都比thrift要更消耗性能
负载均衡
RPC,基本都自带了负载均衡策略
HTTP,需要配置Nginx,HAProxy来实现
服务治理(下游服务新增,重启,下线时如何不影响上游调用者)
RPC,能做到自动动通知,不影响上游
HTTP,需要事先通知,修改Nginx/HAProxy配 置
b. 总结:RPC主要⽤于公司内部的服务调用,性能消耗低,传输效率高,服务治理方便。HTTP主要⽤于对外的异构环境,浏览器接口调用,APP接口调用,第三方接口调用等。
为什么RPC要比HTTP更快一些
RPC(Remote Procedure Call)相比于HTTP在一些情况下可能更快,这主要是由于以下几个原因:
- 二进制传输协议:RPC框架通常使用二进制传输协议,如Protocol Buffers、Thrift等,而HTTP使用文本传输协议,如JSON、XML。二进制传输协议的数据体积更小,序列化和反序列化的速度更快,可以减少网络传输的时间和带宽消耗。
- 定制化协议:RPC框架通常可以定制自己的通信协议,针对特定的场景进行优化,如连接复用、请求批处理、压缩等。相比之下,HTTP是通用的应用层协议,有一定的通用性,但不一定能满足特定场景的需求。
- 底层传输协议:RPC框架通常使用TCP或UDP等底层传输协议进行通信,而HTTP基于TCP协议。TCP相较于HTTP具有更低的开销和更高的效率,能够提供更快的数据传输速度。
- 连接管理:RPC框架通常会维护长连接,避免频繁地建立和关闭连接,减少了连接建立和关闭的开销。而HTTP每次请求都需要建立连接,增加了额外的开销。
虽然RPC在性能上可能会比HTTP更快,但也要考虑到RPC框架的复杂性和学习成本较高,以及对网络环境和部署的要求较高。在选择RPC还是HTTP时,需要根据具体的应用场景和需求来权衡两者之间的优劣,并选择合适的技术方案。
Dubbo和openfeign 区别
Dubbo 和 OpenFeign 是两种常用的远程服务调用框架,它们在实现远程服务调用时有一些不同之处:
- 通信协议:
○ Dubbo 通常使用自定义的 Dubbo 协议进行远程调用,该协议基于 TCP 传输。
○ OpenFeign 则是基于 HTTP 协议进行远程调用,通常使用 RESTful 风格的 API。 - 服务注册与发现:
○ Dubbo 依赖于 ZooKeeper 或其他注册中心来进行服务的注册和发现。
○ OpenFeign 在默认情况下通常与服务发现和注册无关,需要额外集成服务发现组件(如 Eureka、Consul 等)来实现服务的注册和发现。 - 接口定义方式:
○ 在 Dubbo 中,通常需要通过 Dubbo 提供的接口定义语言(IDL)来定义服务接口,然后生成客户端和服务器端的代理类。
○ OpenFeign 则通常使用接口的方式来定义远程服务,通过注解来标识远程服务的调用方式。 - 负载均衡和容错机制:
○ Dubbo 内置了丰富的负载均衡和容错机制,包括轮询、随机、一致性哈希等负载均衡算法,以及失败自动切换、快速失败等容错机制。
○ OpenFeign 在默认情况下通常需要结合 Ribbon 来实现负载均衡,同时也可以集成 Hystrix 等容错机制。 - 附加功能:
○ Dubbo 提供了更多的企业级功能支持,如监控、治理、降级、熔断等,适用于复杂的微服务架构。
○ OpenFeign 更侧重于简化 REST 客户端的开发,提供了更直观的声明式 API 定义和使用。
总的来说,Dubbo 更适用于企业级的微服务架构,提供了更多的功能和配置选项;而 OpenFeign 更适合于简单的 RESTful 服务调用,提供了更便捷的声明式 API 调用方式。选择使用哪种框架取决于具体的业务需求和技术场景。
远程调用
rmi
http
hessian
webservice
socket
网络通信
负载均衡
注册中心
远程通讯协议的基本原理
网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络 IO 来实现,其中传输协议比较出名的有 http 、 tcp 、 udp 等等, http 、 tcp 、 udp 都是在基于 Socket 概念上为某类应用场景而扩展出的传输协议,网络 IO ,主要有 bio 、 nio 、 aio 三种方式,所有的分布式应用通讯都基于这个原理而实现,只是为了应用的易用,各种语言通常都会提供一些更为贴近应用易用的应用层协议。
应用级协议Binary-RPC
Binary-RPC(Remote Procedure Call Protocol,远程过程调用协议)是一种和RMI(Remote Method Invocation,远程方法调用)类似的远程调用的协议,它和RMI 的不同之处在于它以标准的二进制格式来定义请求的信息 ( 请求的对象、方法、参数等 ) ,这样的好处是什么呢,就是在跨语言通讯的时候也可以使用。
Binary -RPC 协议的一次远程通信过程:
1 、客户端发起请求,按照 Binary -RPC 协议将请求信息进行填充;
2 、填充完毕后将二进制格式文件转化为流,通过传输协议进行传输;
3 、接收到在接收到流后转换为二进制格式文件,按照 Binary -RPC 协议获取请求的信息并进行处理;
4 、处理完毕后将结果按照 Binary -RPC 协议写入二进制格式文件中并返回。
问题总结:
1 、传输的标准格式是:标准格式的二进制文件。
2 、怎么样将请求转化为传输的流?将二进制格式文件转化为流。
3 、怎么接收和处理流?通过监听的端口获取到请求的流,转化为二进制文件,根据协议获取请求的信息,进行处理并将结果写入 XML 中返回。
4 、传输协议是?http
RPC框架传输协议传输速度
RMI 是 java 语言本身提供的远程通讯协议,稳定高效,是 EJB 的基础。但它只能用于 JAVA 程序之间的通讯。
Hessian 和 Burlap 是 caucho 公司提供的开源协议,基于 HTTP 传输,服务端不用开防火墙端口。协议的规范公开,可以用于任意语言。跨平台有点小问题。
Httpinvoker 是 SpringFramework 提供的远程通讯协议,只能用于 JAVA 程序间的通讯,且服务端和客户端必须使用 SpringFramework。
Web service 是连接异构系统或异构语言的首选协议,它使用 SOAP 形式通讯,可以用于任何语言,目前的许多开发工具对其的支持也很好。
效率相比:RMI > Httpinvoker >= Hessian >> Burlap >> web service。
RMI (Remote Method Invocation)
RMI 采用 stubs 和 skeletons 来进行远程对象(remote object)的通讯。stub 充当
远程对象的客户端代理,有着和远程对象相同的远程接口,远程对象的调用实际是通过调用
该对象的客户端代理对象stub来完成的,通过该机制RMI就好比它是本地工作,采用tcp/ip
协议,客户端直接调用服务端上的一些方法。优点是强类型,编译期可检查错误,缺点是只
能基于 JAVA 语言,客户机与服务器紧耦合。
JMS(Java Messaging Service)
JMS 是 Java 的消息服务,JMS 的客户端之间可以通过 JMS 服务进行异步的消息传输。
JMS 支持两种消息模型:Point-to-Point(P2P)和 Publish/Subscribe(Pub/Sub),即
点对点和发布订阅模型。
相关文章:
rpc详解rpc框架
文章目录 概述rpc的优点组件工作流程&RPC的底层原理RPC的底层原理 RPC框架rpc框架优点RPC 的实现基础RPC的应用场景RPC使用了哪些关键技术rpc 调用异常一般怎么处理rpc和http的区别为什么RPC要比HTTP更快一些Dubbo和openfeign 区别远程调用RPC框架传输协议传输速度 概述 在…...
【评分标准】【网络系统管理】2019年全国职业技能大赛高职组计算机网络应用赛项H卷 无线网络勘测设计
第一部分:无线网络勘测设计评分标准 序号评分项评分细项评分点说明评分方式分值1点位设计图AP编号AP编号符合“AP型号位置编号”完全匹配5AP型号独立办公室、小型会议室选用WALL AP110完全匹配5员工寝室选用智分,其他用放装完全匹配5其它区域选用放装AP…...
停止docker 容器并删除对应镜像
docker 容器相关命令 docker ps 查看当前系统正在运行的容器情况,返回信息分别为: 容器ID:CONTAINER ID 镜像名IMAGE NAMES 运行命令COMMAND 创建时间CREATED 状态STATUS 映射端口 PORTS docker ps |grep XXX 可以…...
什么是服务器,有什么特性?
服务器是一种高性能计算机,作为网络的节点,存储、处理网络上80%的数据、信息,服务器作用比较广,网络游戏、网站、部分软件都是需要存到服务器的,还有一些企业会配服务器。今天,德迅云安全带您来…...
【Django】CORS跨域问题
通过 django-cors-headers 库来实现,此方法亲测有效 1、下载 pip install django-cors-headers2、修改 settings.py 配置文件 1)添加到应用列表 INSTALLED_APPS (##...corsheaders )2)添加到中间件列表 MIDDLEWARE [django.middleware.…...
npm 常用命令详解
npm,即 Node Package Manager,是 Node.js 的包管理器。它允许你安装、更新、删除和管理 Node.js 项目中的依赖包。在 Node.js 开发中,npm 的使用频率极高,掌握其常用命令对于开发者来说是至关重要的。本文将详细解释 npm 的常用命…...
外包干了14天,技术退步明显。。。
先说一下自己的情况,本科生,2019年我通过校招踏入了成都一家软件公司,开始了我的职业生涯。那时的我,满怀热血和憧憬,期待着在这个行业中闯出一片天地。然而,随着时间的推移,我发现自己逐渐陷入…...
RequestResponse使用
文章目录 一、Request&Response介绍二、Request 继承体系三、Request 获取请求数据1、获取请求数据方法(1)、请求行(2)、请求头(3)、请求体 2、通过方式获取请求参数3、IDEA模板创建Servlet4、请求参数…...
知名的CDN厂商CloudFlare简介
Cloudflare是一家总部位于美国的跨国科技公司,提供云端安全、性能优化以及内容交付网络(CDN)服务。通过其全球分布的服务器网络,Cloudflare帮助网站提高加载速度、保护免受恶意攻击,并提供安全可靠的云端解决方案。除此…...
C语言程序设计-谭浩强
文章目录 1 C语言2 算法3 顺序程序设计3.1 数据的表示形式3.2 输入和输出 4 选择程序结构5 循环程序结构6 数组7 函数模块化8 指针8.1 动态内存分配 9 结构类型9.1 链表9.2 共用体 union9.3 枚举 enum9.4 typedef 10 对文件的输入输出10.1 顺序读写10.2 随机读写 1 C语言 1.1 …...
将OpenCV与gdb驱动的IDE结合使用
返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV4.9.0开源计算机视觉库在 Linux 中安装 下一篇:将OpenCV与gcc和CMake结合使用 能力 这个漂亮的打印机可以显示元素类型、、标志is_continuous和is_subm…...
Java毕业设计-基于springboot开发的Java时间管理系统-毕业论文+答辩PPT(附源代码+演示视频)
文章目录 前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、管理员功能模块2、用户功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发的Java时间管理系统-毕业论文答…...
AI原生安全 亚信安全首个“人工智能安全实用手册”开放阅览
不断涌现的AI技术新应用和大模型技术革新,让我们感叹从没有像今天这样,离人工智能的未来如此之近。 追逐AI原生?企业组织基于并利用大模型技术探索和开发AI应用的无限可能,迎接生产与业务模式的全面的革新。 我们更应关心AI安全原…...
Vue3 大量赋值导致reactive响应丢失问题
问题阐述 如上图所示,我定义了响应式对象arrreactive({data:[]}),尝试将indexedDB两千条数据一口气赋值给arr.data。但事与愿违,页面上的{{}}在展示先前数组的三秒后变为空。 问题探究 vue3的响应应该与console.log有异曲同工之妙࿰…...
1236 - 二分查找
代码 #include<bits/stdc.h> using namespace std; int a[1100000]; int main() {int n,x,l,r,p,mid,i;cin>>n;for(i1;i<n;i)cin>>a[i];cin>>x;l1;rn;p-1;while(l<r){mid(rl)/2;if(a[mid]x){pmid;break;}else if(x<a[mid]) rmid-1;else if(x…...
CPP容器vector和list,priority_queue定义比较器
#include <iostream> #include <bits/stdc.h> using namespace std; struct VecCmp{bool operator()(int& a,int& b){return a>b;/*** 对于vector和list容器,这里写了>就是从大到小* 对于priority_queue容器,这里写…...
How to install PyAlink on Ubuntu 22.04
How to install PyAlink on Ubuntu 22.04 环境准备准备conda python环境创建项目虚拟环境激活虚拟环境 安装脚本细节 环境准备 准备conda python环境 关于如何安装conda环境,可以参阅我此前整理的如下文章: How to install Miniconda on ubuntu 22.04…...
Java部署运维
1.docker Docker(一):安装、命令、应用Docker(二):数据卷、Dockefile、Docker-composeDocker(三) 通过gitlab部署CICD Docker超详细教程——入门篇实战 Docker教程 2.nginx 3.keepalived 4.k8s 5.jekenis...
0-Flume(1.11.0版本)在Linux(Centos7.9版本)的安装(含Flume的安装包)
环境检查 #首先确认自己的Linux是Centos版本,运行命令 cat /etc/centos-release结果:CentOS Linux release 7.9.2009 (Core) 安装 Flume本身是由Java开发的,所以需要服务器上安装好JDK1.8(注意区分Linux还是Windows系统的JDk&a…...
cad vba 打开excel并弹窗打开指定文件
CAD vba 代码实现打开excel,并通过对话框选择xls文件,并打开此文件进行下一步操作。代码如下: excel.activeworkbook.sheets(1) excel对象下activeworkbook,再往下是sheets对象,(1)为第一个表, thisworkbook是vba代码所在的工作簿。 Opti…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
