Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。
实践了一个小demo,不妨一看。
目录结构
服务提供者
pom.xml,配置依赖的jar包
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wpb.dubbo</groupId>
<artifactId>dubbo-provide</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- <packaging>war</packaging> -->
<properties>
<spring.version>4.1.3.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.4.10</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.3</version>
</dependency>
</dependencies>
</project>
DubboProvide.java定义服务接口:(该接口需单独打包,在服务提供方和消费方共享)
package com.dubbo.service;
public interface DubboProvide {
void sayHello();
}
DubboProvideImpl.java,在服务提供方实现接口:(对服务消费方隐藏实现)
package com.dubbo.service.impl;
import com.dubbo.service.DubboProvide;
public class DubboProvideImpl implements DubboProvide {
public void sayHello() {
System.out.println("this is my first dubbo program");
}
}
ApplicationContextProducror.xml,用Spring配置声明暴露服务
<?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://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
">
<!-- 给dubbo服务者起个名 -->
<dubbo:application name="productor"/>
<!-- 用zookeeper注册服务中心暴露服务地址 -->
<dubbo:registry protocol="zookeeper" address="zookeeper://192.168.80.129:2181"/>
<!-- 暴露dubbo的通信端口 -->
<dubbo:protocol name="dubbo" port="20880"/>
<!-- 给消费者提供服务的接口 -->
<dubbo:service ref="dubboProvider" interface="com.dubbo.service.DubboProvide"></dubbo:service>
<!-- 提供服务的实现类 -->
<bean id="dubboProvider" class="com.dubbo.service.impl.DubboProvideImpl"></bean>
</beans>
DubboProvideStart.java,加载Spring配置,启动服务
package com.dubbo.main;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class DubboProvideStart {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext cfg = new ClassPathXmlApplicationContext("classpath*:config/ApplicationContextProducror.xml");
cfg.start();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
System.out.println("按任意键退出,时间:"+sdf.format(date));
//保证服务始终开启
System.in.read();
}
}
服务消费者
pom.xml,依赖的jar包
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wpb.dubbo</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- <packaging>war</packaging> -->
<properties>
<spring.version>4.1.3.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.4.10</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.3</version>
</dependency>
</dependencies>
</project>
ApplicationContextCustomer.xml,通过Spring配置引用远程服务
<?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://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
">
<!-- 消费者名称 -->
<dubbo:application name="customer"/>
<!-- 用zookeeper注册服务中心发现服务地址 -->
<dubbo:registry protocol="zookeeoer" address="zookeeper://192.168.80.129:2181"/>
<!-- 调用远程的接口 -->
<dubbo:reference id="dubboProvider" interface="com.dubbo.service.DubboProvide"/>
</beans>
CustomerMain.java,加载Spring配置,并调用远程服务
package com.dubbo.main;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.dubbo.service.DubboProvide;
public class CustomerMain {
public static void main(String[] args) throws InterruptedException{
ClassPathXmlApplicationContext cfig = new ClassPathXmlApplicationContext("classpath*:config/ApplicationContextCustomer.xml");
DubboProvide test = (DubboProvide) cfig.getBean("dubboProvider");
System.out.println("消费者调用服务方接口开始");
test.sayHello();
Thread.sleep(100000);
System.out.println("消费者调用服务方接口结束");
}
}
完成后,分别将提供者和消费者程序启动,可以在管理控制台查看其效果。
管理控制台的效果
输入网址:http://192.168.80.129:8080
进入管理控制台页面:
输入服务名com.dubbo.service.DubboProvide,回车可以看到提供者页面:
消费者页面:
应用页面:
demo到此告一段落,更多学习请期待后面博文。
注:
如果提供者和消费者的配置文件报错的话,可以用以下方案解决。
下载一个dubbo.xsd文件
Windows->Preference->Xml->Xml Catalog
Add->Catalog Entry->File System 选择刚刚下载的文件路径
修改key值和配置文件的http://code.alibabatech.com/schema/dubbo/dubbo.xsd相同
保存,在XML文件右击validate便可以解决。
注:已将Demo和dubbo.xsd上传资源,欢迎下载使用。