
2、 client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;在Java里就是序列化的过程
3、 client stub找到服务地址,并将消息通过网络发送到服务端;
4、 server stub收到消息后进行解码,在Java里就是反序列化的过程;
5、 server stub根据解码结果调用本地的服务;
6、 本地服务执行处理逻辑;
7、 本地服务将结果返回给server stub;
8、 server stub将返回结果打包成消息,Java里的序列化;
9、 server stub将打包后的消息通过网络并发送至消费方
10、 client stub接收到消息,并进行解码, Java里的反序列化;
11、 服务调用方(client)得到最终结果。
RPC框架的目标就是把2-10步封装起来,把调用、编码/解码的过程封装起来,让用户像调用本地服务一样的调用远程服务。要做到对客户端(调用方)透明化服务, RPC框架需要考虑解决如下问题:
1、 服务端提供的服务如何发布,客户端如何发现服务;
2、 如何对请求对象和返回结果进行序列化和反序列化;
3、 如何更高效进行网络通信。
以上问题在一些开源的RPC框架里都有比较好的解决,如阿里的Dubbo,Facebook的Thrift。
OSI网络通信模型
第一层:应 用层。定义了用于在网络中进行通信和传输数据的接口;
第二层:表示层。定义不同的系统中数据的传输格式,编码和解码规范等;
第三层:会话层。管理用户的会话,控制用户间逻辑连接的建立和中断;
第四层:传输层。管理着网络中的端到端的数据传输;
第五层:网络层。定义网络设备间如何传输数据;
第六层:链路层。将上面的网络层的数据包封装成数据帧,便于物理层传输;
第七层:物理层。这一层主要就是传输这些二进制数据。
JMS
JMS:JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
使用JMS 的应用程序被称为JMS 客户端,处理消息路由与传递的消息系统被称为JMS Provider,而JMS 应用则是由多个JMS 客户端和一个JMS Provider 构成的业务系统。发送消息的JMS 客户端被称为生产者(producer),而接收消息的JMS 客户端则被称为消费者(consumer)。同一JMS 客户端既可以是生产者也可以是消费者。
JMS 的编程过程很简单,概括为:应用程序A 发送一条消息到消息服务器(也就是JMS Provider)的某个目得地(Destination),然后消息服务器把消息转发给应用程序B。因为应用程序A 和应用程序B 没有直接的代码关连,所以两者实现了解偶。
-术语:
JMS Provider:实现JMS接口的消息中间件,如:ActiveMQ、RabbitMQ、Kafka等。
PTP:点对点的消息模型。
Pub/Sub:发布/订阅的消息模型。
Queue:队列目标。
Topic:主题目标。
ConnectionFactory:连接工厂,JMS用它创建连接。
Connection:JMS客户端到JMS Provider的连接。
Destination:消息的目的地。
Session:会话,一个发送或接收消息的线程。
MessageProducer:由Session对象创建的用来发送消息的对象。
MessageConsumer:由Session对象创建的用来接收消息的对象。
Acknowledge:签收。
Transaction:事务。
一、编程域
JMS支持两种截然不同的消息传送模型:PTP和Pub/Sub.
PTP: 消息首先被传送至queue,然后根据队列传送策略从该队列将消息传送至向此队列进行注册的某一个消费者,一次只传一条消息。
producer数量没有限制,但是消息只能发送至、并由一个consumer成功使用,如果队目标没有注册的消费者,队列将保留收到的消息,并在某个consumer向该队列进行注册时将消息传送给consumer.
Pub/Sub:在此传送模型中,目标是一个主题然后传送至所有已订阅此主题的活动消费者。producer数量没有限制,consumer数量也没有限制只要成功订阅此主题就可以获取消息。主题目标也支持持久订阅的概念,如果没有想主题目标注册的消费者,主题不保留其接收到的消息,除非有非活动消费者注册了持久订阅。
二、消息结构
1, JMS消息由3个部分组成:消息头、属性、消息体。
消息头:包含消息的识别信息和路由信息,消息头包含一些标准的属性
属性:JSM提供一种机制增加新属性到消息头中,这种新属性包含几种:
a、应用需要用到的属性
b、消息投中原有的可选属性
c、JMS Provider需要用到的属性
三、消息头可选属性:
1、JMSDestination 消息发送的目的地
2、JMSDeliveryMode 传送模式,有两种模式:persistent和non_persistent,persistent表示该消息一定要被送到目的地,否则会导致应用错误。non_persistent表示偶然丢失该消息是被允许的,这两种模式使开发者可以在消息传送的可靠性和吞吐量之间找到平衡点。
3、JMSExpiration:消息过期时间,等于Destination的send方法中的timeToLive值加上发送时刻的GMT时间值,如果timeToLive值等于零,则JMSExpriration被设为零,表示该消息永远不过期。如果发送后,在消息过期时间之后消息还没有被发送到目的地,则该消息被清除。
4、JMSPriority:消息优先级,从0-9是个级别,0-4是普通消息,5-9是加急消息。JMS不要求JMS provider严格按照这十个优先级发送消息,但必须保证加急消息要先于普通消息到达。
5、JMSMessageID:唯一识别每个消息的标识,由JMS Provider产生。
6、JMSTimestamp:一个消息被提交给JMS Provider到消息被发出的时间。
7、JMSCorrelationID:用来连接到另外一个消息,典型的应用是在回复消息中连接到原消息。
8、JMSReplyTo:提供本消息回复消息的目的地址
9、JMSType:消息类型的识别符
10、JMSRedelivered:如果一个客户端收到一个设置了JMSRedelivered属性的消息,则表示可能客户端曾经在早些时候收到过该消息,但并没有签收(acknowledged).
四、消息体
JMS API定义了5种消息体格式,也叫消息类型。
1、TextMessage:java.lang.String 对象
2、MapMessage:键值对的集合,名是String对象,值类型可以是java任何基本类型。
3、BytesMessage:字节流
4、StreamMessage:java中的输入输出流
5、ObjectMessage:java中的可序列化对象
6、Message:没有消息体,只有消息头和属性
五、JMS支持并发
1,Destination 是
2,ConnectionFactory 是
3,Connection 是
4,Session 否
5,MessageProducer 否
6,MessageConsumer否