你好,我的手机被偷了怎么找回来能找你会回吗?是oppor9s

1835人阅读
本文将展示如何在Dubbo中使用多协议来暴露服务。
1、不同服务不同协议
例如:不同服务在性能上适用不同协议进行传输,比如大数据用短连接协议,小数据大并发用长连接协议。配置如下:
provider-multi-protocol.xml
&?xml version="1.0" encoding="UTF-8"?&
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd/schema/dubbo/schema/dubbo/dubbo.xsd"&
name="dubbo-provider-app"
id="zk_registry" address="zookeeper://127.0.0.1:2181" /&
name="dubbo" port="20880" /&
name="rmi" port="20980" /&
interface="com.ricky.dubbo.api.DemoService" ref="demoService" protocol="dubbo" /&
interface="com.ricky.dubbo.api.HelloService" ref="helloService" protocol="rmi"
id="demoService" class="com.ricky.dubbo.provider.impl.DemoServiceImpl"/&
id="helloService" class="com.ricky.dubbo.provider.impl.HelloServiceImpl"/&
2、多协议暴露服务
例如,需要与http客户端互操作,配置如下:
provider-multi-protocol.xml
&?xml version="1.0" encoding="UTF-8"?&
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd/schema/dubbo/schema/dubbo/dubbo.xsd"&
name="dubbo-provider-app"
id="zk_registry" address="zookeeper://127.0.0.1:2181" /&
name="dubbo" port="20880" /&
name="hessian" port="20980" /&
interface="com.ricky.dubbo.api.DemoService" ref="demoService" protocol="dubbo" /&
interface="com.ricky.dubbo.api.HelloService" ref="helloService" protocol="dubbo,hessian"
id="demoService" class="com.ricky.dubbo.provider.impl.DemoServiceImpl"/&
id="helloService" class="com.ricky.dubbo.provider.impl.HelloServiceImpl"/&
其中,HelloService同时使用dubbo,hessian协议对外提供服务。
Dubbo User Guide:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1154344次
积分:15670
积分:15670
排名:第551名
原创:475篇
转载:25篇
评论:425条
阅读:5993
文章:24篇
阅读:27629
(5)(4)(13)(11)(8)(3)(16)(24)(9)(27)(10)(7)(6)(4)(14)(1)(3)(1)(1)(3)(2)(6)(4)(8)(10)(5)(6)(5)(8)(13)(12)(14)(11)(22)(13)(13)(13)(16)(16)(18)(13)(11)(22)(16)(48)(11)dubbo中的那些“坑”(1) – 关于MINA传输协议的bug定位及修复 - 推酷
dubbo中的那些“坑”(1) – 关于MINA传输协议的bug定位及修复
dubbo中使用mina作为传输层时,高并发下导致解码异常
同事刘阳使用dubbo服务器中配置mina作为网络传输层,发现大并发情况下,解码发生如下异常
014-12-01 18:00:44,652 [DubboServerHandler-10.1.19.13:20880-thread-164] WARN& alibaba.dubbo.remoting.exchange.codec.ExchangeCodec (ExchangeCodec.java:596) –& [DUBBO] Fail to encode response: Response [id=8119, version=2.0.0, status=40, event=false, error=Fail to decode request due to: RpcInvocation [methodName=null, parameterTypes=null, arguments=null, attachments={input=242}, headers=null], result=null], send bad_response info instead, cause: null, dubbo version: 2.5.5, current host: 127.0.0.1
java.lang.NullPointerException
at com.alibaba.dubbo.rpc.protocol.dubbo.DubboCodec.encodeResponseData(DubboCodec.java:301)
at com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec.encodeResponse(ExchangeCodec.java:560)
at com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec.encode(ExchangeCodec.java:104)
at com.alibaba.dubbo.rpc.protocol.dubbo.DubboCountCodec.encode(DubboCountCodec.java:39)
at com.alibaba.dubbo.remoting.transport.mina.MinaCodecAdapter$InternalEncoder.encode(MinaCodecAdapter.java:79)
at org.apache.mina.filter.codec.ProtocolCodecFilter.filterWrite(ProtocolCodecFilter.java:214)
at org.mon.support.AbstractIoFilterChain.callPreviousFilterWrite(AbstractIoFilterChain.java:361)
at org.mon.support.AbstractIoFilterChain.access$1300(AbstractIoFilterChain.java:53)
at org.mon.support.AbstractIoFilterChain$EntryImpl$1.filterWrite(AbstractIoFilterChain.java:659)
at org.mon.support.AbstractIoFilterChain$TailFilter.filterWrite(AbstractIoFilterChain.java:587)
at org.mon.support.AbstractIoFilterChain.callPreviousFilterWrite(AbstractIoFilterChain.java:361)
at org.mon.support.AbstractIoFilterChain.fireFilterWrite(AbstractIoFilterChain.java:355)
at org.apache.mina.transport.socket.nio.SocketSessionImpl.write0(SocketSessionImpl.java:166)
at org.mon.support.BaseIoSession.write(BaseIoSession.java:177)
at org.mon.support.BaseIoSession.write(BaseIoSession.java:168)
at com.alibaba.dubbo.remoting.transport.mina.MinaChannel.send(MinaChannel.java:95)
at com.alibaba.dubbo.remoting.transport.AbstractPeer.send(AbstractPeer.java:51)
经过对比netty3和netty4作为传输层,却都没有发现类似的问题。
首先排除不是mina本身的问题,mina也没有爆出有这个问题,初步判断dubbo在使用mina时机制有问题
经过对比发现
1.netty是为每一个channel分配了一个NettyCodecAdapter, mina确实在服务器监听前配置了MinaCodecAdapter
2.也就是说,netty的每一个独立的通道的Codec(encoder/decoder)是通道安全的
3.mina的所有通道是共享相同的codec(encoder/decoder)的,因此,解码器中的实例数据时非channel安全的
因此解码器中与netty相同的解码器的缓冲数据算法在并发情况下将会产生数据覆盖问题。
4.解决方案
1.配置acceptor的监听器
codecAdapter = new MinaCodecAdapter(getCodec(), getUrl(), this);acceptor.getFilterChain().addLast(“codec”, new ProtocolCodecFilter(codecAdapter));
acceptor.addListener(new IoServiceListener(){
public void serviceActivated(IoService service,
SocketAddress serviceAddress, IoHandler handler,
IoServiceConfig config) {
public void serviceDeactivated(IoService service,
SocketAddress serviceAddress, IoHandler handler,
IoServiceConfig config) {
public void sessionCreated(IoSession session) {
codecAdapter.sessionCreated(session);
public void sessionDestroyed(IoSession session) {
codecAdapter.sessionDestroyed(session);
2.监听session的create和destroy事件,传递到decoder中,decoder中,通过session和buffer的键值对保存对不同通道的数据的缓存,
private Map&IoSession, ChannelBuffer& buffers = new ConcurrentHashMap&IoSession, ChannelBuffer&();
// ChannelBuffers.EMPTY_BUFFER;
public void sessionCreated(IoSession session) {
buffers.put(session, ChannelBuffers.EMPTY_BUFFER);
public void sessionDestroyed(IoSession session) {
buffers.remove(session);
3.解码时通过session获得当前channel的数据
ChannelBuffer buffer = buffers.get(session);if(buffer == null)
经过测试,问题得以解决
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致java基础(10)
1、默认协议
&Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。Dubbo缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。
缺省协议,使用基于mina1.1.7+hessian3.2.1实现。
连接个数:单连接
连接方式:长连接
传输协议:TCP
传输方式:NIO异步传输
序列化:Hessian二进制序列化
适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用dubbo协议传输大文件或超大字符串。
适用场景:常规远程服务方法调用
2、 rmi协议
&&&&&&& RMI协议采用JDK标准的java.rmi.*实现,采用阻塞式短连接和JDK标准序列化方式。
如果服务接口继承了java.rmi.Remote接口,可以和原生RMI互操作,即:
提供者用Dubbo的RMI协议暴露服务,消费者直接用标准RMI接口调用,
或者提供方用标准RMI暴露服务,消费方用Dubbo的RMI协议调用。
如果服务接口没有继承java.rmi.Remote接口,
缺省Dubbo将自动生成一个com.xxx.XxxService$Remote的接口,并继承java.rmi.Remote接口,并以此接口暴露服务,
但如果设置了&dubbo:protocol name=&rmi& codec=&spring&/&,将不生成$Remote接口,而使用Spring的RmiInvocationHandler接口暴露服务,和Spring兼容。
3、 hessian协议
Hessian协议用于集成Hessian的服务,Hessian底层采用Http通讯,采用Servlet暴露服务,Dubbo缺省内嵌Jetty作为服务器实现。
&&&&&&& Hessian是Caucho开源的一个RPC框架:,其通讯效率高于WebService和Java自带的序列化。
4、http协议
此协议采用spring 的HttpInvoker的功能实现,
连接个数:多个
连接方式:长连接
连接协议:http
传输方式:同步传输
序列化:表单序列化
适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。
适用场景:需同时给应用程序和浏览器JS使用的服务。
5、thrift协议
当前 dubbo 支持的 thrift 协议是对 thrift 原生协议的扩展,在原生协议的基础上添加了一些额外的头信息,比如service name,magic number等。使用dubbo thrift协议同样需要使用thrift的idl compiler编译生成相应的java代码。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:657次
排名:千里之外dubbo三种协议性能对比 - 愤怒的菜鸟 - ITeye技术网站
博客分类:
显然,thrift原生协议性能表现卓越,是dubbo原生性能的6倍。
浏览: 8133 次
求分享的GIT!!!

我要回帖

更多关于 手机被偷了怎么找回来 的文章

 

随机推荐