dubbo是一个微服务框架,dubbo也是有一个服务注册中心(Zookeeper),服务提供者以及服务消费者。服务提供者需要一个暴露接口的工程,用来服务消费的调用。服务提供者的接口实现类继承暴露接口工程的接口。
dubbo调用流程
1.服务容器负责启动,加载,运行服务提供者
2.服务提供者在启动时,向注册中心注册自己提供的服务
3.服务消费者在启动时,向注册中心订阅自己所需的服务
4.注册中返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
5.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用
6.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计到监测中心
注:建议使用Zookeeper来当注册中心比较好(2.3.3的dubbo以上),Dubbo未对Zookeeper服务端做任何侵入修改,只需按照原生的Zookeeper即可
所有注册中心逻辑适配都在调用Zookeeper客户端时完成
dubbo还可以使用dubbo-admin进行dubbo服务的监控,只需下载dubbo-admin-2.5.7.war,放在Tomcat上启动工程,然后修改dubbo-admin项目中WEB-INF/dubbo.properties中zookeeper地址、用户名以及密码即可。
接下来就简单的讲述下一个dubbo的使用案例
一、工程项目说明
dubbo-facade-user项目工程是一个服务接口暴露项目工程,服务提供者的服务类继承此项目的对应接口,同时服务消费者会依赖此工程进行服务的调用。
即:服务提供者中的提供服务类PmsUserFacadeImpl 继承 服务暴露接口项目的PmsUserFacade接口
dubbo-service-user 服务提供者
dubbo-web-boss 服务消费者
二、服务提供者的使用
1、pom.xml依赖
<!-- spring包 core、web、oxm、tx、jdbc、webmvc、aop、context、test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<!-- dubbo -->
<dependency>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
</dependency>
这边只有dubbo和Spring的依赖,其他的想数据库、JSON处理的依赖就不在这具体说明了,本篇只是说明dubbo的使用,不讲述具体的业务代码
2、业务接口实现类的PmsUserFacadeImpl
@Service("pmsUserFacade")
public class PmsUserFacadeImpl implements PmsUserFacade{
@Autowired
private PmsUserBiz pmsUserBiz;//dao层
/**
* 根据ID获取用户信息.
* @param userId
* @return
*/
public PmsUser getById(Long userId) {
return pmsUserBiz.getById(userId);
}
}
3、继承的接口类PmsUserFacade
public interface PmsUserFacade {
/**
* 根据ID获取用户信息.
* @param userId
* @return
*/
public PmsUser getById(Long userId);
}
4、spring的配置文件
<!-- 提供方应用信息,用于计算依赖关系(相当于服务名称) -->
<dubbo:application name="gw-service-user" />
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry protocol="zookeeper" address="${zookeeper-server-address}" />
<!-- 用dubbo协议在20880端口暴露服务(Dubbo中有各种协议,这只是其中的一种) -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 用户服务接口 -->
<dubbo:service interface="com.zhuojing.facade.user.service.PmsUserFacade" ref="pmsUserFacade"/>
5、启动类
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
*
* @描述: 启动Dubbo服务用的MainClass.
* @作者: WuShuicheng .
* @创建时间: 2013-11-5,下午9:47:55 .
* @版本: 1.0 .
*/
@SuppressWarnings("resource")
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);
}
}
}
}
}
三、服务的消费者
1、pom.xml依赖
在服务消费者的pom.xml依赖的基础上依赖接口暴露的jar包dubbo-facade-user
2、Spring配置文件
<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
<dubbo:application name="edu-web-boss" />
<!-- 使用zookeeper注册中心暴露服务地址 -->
<!-- 注册中心地址 -->
<dubbo:registry protocol="zookeeper" address="${zookeeper-server-address}" />
<!-- 用户服务接口,check等于false表示调用时候才去检查dubbo服务是否启动,true则项目运行就检查-->
<dubbo:reference interface="com.zhuojing.facade.user.service.PmsUserFacade" id="pmsUserFacade" check="false"/>
3、服务消费者的调用
@Controller
public class PmsUserAction extends BaseAction {
@Autowired
private PmsUserFacade pmsUserFacade;
@RequestMapping("test.action")
@ResponseBody
public PmsUser viewPmsUserUI(ModelMap model) {
PmsUser pmsUser = pmsUserFacade.getById(userId);
return pmsUser;
}
}
服务提供者和服务消费者启动后可以在Dubbo的管理平台上可以看到