想要理解dubbo,可以先理解httpclient。

httpclient的过程是:客户端发送请求到系统A,系统A通过httpclient向系统B提供的接口进行访问。

dubbo的过程也是类似的,只是把httpclient改为dubbo了。

dubbo的体系是:

容器(spring),生产者(接口与实现类),注册中心(zookeeper),消费者(注入一个接口),监控(dubbo-monitor-simple-2.5.3),管理(dubbo-admin-2.8.4.war)

过程是:生产者的实现类会在spring容器中。生产者在zookeeper上注册一个接口(这个接口在生产者里面必定有一个实现类),并在dubbo协议里面暴露。消费者也通过与zookeeper的注册,通过接口名,去zookeeper中找到对应的接口,然后调用接口在生产者上对应的实现类。监控只是注册在生产者一端。

一个简单的例子:

前台系统在某些条件下会通过拦截器中去访问单点登录系统,目的是查询用户是否已经登录,以前我们用的方法是让前台系统(消费者)通过httpclient去调用API,现在我们可以做一个服务工程(目前用的是war,因为它可以被spring管理)。这个服务工程可以理解为生产者,考虑到生产者和消费者之间有共有的部分,所以就创建一个jar,里面只是一些公共部分。

假设服务工程为sso-query-service,公共部分的jar工程为sso-query-service-api。

sso-query-service-api中只有实体类User和一个接口UserQueryService,接口中也只有一个queryUserByToken(String token)方法。
sso-query-service作为web工程,是为了在tomcat启动时,加载spring父容器,另外一个考虑是可以使用controller,让前台也能通过ajax或jsonp直接访问。
该web工程定义了一个UserController,专门用于前台http访问,
@RequestMapping("user")
 @Controller
 public class UserController {@Autowired
private UserQueryService userQueryService;//这个接口来自sso-query-service-api工程

@RequestMapping(value = "{token}", method = RequestMethod.GET)
public ResponseEntity<User> queryUserByToken(@PathVariable("token") String token) {
try {
User user = this.userQueryService.queryUserByToken(token);
if (null == user) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
}
return ResponseEntity.ok(user);
} catch (Exception e) {
}
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
 }
 }另外还定义了一个UserQueryService 的实现类
//@Service因为在dubbo-server.xml中注册了,tomcat启动时会启动spring父容器
 public class UserQueryServiceImpl implements UserQueryService {

@Autowired
private RedisService redisService;

private static final String KEY = "TOKEN_";

@Override
public User queryUserByToken(String token) {
User user = (User) redisService.get(KEY + token);
if (user == null) {
return null;
}
// 重新设置token过期时间
redisService.expire(KEY + token, 30L);
return user;
}
 }接下去就是dubbo-server.xml了:
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="sso-query-server" />自定义

<!-- 这里使用的注册中心是zookeeper -->
<dubbo:registry address="zookeeper://192.168.48.131:2182?backup=192.168.48.131:2181,192.168.48.131:2183" client="zkclient" />


<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />


<!-- 将该接口暴露到dubbo中 -->
<dubbo:service interface="sso.query.api.UserQueryService " ref="userQueryServiceImpl" />


<!-- 将具体的实现类加入到Spring容器中 -->
<bean id="userQueryServiceImpl" class="sso.query.service.UserQueryServiceImpl" />

<dubbo:monitor protocol="registry"/> 添加一个监听这样启动tomcat,就把dubbo服务启动了。
前台系统首先要配置一个dubbo-consumer.xml:
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="taotao-web" />

<!-- 这里使用的注册中心是zookeeper -->
<dubbo:registry address="zookeeper://192.168.48.131:2182?backup=192.168.48.131:2181,192.168.48.131:2183" client="zkclient" />

<!-- 从注册中心中查找服务 -->
<dubbo:reference id="userQueryService"
interface="sso.query.api.UserQueryService" />这个interface要与dubbo-server.xml中的对应,这样才能找到做了这个配置后,要在web.xml中追加<param-value>classpath:spring/applicationContext*.xml,classpath:dubbo/dubbo*.xml</param-value>
最后在前台系统原本使用httpclient去调用单点登录系统的API接口的方式改为注入一个UserQueryService,调用这个接口的queryUserByToken(String token)即可,最终是由UserQueryServiceImpl提供服务。
总结:dubbo其实与httpclient很类似,只不过从webservice(Restful)的方式改为RPC方式
-----------------------------------------------------------------------------
关于监控的配置主要是解压dubbo-monitor-simple-2.5.3后,修改dubbo.properties,
dubbo.registry.address=zookeeper://192.168.48.131:2181?client=zkclient
dubbo.jetty.port=8282这个端口视情况修改。
关于服务,主要是将dubbo-admin-2.8.4.war解压,然后找一个tomcat,去掉webapps中ROOT中的内容,将解压的东西拷贝进去(webapps会自动解压,ROOT中不会),然后修改ROOT-->WEB-INF-->dubbo.properties
主要是修改dubbo.registry.address=zookeeper://192.168.48.131:2181?client=zkclient。最后启动tomcat,xxx:8080就能访问了,账号root,密码root
----------------------------------------------------------
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>


<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>xxx</version>
</dependency>


<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>xxx</version>
</dependency>