Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。关于注册中心、协议支持、服务监控等内容,详见后面描述。
官网的依赖图:
- 图中小方块Protocol, Cluster, Proxy, Service, Container, Registry, Monitor代表层或模块,蓝色的表示与业务有交互,绿色的表示只对Dubbo内部交互。
- 图中背景方块Consumer, Provider, Registry, Monitor代表部署逻辑拓普节点。
- 图中蓝色虚线为初始化时调用,红色虚线为运行时异步调用,红色实线为运行时同步调用。
- 图中只包含RPC的层,不包含Remoting的层,Remoting整体都隐含在Protocol中。
这是一个maven项目,可以自己新建一个maven项目,也可以直接导入。为了让项目正常跑起来,jdbc.propperties里边的jdbc.url和jdbc.password。jdbc.password并不是你现在使用的明文密码,这个密码是经过driud里边的工具加密的(这个地方我用的时候纠结了好久)。
public static void main(String[] args) {
try {
System.out.println(ConfigTools.encrypt("你的明文密码"));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
还要用doc目录下的sql创建相应的表和添加数据,就不赘述了。
首先,改造后dubbo服务调用方式的工程结构
edu-common-parent ------------Maven父配置
edu-facade-user ------------用户服务接口
edu-service-user ------------用户服务实现
edu-web-boss ------------服务消费者
下面开始介绍如何分割传统项目。
1.创建一个maven父项目。填写相应的信息,在下面这一步的时候选择 site-simple就好了。创建完了跟传统项目一样添加相应的maven jar包依赖。
2. 创建3个maven module,就是上面的edu-facade-user、edu-service-user和edu-web-boss 。
项目结构如下所示
在edu-facade-user里边主要是原项目的一些实体类和接口,最主要的就是要暴露的服务的接口PmsUserFacade,其实就是把原来的biz里边的方法抽象成一个接口。
edu-service-user里边主要是原项目的service和dao的一些类,还有就是现实上面那个PmsUserFacade接口。
在edu-service-user里边需要原项目的所有的配置文件,包括mybatis和spring的。此外还需要添加一个dubbo-provider.xml文件并在spring配置中import。
<?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="gw-service-user" />
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry protocol="zookeeper" address="192.168.1.105:2181" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 用户服务接口 -->
<dubbo:service interface="wusc.edu.facade.user.service.PmsUserFacade" ref="pmsUserFacade" />
</beans>
这个模块可以打成jar包单独运行也可以在tomcat中运行。在测试的时候,是写一个测试类就可以了。
public class DubboProvider {
private static final Log log = LogFactory.getLog(DubboProvider.class);
public static void main(String[] args) {
try {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/spring-context.xml");
context.start();
} catch (Exception e) {
log.error("== DubboProvider context start error:",e);
}
synchronized (DubboProvider.class) {
while (true) {
try {
DubboProvider.class.wait();
} catch (InterruptedException e) {
log.error("== synchronized error:",e);
}
}
}
}
}
edu-web-boss主要是原项目的控制层的东西。也需要添加dubbo的相应配置dubbo-consumer.xml。
<?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="edu-web-boss" />
<!-- 使用zookeeper注册中心暴露服务地址 -->
<!-- 注册中心地址 -->
<dubbo:registry protocol="zookeeper" address="192.168.1.105:2181" />
<!-- 用户服务接口 -->
<dubbo:reference interface="wusc.edu.facade.user.service.PmsUserFacade" id="pmsUserFacade" check="false" />
</beans>
启动zookeeper可以跑一下了,成功~