这里有3个Demo,分别是
- Dubbox 2.8.4 + Spring3 + Dubbo协议
- Dubbox 2.8.4 + Spring3 + Hessian协议
- dubbox 2.8.4 + Spring3 + HTTP协议
三个Demo都可以成功运行。使用了gradle Gretty插件,提供了内嵌的Jetty容器,运行demo不用安装额外的Tomcat或jetty等servlet容器。
使用方法如下:
1. 运行Zookeeper
安装,配置Zookeeper,然后启动Zookeeper的server。Install, configure and srart Zookeeper server
2. 运行Provoder
进入provider
目录,执行gradle appRun
。会启动web容器并运行应用。
3. 运行Consumer
进入consumer
目录,执行gradle appRun
。
浏览器中访问http://localhost:8082/hello
或http://localhost:8082/user
.其中/hello
是传递简单String作为参数,/user
是传递自定义类型User作为接口参数。
一些问题:
- 现在是在xml中一个个声明dubbo暴露的服务(
dubbo:service
)和依赖的远程引用(dubbo:reference
)。这方式显然不好,最好是使用spring的自动扫描和自动装配。Dubbo提供了这样的annotation,比如@Service和@Reference。当使用的时候,出现了一些问题。客户端调用IHelloService的sayHello方法时,结果调用了远程服务IUserService的sayHello方法去了,抛出异常IUserService没有提供sayHello方法。 - 如果一个服务有部署多个实例,那么服务暴露的端口是不一样的。如何灵活配置。hessian的端口是要和web容器暴露的端口一致的。
=======================================================
Dubbo | Dubbox | |
---|---|---|
Spring 版本 | 2 | 3 |
是否维护 | no | dangdang |
Dubbox Spring v4 可以参考 update-dubbo-to-spring-4
Dubbo也可以和新版本的spring集成,需要排除自身的spring依赖,如下,
compile("com.alibaba:dubbo:2.5.3"){
exclude(module: 'spring')
exclude(module: 'netty')
}
Dubbo和Dubbox在配置方面是否有差异,2者兼容性如何?
Zookeeper配置
- Hession
- HTTP
- REST
- Dubbo
协议 | 传输协议 | 数据格式 | 性能 | 跨平台/语言 |
---|---|---|---|---|
Dubbo + Dubbo序列化 | TCP | 二进制 | ||
Dubbo + Hessian序列化 | TCP | 二进制 | ||
Dubbo + Java序列化 | TCP | 二进制 | Java序列化二进制数据不能跨语言 | |
Hessian + Hessian序列化 | HTTP | 二进制 | Hessian序列化二进制数据可跨语言 |
Dubbo提供了Admin的监控中心,研究它的使用。如何部署,能提供什么数据的监控。 目前为止,发现原生DUBBO Admin不支持JAVA 1.8, 解决方案,未验证 apache/dubbo#50 DUBBOX Admin没有这个问题,但是这个工具本身存在大量BUG, 对今后维护会产生一定影响。
客户端调用远程服务,如果远程服务抛出了异常,客户端能否捕获到异常,捕获到什么类型的异常?
总的结果就是:
- 不管怎样,客户端都能捕获到异常,只是异常的类型在不同场景下会有所不同。
- 如果服务端抛出的异常,客户端认识,那么可以正确的获得具体的异常类型。比如JDK自带的异常(比如
IOException
,RuntimeException
),客户端当然是有这些类的元数据的,可以进行反序列化获得准确的异常。如果该异常在服务的接口中声明了,客户端也可以拿到具体的异常。 - 如果服务端抛出的是自定义异常,且该异常在服务接口中没定义,那么客户端就只能捕获一个
com.caucho.hessian.io.HessianServiceException
(如果使用hessian协议).但是原始异常的error message在HessianServiceException
中会保留。
Zookeeper的图形化管理工具:
使用Zookeeper做配置管理
如何更Zookeeper中的数据,是否需要有一个配置管理界面可以管理更新数据,然后Zookeeer会将更改通知到各个Zookeeper节点。
Zookeeper节点接收到更新通知,节点所在的应用如何去使用新的数据。比如,如果应用只是在第一次启动时去读Zookeeper节点的数据,然后缓存。这样即使Zookeeper节点接收到通知,更新了数据,应用依然读的是缓存中的老数据,所以需要添加一个layer来管理这些数据的更新。
关于配置管理的实现,有现成的,但比较复杂,例如DisConf,现阶段只要合理使用Zookeeper API 就可以完成大部分需要的功能,当然在此之上建立一层Facade是需要的。
关于配置编辑更新的实现,如上,也可以参考zkpublisher