missian(1)

missian是什么

 

hessian(hessian over mina)是一个基于HTTP的优秀的、高效的RPC框架,而missian可以理解为:基于mina对hessian进行扩展,使之:


1、具备异步RPC能力,但同时也提供了同步的客户端,和hessian完全兼容

2、能够在TCP之上传输,省掉了HTTP编码解码的过程,但是同事也支持HTTP协议,意味着hessian客户端也是可以调用missian服务的。

 

missian提供了什么

 

1、一个基于mina的服务器,可以基于spring,也可以是独立的。mina所具备的优秀基因它都具备。同时它还具备一个特点:只需要开放一个端口,它可以兼容tcp协议和http协议——并且完全兼容hessian——也就是说,我们完全可以抛开servlet容器(诸如tomcat、resin之类),启动独立的服务器进行服务。

 

2、一个同步客户端。它接受tcp(tcp://server:port/beanname)和http(http://server:port/beanName)格式的URL,并自动根据协议种类来发送不同类型的数据包。它即可以基于短连接,也可以使用连接池,用户可以自行决定。它也是和hessian完全兼容的,当然了,只能使用http协议访问hessian。

 

3、一个异步的客户端。它接受tcp(tcp://server:port/beanname)和http(http://server:port/beanName)格式的URL,并自动根据协议种类来发送不同类型的数据包。它发送数据之后立刻返回绝不等待(返回值永远都是null,除非是void),当服务器计算完成并传回结果时,会自动调用相应的回调接口。默认会创造一个4个线程的池来做回调的任务,线程数是可以指定的(使用其它构造函数),或者传入一个已经构造好的线程池给它也是可行的。很遗憾的是,我们还不能够异步去调用已有的hessian服务。

 

missian的应用场景

 

1、构建一个missian服务器,同时存在hessian客户端和missian客户端来调用它。这种场景,missian服务器优势明显:

  • 首先抛弃了servlet容器,服务器的并发性能更有保障;实测证明这些容器的性能和mina开发的服务器相比还是有差距。
  • 兼容hessian客户端,所有已经的业务逻辑不需要做很大的改动。
  • 保障了服务的灵活性,客户端发HTTP请求,它就返回HTTP响应,客户端发TCP请求,它就回应TCP;它自动甄别是异步请求还是同步请求,如果是同步请求,那么和hessian一般无二(http的前提下),如果是异步请求,它还会返回一些辅助信息,以帮助异步客户端能够进行回调

2、构建一个missian服务器,使用同步missian客户端来调用。

  • 优势在于可以使用tcp传输,同时支持连接池,连接池是用户可控的

3、构建一个missian服务器,使用异步missian客户端来调用。

  • 异步调用的最大的优势,就是释放线程,而不是让线程耗费在等待服务器的响应上。

4、使用同步missian客户端去调用已有的hessian服务。

  • 相比hessian客户端,优势在于用户可以自定义是使用短链接,还是使用长连接(以及连接池)。

Missian同时支持HTTP/TCP,也同时支持同步和异步。

 

一、同步+HTTP时的协议

这时和Hessian的协议一致。即采用POST发送数据,整个数据包(除了HTTP协议头外的数据)会交给Hessian的序列化机制来编码和解码。请求和响应中都支持chunk,编码解码过程中已经兼容。

 

二、异步+HTTP时的协议

其实和同步请求的协议相比,只是在HTTP Header中加了一些自动以的协议头。

 

1、请求

 

在HTTP头中加了一个自定义的Header:Missian-Async: true

服务器接收到这个请求之后,会将这个请求当作异步请求来处理

 

2、响应

 

在HTTP头中加了以下几个自定义的Header:

Missian-Async: true

Missian-Bean: beanName

Missian-Method: methodName

 

beanName和methodName是异步的关键,missian根据这两个去寻找回调对象(Callback)。

 

注意beanName是从请求的URL中获取的,比如http://missian.com:8080/abc/hello这个url,missian会将“abc/hello”作为beanName。这个是Hessian中没有的概念。

 

methodName是进行调用的方法名,Hessian是分装在比较底层的,为了取到这个methodName,不得已改了一点Hessian的代码。

 

三、同步+TCP时的协议

 

1、不定长数据格式

比如beanName、methodName、消息体,它们的长度不是固定的,因此在传输它们之前用4个字节表示他们的长度。其实对于beanName和methodName,可能用一个字节就足够表示了,但为了扩展性,也不省这么几个字节了。


2、字符串编码格式

在真个协议头的编码过程中都使用ASCII编码。

 

3、请求

 

|<---1字节------>|<---4+n字节--->| <--4+n字节-------->|

| 异步/同步标志位 |   beanName    |  body                    |

 

注意首字节是一个标志位,接着传了一个beanName(由4个字节的长度和其真正的内容组成),接下来就是Body极其长度了:长度用于方便missian去读取足够的数据,而body读取完成之后将会交给Hessian去处理,这个和基于HTTP时POST过来的数据是完全一样的。

 

4、响应

|<---1字节------>|<---4+n字节--->| 

| 异步/同步标志位 |   body             |

 

首字节是一个同步异步的标志位。接下来是内容极其长度。

 

四、异步+TCP时的协议

 

1、请求

 

|<---1字节------>|<---4+n字节--->| <--4+n字节-------->|

| 异步/同步标志位 |   beanName    |  body                    |

 

注意首字节是一个标志位,接着传了一个beanName(由4个字节的长度和其真正的内容组成),接下来就是Body极其长度了:长度用于方便 missian去读取足够的数据,而body读取完成之后将会交给Hessian去处理,这个和基于HTTP时POST过来的数据是完全一样的。

 

2、响应

|<---1字节------>|<---4+n字节--->|<---4+n字节--->| <--4+n字节-------->|

| 异步/同步标志位 |   beanName    |   methodName|  body                    |

 

首字节是一个同步异步的标志位。接下来是beanName和methodName,和HTTP中一样,这两个是实现异步回调的关键。body和同步操作中时是一模一样的。

 

五、URL格式说明

AsyncMissianProxyFactory和SyncMissianProxyFactory在创建Stub时,接受的参数格式和Hessian是一样的:一个接口(将为这个接口创建代理类)和一个URL(用于表明将数据用何种方式发给那个服务器)。

 

Missian接受两种协议的URL:

1、HTTP协议:例如,http://abc.com:8080/abc,http://abc.com:8080/abc/a,http://abc.com/abc

2、TCP协议:例如,tcp://abc.com:8080/abc,tcp://abc.com:8080/abc/a,tcp://abc.com/abc

 

一个URL由4部分组成:协议、服务器地址、端口和BeanName组成。

协议 :只能是http或者tcp,其它字符串不能接受,会抛出异常

服务器地址 :域名和IP都可以使用

端口 :和服务器地址之间用冒号分割,端口可以使用缺省值80(在missian中,http和tcp都是使用80作为默认端口)。

beanName :在服务器地址和端口之后紧跟了一个'/',这个'/'之后的全部字符串在messian中被称为beanName(不含第一个斜杠)

 -----------------------------------------------------

Missian暂时只支持Java,请安装JDK1.5以上版本。对IDE没有任何要求,也不要求安装任何Web容器(Tomcat之类)。请到http://code.google.com/p/missian/downloads/list下载missian的发行包,以及依赖文件包。

 

创建一个普通的Java项目,将missian-0.20.jar和相关依赖项全部导入。

 

创建一个接口,这个接口是客户端和服务器端都会使用的。

  1. public interface Hello {  
  2.     public String hello(String name, int age);  
  3. }  

 

创建一个实现类,实现Hello接口:

[java]  view plain  copy
  1. public class HelloImpl implements Hello {  
  2.   
  3.     public String hello(String name, int age) {  
  4.         return "hi, "+name+", "+age;  
  5.     }  
  6.   
  7. }  

 以上这个类和接口会在后面的例子中使用到。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值