====== 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|}}