Dubbo用法
未采用Dubbo,本地服务 Spring 配置
local.xml:
<bean id=“xxxService” class=“com.xxx.XxxServiceImpl” /> <bean id=“xxxAction” class=“com.xxx.XxxAction”> <property name=“xxxService” ref=“xxxService” /> </bean>
远程服务 Spring 配置
在本地服务的基础上,只需做简单配置,即可完成远程化:
- 将上面的
local.xml
配置拆分成两份,将服务定义部分放在服务提供方remote-provider.xml
,将服务引用部分放在服务消费方remote-consumer.xml
。- 并在提供方增加暴露服务配置
<dubbo:service>
,在消费方增加引用服务配置<dubbo:reference>
。
- remote-provider.xml:
<!-- 和本地服务一样实现远程服务 --> <bean id=“xxxService” class=“com.xxx.XxxServiceImpl” /> <!-- 增加暴露远程服务配置 --> <dubbo:service interface=“com.xxx.XxxService” ref=“xxxService” />
- remote-consumer.xml:
<!-- 增加引用远程服务配置 --> <dubbo:reference id=“xxxService” interface=“com.xxx.XxxService” /> <!-- 和本地服务一样使用远程服务 --> <bean id=“xxxAction” class=“com.xxx.XxxAction”> <property name=“xxxService” ref=“xxxService” /> </bean>
Dubbo依赖
必须依赖
JDK 1.6+
缺省依赖
通过 mvn dependency:tree > dep.log
命令分析,Dubbo 缺省依赖以下三方库:
[INFO] +- com.alibaba:dubbo:jar:2.5.9-SNAPSHOT:compile [INFO] | +- org.springframework:spring-context:jar:4.3.10.RELEASE:compile [INFO] | +- org.javassist:javassist:jar:3.21.0-GA:compile [INFO] | \- org.jboss.netty:netty:jar:3.2.5.Final:compile
这里所有依赖都是换照 Dubbo 缺省配置选的,这些缺省值是基于稳定性和性能考虑的。
- javassist.jar : 如果
<dubbo:provider proxy="jdk" />
或<dubbo:consumer proxy="jdk" />
,以及<dubbo:application compiler="jdk" />
,则不需要。- spring-context.jar : 如果用
ServiceConfig
和ReferenceConfig
的 API 调用,则不需要。- netty.jar : 如果
<dubbo:protocol server="mina"/>
或<dubbo:protocol server="grizzly"/>
,则换成 mina.jar 或 grizzly.jar。如果<protocol name="rmi"/>
,则不需要。
Dubbo:基于Spring 的XML 配置
搭建Dubbo项目前,首先要有一个注册中心,我们这里使用Zookeeper
Dubbo 采用全 Spring 配置方式,透明化接入应用,对应用没有任何 API 侵入,只需用 Spring 加载 Dubbo 的配置即可,Dubbo 基于 Spring 的 Schema 扩展 进行加载。
定义服务接口
- DemoService.java :
package org.apache.dubbo.demo; public interface DemoService { String sayHello(String name); }
在服务提供方实现接口
- DemoServiceImpl.java :
package org.apache.dubbo.demo.provider; import org.apache.dubbo.demo.DemoService; public class DemoServiceImpl implements DemoService { public String sayHello(String name) { return "Hello " + name; } }
用 Spring 配置声明暴露服务
- provider.xml:
修改其中的dubbo:registery,替换成真实的注册中心地址,推荐使用zookeeper
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="hello-world-app" /> <!-- 使用multicast广播注册中心暴露服务地址 --> <!--<dubbo:registry address="multicast://224.5.6.7:1234"/>--> <dubbo:registry protocol="zookeeper" address="192.168.60.207:2181" /> <!-- 用dubbo协议在20880端口暴露服务 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 声明需要暴露的服务接口 --> <dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService" /> <!-- 和本地bean一样实现服务 --> <bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl" /> </beans>
加载 Spring 配置
- Provider.java:
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Provider { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"http://10.20.160.198/wiki/display/dubbo/provider.xml"}); context.start(); System.in.read(); // 按任意键退出 } }
服务消费者
通过 Spring 配置引用远程服务
- consumer.xml:
修改其中的dubbo:registery,替换成真实的注册中心地址,推荐使用zookeeper
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --> <dubbo:application name="consumer-of-helloworld-app" /> <!-- 使用multicast广播注册中心暴露发现服务地址 --> <!--<dubbo:registry address="multicast://224.5.6.7:1234"/>--> <dubbo:registry protocol="zookeeper" address="192.168.60.207:2181" /> <!-- 生成远程服务代理,可以和本地bean一样使用demoService --> <dubbo:reference id="demoService" interface="org.apache.dubbo.demo.DemoService" /> </beans>
加载Spring配置,并调用远程服务
- Consumer.java :
import org.springframework.context.support.ClassPathXmlApplicationContext; import org.apache.dubbo.demo.DemoService; public class Consumer { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"http://10.20.160.198/wiki/display/dubbo/consumer.xml"}); context.start(); DemoService demoService = (DemoService)context.getBean("demoService"); // 获取远程服务代理 String hello = demoService.sayHello("world"); // 执行远程方法 System.out.println( hello ); // 显示调用结果 } }