探索 RPC 远程调用:深入了解 RPC 远程调用的原理和应用(II)
本系列文章简介:
本系列文章将深入探讨RPC远程调用的原理和应用,帮助大家更好地理解RPC远程调用的工作原理,以及它在分布式系统中的实际应用场景。我们将介绍RPC远程调用的基本原理和工作流程,并探讨不同的协议和实现方式。此外,我们还将分析RPC远程调用的优缺点,并展望未来RPC远程调用的发展趋势。 欢迎大家订阅《Java技术栈高级攻略》专栏,一起学习,一起涨分!
目录
1、引言
2、RPC远程调用的应用场景
2.1 分布式系统架构
2.2 微服务架构
2.3 跨语言通信
2.4 大规模数据处理
3、基于RPC的实际应用案例
3.1 Facebook的Thrift
3.2 Google的gRPC
3.3 Apache的Dubbo
4、RPC远程调用的优缺点分析
4.1 优点
4.2 缺点
4.3 使用RPC的注意事项
5、未来RPC远程调用的发展趋势
5.1 更高性能和更低延迟
5.2 更好的容错和可靠性
5.3 更灵活的服务发现和负载均衡机制
6、结语
1、引言
远程调用(Remote Procedure Call,简称RPC)是一种分布式计算中的通信方式,用于实现不同计算机之间的程序调用。它允许在一个计算机上运行的程序能够调用另一个计算机上的程序,就像调用本地程序一样简单。
本文将跟随《探秘Rpc远程调用:深入了解RPC远程调用的原理及应用(一)》的进度,继续介绍RPC远程调用。希望通过本系列文章的学习,您将能够更好地理解RPC远程调用的内部工作原理,掌握RPC远程调用的使用技巧,以及通过合理的配置完成最佳实践,充分发挥 RPC远程调用的潜力,为系统的高效运行提供有力保障。
2、RPC远程调用的应用场景
2.1 分布式系统架构
分布式系统架构是一种将系统的各个组件部署在不同的节点上,通过网络进行通信和协作的架构。在分布式系统中,RPC远程调用是一种常见的通信方式,它可以实现节点之间的方法调用和数据传输。
在分布式系统架构中,RPC远程调用的应用场景包括但不限于以下几个方面:
-
服务间通信:分布式系统通常由多个独立的服务组成,这些服务需要相互通信和协作。通过使用RPC远程调用,服务可以调用其他服务的方法,实现数据传输和功能扩展。
-
数据共享:在分布式系统中,各个节点可能存储着不同的数据,而这些数据需要在节点之间进行共享和同步。通过使用RPC远程调用,节点可以调用其他节点的方法,实现数据的读取、写入和同步。
-
负载均衡:分布式系统中的节点可能会面临不同的负载情况,为了实现资源的合理利用和负载均衡,可以使用RPC远程调用来实现任务的动态调度和分配。
-
弹性和容灾:分布式系统需要具备弹性和容灾能力,即当部分节点出现故障时,系统仍然能够正常工作。通过使用RPC远程调用,系统可以实现节点之间的自动切换和故障恢复,提高系统的可用性和稳定性。
总的来说,RPC远程调用作为一种通信方式,在分布式系统架构中具有广泛的应用场景,可以实现服务间的通信、数据共享、负载均衡和弹性容灾等功能,提高系统的性能、可靠性和可扩展性。
2.2 微服务架构
在微服务架构中,RPC远程调用是一种常见的通信方式,它可以实现微服务之间的方法调用和数据传输。以下是RPC远程调用在微服务架构中的几个主要应用场景:
-
服务间通信:微服务架构将系统拆分为多个独立的服务,这些服务需要相互通信和协作。通过使用RPC远程调用,服务可以方便地调用其他服务的方法,实现数据传输和功能扩展。
-
服务治理:在微服务架构中,服务的数量通常比较多,因此需要一种机制来管理、监控和调度这些服务。RPC远程调用可以用于实现服务的注册与发现、负载均衡和容错等功能,提供了服务治理的基础。
-
弹性和容灾:微服务架构需要具备弹性和容灾能力,即当部分服务出现故障时,系统仍然能够正常工作。通过使用RPC远程调用,系统可以实现服务之间的自动切换和故障恢复,提高系统的可用性和稳定性。
-
事件驱动架构:微服务架构中常常采用事件驱动的方式来实现服务之间的解耦和异步通信。RPC远程调用可以作为事件的生产者和消费者,实现事件的发布和订阅,促进服务之间的解耦和高效通信。
总的来说,RPC远程调用在微服务架构中具有广泛的应用场景,可以实现服务间的通信、服务治理、弹性容灾和事件驱动等功能,提高系统的可伸缩性、可靠性和可维护性。
2.3 跨语言通信
在分布式系统中,不同服务往往使用不同的编程语言来实现。RPC远程调用可以用于实现跨语言通信,使得不同语言编写的服务可以互相调用和交互。以下是RPC远程调用在跨语言通信中的几个主要应用场景:
-
多语言系统的集成:在实际的分布式系统中,往往会有多个服务使用不同的编程语言进行开发。通过使用RPC远程调用,可以方便地实现不同语言之间的通信,从而实现系统的集成和协作。
-
跨部门或跨组织的系统集成:在企业级应用中,不同部门或不同组织往往使用不同的技术栈和编程语言。通过使用RPC远程调用,可以实现跨部门或跨组织的系统集成,实现各个系统之间的数据交换和功能协同。
-
跨平台应用的开发:在一些跨平台应用中,如桌面应用、移动应用等,可能需要使用不同的编程语言来开发不同的客户端。通过使用RPC远程调用,可以方便地实现客户端与服务器之间的通信和数据传输,从而提高开发效率和用户体验。
-
自定义协议的扩展:有些情况下,系统可能需要使用自定义的通信协议来实现特定的需求。通过使用RPC远程调用,可以自定义协议的数据格式和通信方式,实现系统间的灵活扩展和定制化需求。
总的来说,RPC远程调用在跨语言通信中具有重要的应用场景,可以实现多语言系统的集成、跨部门或跨组织的系统集成、跨平台应用的开发和自定义协议的扩展等功能,为分布式系统的互操作性和扩展性提供了基础。
2.4 大规模数据处理
在大规模数据处理的应用场景中,RPC远程调用可以用于实现数据的分布式处理和协调。以下是RPC远程调用在大规模数据处理中的几个主要应用场景:
-
分布式计算:在分布式计算中,数据通常需要在不同的节点之间进行传输和处理。通过使用RPC远程调用,可以实现节点之间的数据交换和协调,从而实现分布式计算任务的并行处理和高效利用。
-
数据存储和访问:在大规模数据处理中,数据通常需要存储在分布式存储系统中。通过使用RPC远程调用,可以实现对分布式存储系统的数据访问和操作,提高数据的读写效率和可扩展性。
-
数据流处理:在流式数据处理中,数据通常以流的方式不断产生和处理。通过使用RPC远程调用,可以实现数据流之间的传输和处理,实现实时的数据流处理和分布式计算。
-
分布式任务调度和协调:在大规模数据处理中,需要对不同的任务进行调度和协调。通过使用RPC远程调用,可以实现任务之间的通信和数据交换,实现任务的分布式调度和协同处理。
总的来说,RPC远程调用在大规模数据处理中具有重要的应用场景,可以实现分布式计算、数据存储和访问、数据流处理以及分布式任务调度和协调等功能,提高数据处理的效率和可扩展性。
3、基于RPC的实际应用案例
3.1 Facebook的Thrift
Facebook的Thrift是一种基于RPC的开源框架,用于构建高效的跨语言服务。它是Facebook自行开发的用于处理大规模数据的工具,已被广泛应用于Facebook的内部系统和社交网络平台。
Thrift的主要应用场景包括:
-
跨语言通信:Facebook的系统由多种不同的编程语言编写,Thrift提供了一种统一的接口定义语言(IDL),可以让不同语言的服务之间进行跨语言通信。通过生成各种编程语言的客户端和服务器代码,Thrift使得跨语言服务调用变得简单和高效。
-
高性能的分布式服务:Facebook内部的很多服务都是基于Thrift构建的,例如消息系统、缓存系统、推荐系统等。Thrift使用二进制协议进行数据传输,使得服务之间的通信更加高效和快速,能够处理大规模的数据请求和处理。
-
可扩展性和灵活性:Thrift提供了一种可扩展的架构,可以根据需求添加新的服务和功能。通过Thrift的IDL定义和代码生成工具,可以很容易地扩展和修改服务接口,以适应不同的需求和场景。
-
多种语言支持:Thrift支持多种编程语言,包括Java、C++、Python、Ruby等。这使得开发人员可以使用自己熟悉的编程语言来构建和调用Thrift服务,提高开发效率。
总的来说,Facebook的Thrift是一个成功应用RPC的实际案例,它通过跨语言通信、高性能的分布式服务、可扩展性和灵活性以及多种语言支持等特性,为Facebook的大规模数据处理和系统构建提供了强大的支持。
3.2 Google的gRPC
Google的gRPC是一种基于RPC的开源框架,用于构建高性能、可扩展和跨语言的分布式系统。gRPC由Google开发并开源,已经被广泛应用于Google的内部系统和云平台。
gRPC的主要应用场景包括:
-
跨语言通信:gRPC支持多种编程语言,包括Java、C++、Python、Go等。使用gRPC,开发人员可以使用不同的编程语言来构建和调用服务,实现跨语言的通信和协作。
-
高性能的分布式服务:gRPC使用Protocol Buffers作为接口定义语言(IDL),并使用HTTP/2作为传输协议。HTTP/2具有低延迟和高吞吐量的特性,使得gRPC能够处理大规模的数据请求和处理,并提供高效的网络通信。
-
可靠的服务通信:gRPC支持多种通信模式,包括简单的请求-响应模式、流模式以及双向流模式。这些模式能够满足不同的业务需求,同时通过使用HTTP/2的多路复用功能,提供了可靠的和高效的服务通信。
-
自动化代码生成:使用gRPC,可以通过定义IDL文件来描述服务接口和消息类型,并使用gRPC的代码生成工具自动生成客户端和服务器代码。这使得开发人员可以更快速地构建和部署分布式系统,并减少手动编写重复代码的工作量。
总的来说,Google的gRPC是一个实际应用RPC的成功案例。它通过跨语言通信、高性能的分布式服务、可靠的服务通信和自动化代码生成等特性,为Google的内部系统和云平台提供了强大的支持。同时,gRPC也是一个开源项目,广泛应用于各种领域的分布式系统开发中。
3.3 Apache的Dubbo
Apache Dubbo是一种基于RPC的开源框架,用于构建高性能、可扩展和分布式的应用系统。它是Apache软件基金会的*项目之一,已经被广泛应用于互联网和企业级应用中。
Dubbo的主要应用场景包括:
-
微服务架构:Dubbo提供了一种轻量级的、面向微服务架构的服务治理框架。通过Dubbo,可以方便地构建和管理大规模的微服务系统,实现服务的注册与发现、负载均衡、容错等功能。
-
高性能的分布式服务:Dubbo使用了基于Java的高性能通信框架Netty,并通过优化传输协议和序列化机制,实现了高性能的网络通信。这使得Dubbo能够处理大量的并发请求,并提供低延迟和高吞吐量的分布式服务。
-
可靠的服务通信:Dubbo提供了可靠的服务通信机制,包括请求-响应模式、事件通知机制和异步通信等。通过使用Dubbo,开发人员可以实现可靠的服务调用,并使用各种通信模式满足不同的业务需求。
-
远程配置和动态路由:Dubbo提供了灵活的配置管理和动态路由功能,可以根据业务需求实时调整服务的配置和路由规则。这使得Dubbo能够快速适应业务变化,并提供优化的服务调用和负载均衡策略。
总的来说,Apache Dubbo是一个实际应用RPC的成功案例。它通过微服务架构、高性能的分布式服务、可靠的服务通信和远程配置等特性,为互联网和企业级应用提供了可靠、高效和可扩展的分布式服务框架。同时,Dubbo也是一个开源项目,拥有活跃的社区和广泛的用户群体。
4、RPC远程调用的优缺点分析
4.1 优点
RPC远程调用的优点包括:
-
简化编程模型:RPC框架提供了封装和抽象的机制,使得开发人员可以以类似本地方法调用的方式编写分布式应用程序。这简化了开发过程,提高了开发效率。
-
高性能:RPC框架通常使用高效的网络通信协议和序列化机制,使得远程调用过程的网络开销最小化,从而提供较低的延迟和高吞吐量。
-
跨语言支持:RPC框架通常提供支持多种编程语言的能力,使得不同语言的应用程序可以通过远程调用的方式进行通信和交互。这提供了更大的灵活性和互操作性。
-
分布式服务治理:RPC框架通常提供服务注册与发现、负载均衡、容错和熔断等服务治理功能,使得开发人员可以更好地管理和监控分布式服务。
-
可扩展性:RPC框架可以轻松扩展以支持更多的服务和节点,从而实现高效的水平扩展和负载均衡。
-
可靠性:RPC框架通常提供了可靠的传输协议和请求-响应模式,以确保请求的可靠性和一致性。这对于对数据一致性要求较高的应用程序尤为重要。
总的来说,RPC远程调用的优点在于简化编程模型、提供高性能的通信机制、支持跨语言通信、提供分布式服务治理能力、具有良好的可扩展性和可靠性。这些优点使得RPC成为构建分布式应用程序的有效工具。
4.2 缺点
RPC远程调用的缺点包括:
-
复杂性:尽管RPC框架简化了开发过程,但使用RPC仍然需要理解和掌握其相关的概念和技术。对于不熟悉RPC的开发人员来说,可能需要一定的学习和适应过程。
-
性能受限:尽管RPC框架提供了高性能的网络通信和序列化机制,但仍然存在网络开销和序列化/反序列化的额外开销。这些开销在远程调用的过程中可能会对性能产生一定的影响,尤其是在大规模分布式系统中。
-
平台依赖性:RPC框架通常依赖于特定的平台和编程语言。这对于需要跨平台和多语言支持的系统来说可能会带来一定的限制和复杂性。
-
集中化:RPC通常依赖于中心化的服务注册和发现机制,这意味着如果中心化服务发生故障或不可用,可能会对整个系统的可用性产生影响。
-
调试和跟踪的挑战:由于RPC是将服务封装为远程调用,可能会增加调试和跟踪的困难。特别是在分布式系统中,需要专门的工具和技术来跟踪和调试远程调用的细节。
总的来说,RPC远程调用的缺点在于复杂性、性能受限、平台依赖性、集中化和调试跟踪的挑战。开发人员在使用RPC时需要权衡这些缺点,并根据具体的应用场景和需求来选择合适的解决方案。
4.3 使用RPC的注意事项
使用RPC时需要注意以下几点:
-
选择合适的RPC框架:根据自己的需求和项目特点选择合适的RPC框架,比如gRPC、Dubbo等。要考虑框架的功能特性、性能、可扩展性和社区支持等因素。
-
服务接口设计:RPC通常基于接口进行通信,所以在设计服务接口时要考虑接口的合理性、易用性和可扩展性。需要定义清晰的输入和输出参数,并遵循接口的设计原则。
-
网络传输安全:由于RPC通常是在网络上进行通信,因此需要考虑网络传输的安全性,确保数据在传输过程中的保密性和完整性。可以通过使用TLS/SSL等协议来实现数据的加密和身份验证。
-
错误处理和异常处理:在RPC调用过程中,可能会发生各种错误和异常情况,如网络故障、服务不可用等。在使用RPC时,要考虑如何处理这些错误和异常,以保证系统的可靠性和健壮性。
-
性能优化:RPC的性能对于分布式系统的效率和响应时间非常重要。可以通过优化网络传输、序列化/反序列化过程、服务调用的并发性等方面来提升RPC的性能。
-
监控和日志记录:为了方便排查问题和进行性能优化,建议在RPC调用中添加监控和日志记录功能。可以记录请求和响应的详细信息,以及调用的耗时等指标,帮助定位问题和优化系统。
-
适当使用缓存:在RPC调用中,可以考虑使用缓存来提升系统的性能和响应时间。可以在RPC框架中集成缓存机制,对一些频繁调用的数据进行缓存,减少对服务的调用次数。
综上所述,使用RPC需要注意框架选择、服务接口设计、网络传输安全、错误处理、性能优化、监控和日志记录等方面的问题。合理地应用这些注意事项,可以帮助开发人员更好地使用RPC来构建高性能、可靠和可扩展的分布式系统。
5、未来RPC远程调用的发展趋势
5.1 更高性能和更低延迟
未来RPC远程调用的发展趋势之一是更高性能和更低延迟。随着计算能力和网络带宽的提升,人们对RPC的性能和响应时间的要求也越来越高。为了实现更高的性能和更低的延迟,可以从以下几个方面进行改进:
-
使用更快的网络传输协议:传统的RPC框架通常使用TCP/IP协议进行网络传输,但这种方式在高并发场景下可能存在性能瓶颈。未来的RPC框架可能会采用更快的网络传输协议,如RDMA(远程直接内存访问)、QUIC(快速UDP互联网连接)等,以提升传输效率和减少延迟。
-
优化序列化/反序列化:序列化和反序列化是RPC中非常重要的过程,对性能和延迟有很大影响。未来的RPC框架可能会采用更高效的序列化/反序列化算法,如Protocol Buffers、FlatBuffers、Cap'n Proto等,以减少序列化的开销并提高性能。
-
异步调用和并发处理:未来的RPC框架可能会更加注重异步调用和并发处理的能力。通过使用异步调用和并发处理,可以充分利用系统资源,提高并发性能,减少请求的等待时间和延迟。
-
智能路由和负载均衡:RPC调用通常涉及多个服务实例,未来的RPC框架可能会引入更智能的路由和负载均衡算法,根据实时的负载情况和网络状况选择最优的服务实例进行调用,以提高性能和降低延迟。
-
基于硬件加速的优化:未来的RPC框架可能会充分利用硬件加速技术,如RDMA、GPU等,以提高性能和降低延迟。通过使用专用硬件加速器,可以进一步提升RPC的处理能力和效率。
综上所述,未来RPC远程调用的发展趋势之一是更高性能和更低延迟。通过优化网络传输协议、序列化/反序列化、异步调用、并发处理、智能路由和负载均衡,以及利用硬件加速技术等手段,可以实现更快的RPC调用和更低的延迟,满足日益增长的性能需求。
5.2 更好的容错和可靠性
未来RPC远程调用的发展趋势之一是更好的容错和可靠性。在分布式系统中,故障和错误是不可避免的。为了保证系统的稳定性和可靠性,RPC框架需要具备良好的容错机制。
以下是未来RPC远程调用发展趋势中改进容错和可靠性的几个方面:
-
断路器模式:断路器模式是一种用于容错和故障处理的设计模式。未来的RPC框架可能会引入断路器模式,通过监控服务调用的成功和失败情况,实时切换服务调用的状态,当服务出现故障或超时时,断开对该服务的调用,以防止故障的扩散,并提高系统的稳定性。
-
自动重试和回退:未来的RPC框架可能会加强自动重试和回退机制。当服务调用失败时,可以自动进行重试,以期望服务在后续尝试中恢复正常。此外,当服务不可用时,可以回退到备用的服务或默认的处理逻辑,以保证系统的可用性。
-
分布式事务处理:分布式事务是分布式系统中非常重要的概念。未来的RPC框架可能会提供更好的分布式事务支持,例如通过Two-phase commit(二阶段提交)或Three-phase commit(三阶段提交)等机制来保证分布式事务的一致性和可靠性。
-
健康检查和监控:为了提高容错和可靠性,未来的RPC框架可能会增加健康检查和监控机制。通过定期检查服务的状态和性能指标,及时发现和处理故障或异常情况,可以提高系统的可用性和可靠性。
-
异常处理和消息重传:未来的RPC框架可能会提供更灵活和强大的异常处理和消息重传机制。当服务调用出现异常或网络故障时,框架可以捕获并处理异常,同时重传丢失的消息,以确保消息的可靠传输和处理。
综上所述,未来RPC远程调用的发展趋势之一是更好的容错和可靠性。通过引入断路器模式、自动重试和回退、分布式事务处理、健康检查和监控,以及异常处理和消息重传等机制,可以提高RPC框架的容错性和可靠性,从而保障分布式系统的稳定运行。
5.3 更灵活的服务发现和负载均衡机制
未来RPC远程调用的发展趋势之一是更灵活的服务发现机制。目前常用的服务发现机制包括基于注册中心的服务发现和基于DNS的服务发现。未来,我们可以期待更灵活的服务发现机制,可以根据需求选择不同的服务发现方式,例如基于微服务的服务发现、基于消息队列的服务发现等。这样可以更好地适应不同的应用场景和需求。
此外,未来RPC远程调用的发展趋势之一是更灵活的负载均衡机制。目前常用的负载均衡机制包括随机负载均衡、轮询负载均衡、一致性哈希负载均衡等。未来,我们可以期待更多种类的负载均衡算法和策略,例如基于机器学习的负载均衡、基于数据分析的负载均衡等,以提供更好的性能和可靠性。
总的来说,未来RPC远程调用的发展趋势是更加灵活和智能化的服务发现和负载均衡机制,以满足不断变化的应用需求和提升系统性能。
6、结语
随着互联网技术的不断发展和分布式系统的广泛应用,RPC远程调用将继续扮演重要的角色。未来,我们可以期待RPC远程调用在更多领域的创新和应用。无论是微服务架构、大数据处理还是物联网等,RPC远程调用都将为构建强大的分布式应用提供不可或缺的基础通信支持。
通过深入了解RPC远程调用的原理和应用,我们可以更好地应用RPC技术来构建高效、可靠的分布式系统,实现业务逻辑的分布和协同处理。希望本文对大家能够提供有益的指导和启发,让您深入探索RPC远程调用的奥秘,并应用于实际的分布式系统中,为构建更强大的分布式应用做出贡献。
推荐阅读
-
探索 RPC 远程调用:深入了解 RPC 远程调用的原理和应用(II)
-
windows下进程间通信的(13种方法)-摘 要 本文讨论了进程间通信与应用程序间通信的含义及相应的实现技术,并对这些技术的原理、特性等进行了深入的分析和比较。 ---- 关键词 信号 管道 消息队列 共享存储段 信号灯 远程过程调用 Socket套接字 MQSeries 1 引言 ---- 进程间通信的主要目的是实现同一计算机系统内部的相互协作的进程之间的数据共享与信息交换,由于这些进程处于同一软件和硬件环境下,利用操作系统提供的的编程接口,用户可以方便地在程序中实现这种通信;应用程序间通信的主要目的是实现不同计算机系统中的相互协作的应用程序之间的数据共享与信息交换,由于应用程序分别运行在不同计算机系统中,它们之间要通过网络之间的协议才能实现数据共享与信息交换。进程间通信和应用程序间通信及相应的实现技术有许多相同之处,也各有自己的特色。即使是同一类型的通信也有多种的实现方法,以适应不同情况的需要。 ---- 为了充分认识和掌握这两种通信及相应的实现技术,本文将就以下几个方面对这两种通信进行深入的讨论:问题的由来、解决问题的策略和方法、每种方法的工作原理和实现、每种实现方法的特点和适用的范围等。 2 进程间的通信及其实现技术 ---- 用户提交给计算机的任务最终都是通过一个个的进程来完成的。在一组并发进程中的任何两个进程之间,如果都不存在公共变量,则称该组进程为不相交的。在不相交的进程组中,每个进程都独立于其它进程,它的运行环境与顺序程序一样,而且它的运行环境也不为别的进程所改变。运行的结果是确定的,不会发生与时间相关的错误。 ---- 但是,在实际中,并发进程的各个进程之间并不是完全互相独立的,它们之间往往存在着相互制约的关系。进程之间的相互制约关系表现为两种方式: ---- (1) 间接相互制约:共享CPU ---- (2) 直接相互制约:竞争和协作 ---- 竞争——进程对共享资源的竞争。为保证进程互斥地访问共享资源,各进程必须互斥地进入各自的临界段。 ---- 协作——进程之间交换数据。为完成一个共同任务而同时运行的一组进程称为同组进程,它们之间必须交换数据,以达到协作完成任务的目的,交换数据可以通知对方可以做某事或者委托对方做某事。 ---- 共享CPU问题由操作系统的进程调度来实现,进程间的竞争和协作由进程间的通信来完成。进程间的通信一般由操作系统提供编程接口,由程序员在程序中实现。UNIX在这个方面可以说最具特色,它提供了一整套进程间的数据共享与信息交换的处理方法——进程通信机制(IPC)。因此,我们就以UNIX为例来分析进程间通信的各种实现技术。 ---- 在UNIX中,文件(File)、信号(Signal)、无名管道(Unnamed Pipes)、有名管道(FIFOs)是传统IPC功能;新的IPC功能包括消息队列(Message queues)、共享存储段(Shared memory segment)和信号灯(Semapores)。 ---- (1) 信号 ---- 信号机制是UNIX为进程中断处理而设置的。它只是一组预定义的值,因此不能用于信息交换,仅用于进程中断控制。例如在发生浮点错、非法内存访问、执行无效指令、某些按键(如ctrl-c、del等)等都会产生一个信号,操作系统就会调用有关的系统调用或用户定义的处理过程来处理。 ---- 信号处理的系统调用是signal,调用形式是: ---- signal(signalno,action) ---- 其中,signalno是规定信号编号的值,action指明当特定的信号发生时所执行的动作。 ---- (2) 无名管道和有名管道 ---- 无名管道实际上是内存中的一个临时存储区,它由系统安全控制,并且独立于创建它的进程的内存区。管道对数据采用先进先出方式管理,并严格按顺序操作,例如不能对管道进行搜索,管道中的信息只能读一次。 ---- 无名管道只能用于两个相互协作的进程之间的通信,并且访问无名管道的进程必须有共同的祖先。 ---- 系统提供了许多标准管道库函数,如: pipe——打开一个可以读写的管道; close——关闭相应的管道; read——从管道中读取字符; write——向管道中写入字符; ---- 有名管道的操作和无名管道类似,不同的地方在于使用有名管道的进程不需要具有共同的祖先,其它进程,只要知道该管道的名字,就可以访问它。管道非常适合进程之间快速交换信息。 ---- (3) 消息队列(MQ) ---- 消息队列是内存中独立于生成它的进程的一段存储区,一旦创建消息队列,任何进程,只要具有正确的的访问权限,都可以访问消息队列,消息队列非常适合于在进程间交换短信息。 ---- 消息队列的每条消息由类型编号来分类,这样接收进程可以选择读取特定的消息类型——这一点与管道不同。消息队列在创建后将一直存在,直到使用msgctl系统调用或iqcrm -q命令删除它为止。 ---- 系统提供了许多有关创建、使用和管理消息队列的系统调用,如: ---- int msgget(key,flag)——创建一个具有flag权限的MQ及其相应的结构,并返回一个唯一的正整数msqid(MQ的标识符); ---- int msgsnd(msqid,msgp,msgsz,msgtyp,flag)——向队列中发送信息; ---- int msgrcv(msqid,cmd,buf)——从队列中接收信息; ---- int msgctl(msqid,cmd,buf)——对MQ的控制操作; ---- (4) 共享存储段(SM) ---- 共享存储段是主存的一部分,它由一个或多个独立的进程共享。各进程的数据段与共享存储段相关联,对每个进程来说,共享存储段有不同的虚拟地址。系统提供的有关SM的系统调用有: ---- int shmget(key,size,flag)——创建大小为size的SM段,其相应的数据结构名为key,并返回共享内存区的标识符shmid; ---- char shmat(shmid,address,flag)——将当前进程数据段的地址赋给shmget所返回的名为shmid的SM段; ---- int shmdr(address)——从进程地址空间删除SM段; ---- int shmctl (shmid,cmd,buf)——对SM的控制操作; ---- SM的大小只受主存限制,SM段的访问及进程间的信息交换可以通过同步读写来完成。同步通常由信号灯来实现。SM非常适合进程之间大量数据的共享。 ---- (5) 信号灯 ---- 在UNIX中,信号灯是一组进程共享的数据结构,当几个进程竞争同一资源时(文件、共享内存或消息队列等),它们的操作便由信号灯来同步,以防止互相干扰。 ---- 信号灯保证了某一时刻只有一个进程访问某一临界资源,所有请求该资源的其它进程都将被挂起,一旦该资源得到释放,系统才允许其它进程访问该资源。信号灯通常配对使用,以便实现资源的加锁和解锁。 ---- 进程间通信的实现技术的特点是:操作系统提供实现机制和编程接口,由用户在程序中实现,保证进程间可以进行快速的信息交换和大量数据的共享。但是,上述方式主要适合在同一台计算机系统内部的进程之间的通信。 3 应用程序间的通信及其实现技术 ---- 同进程之间的相互制约一样,不同的应用程序之间也存在竞争和协作的关系。UNIX操作系统也提供一些可用于应用程序之间实现数据共享与信息交换的编程接口,程序员可以通过自己编程来实现。如远程过程调用和基于TCP/IP协议的套接字(Socket)编程。但是,相对普通程序员来说,它们涉及的技术比较深,编程也比较复杂,实现起来困难较大。 ---- 于是,一种新的技术应运而生——通过将有关通信的细节完全掩盖在某个独立软件内部,即底层的通讯工作和相应的维护管理工作由该软件内部来实现,用户只需要将通信任务提交给该软件去完成,而不必理会它的具体工作过程——这就是所谓的中间件技术。 ---- 我们在这里分别讨论这三种常用的应用程序间通信的实现技术——远程过程调用、会话编程技术和MQSeries消息队列技术。其中远程过程调用和会话编程属于比较低级的方式,程序员参与的程度较深,而MQSeries消息队列则属于比较高级的方式,即中间件方式,程序员参与的程度较浅。 ---- 4.1 远程过程调用(RPC)