====== dubbo项目示例 ======
===== 介绍 =====
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
官网:[[http://dubbo.io/Home-zh.htm|dubbo.io]]
其核心部分包含:
* 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
* 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
* 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
Dubbo能做什么?
* 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
* 软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
* 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。
===== 示例项目 =====
使用zookeeper作为注册中心,server项目注册服务UserService,client项目消费服务UserService
===== server项目 =====
注意:server-service模块必须deploy到nexus上,让消费项目依赖
==== pom.xml ====
com.alibaba
dubbo
2.5.3
spring
org.springframework
commons-logging
commons-logging
log4j
log4j
com.github.sgroschupf
zkclient
0.1
junit
junit
log4j
log4j
==== application-provider.xml ====
==== UserService.java ====
package com.gxx.dubbo.server.service;
import com.gxx.dubbo.server.model.vo.User;
/**
* 用户服务接口
* @author Gxx
*/
public interface UserService {
/**
* 根据id查询用户
* @return
*/
public User selectUserById(int id);
}
==== UserServiceImpl.java ====
package com.gxx.dubbo.server.biz.impl;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.gxx.dubbo.server.dao.UserMapper;
import com.gxx.dubbo.server.model.vo.User;
import com.gxx.dubbo.server.service.UserService;
/**
* 用户服务接口实现类
* @author Gxx
*/
@Service("userService")
public class UserServiceImpl implements UserService {
/**
* 日志处理器
*/
Logger logger = Logger.getLogger(UserServiceImpl.class);
/**
* 用户实体操作类
*/
@Autowired
private UserMapper userMapper;
/**
* 根据id查询用户
* @return
*/
@Override
@Transactional(readOnly = true, propagation = Propagation.REQUIRED)
public User selectUserById(int id) {
return userMapper.selectByPrimaryKey(id);
}
}
===== client项目 =====
注意:client需要依赖server-service模块
==== pom.xml ====
com.alibaba
dubbo
2.5.3
spring
org.springframework
commons-logging
commons-logging
log4j
log4j
com.github.sgroschupf
zkclient
0.1
junit
junit
log4j
log4j
com.gxx.dubbo
server-service
0.0.1-SNAPSHOT
==== application-consumer.xml ====
==== RemoteService.java ====
package com.gxx.dubbo.client.remote.service;
import com.gxx.dubbo.server.model.vo.User;
/**
* 远程服务接口
* @author Gxx
*/
public interface RemoteService {
/**
* 根据id查询用户
* @return
*/
public User selectUserById(int id);
}
==== RemoteServiceImpl.java ====
package com.gxx.dubbo.client.remote.impl;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.gxx.dubbo.client.remote.service.RemoteService;
import com.gxx.dubbo.server.model.vo.User;
import com.gxx.dubbo.server.service.UserService;
/**
* 远程服务接口实现类
* @author Gxx
*/
@Service("remoteService")
public class RemoteServiceImpl implements RemoteService {
/**
* 日志记录器
*/
Logger logger = Logger.getLogger(RemoteServiceImpl.class);
/**
* 用户服务接口
*/
@Autowired
private UserService userService;
/**
* 根据id查询用户
* @return
*/
public User selectUserById(int id) {
return userService.selectUserById(id);
}
}
==== RemoteController.java ====
package com.gxx.dubbo.client.web;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.gxx.dubbo.client.remote.service.RemoteService;
import com.gxx.dubbo.server.model.vo.User;
/**
* 远程控制类
* @author Gxx
*/
@Controller
@RequestMapping("/remote/")
public class RemoteController {
/**
* 日志处理器
*/
private final Logger logger = Logger.getLogger(RemoteController.class);
@Autowired
private RemoteService remoteService;
/**
* 远程查询用户
* @return
*/
@RequestMapping(value = "/get")
public @ResponseBody String get(HttpServletRequest request) {
logger.info("远程查询用户开始~");
User user = remoteService.selectUserById(Integer.parseInt(request.getParameter("id")));
logger.info("远程查询用户结束~");
return user == null ? "查询不到用户!" : user.toString();
}
}
===== 部署测试 =====
把server-web和client-web都部署到tomcat下,访问
http://localhost:9090/client-web/remote/get.htm?id=9
得到
User [id=9, name=lqy, password=123qwe, createDate=20150618, createTime=000000]
可以看到日志client.log
2017-05-30 11:18:49,384 INFO 远程查询用户开始~
2017-05-30 11:18:50,420 INFO 远程查询用户结束~
日志server.log
2017-05-30 11:18:50,005 INFO 接收到消费者请求,根据ID=[9]查询用户!
===== zkui =====
server-web和client-web都部署之后,在zookeeper管理界面zkui上可以看到,consumer和provider的信息
{{:分享:技术:dubbo:1.jpeg?800|}}
===== dubbo-admin =====
server-web和client-web都部署之后,在zookeeper管理界面dubbo-admin上可以看到,consumer和provider的信息
{{:分享:技术:dubbo:3.jpeg?800|}}
{{:分享:技术:dubbo:4.jpeg?800|}}
===== 附源码 =====
{{:分享:技术:dubbo:server.zip|}}
{{:分享:技术:dubbo:client.zip|}}
===== 生成archetype原型 =====
生成archetype,以后有相关项目可以根据原型生成,速度比较快。
{{:分享:技术:dubbo:2.jpeg?800|}}