这是本文档旧的修订版!
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
官网:dubbo.io
其核心部分包含:
Dubbo能做什么?
使用zookeeper作为注册中心,server项目注册服务UserService,client项目消费服务UserService
注意:server-service模块必须deploy到nexus上,让消费项目依赖
<!-- dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> <exclusions> <exclusion> <artifactId>spring</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>commons-logging</artifactId> <groupId>commons-logging</groupId> </exclusion> <exclusion> <artifactId>log4j</artifactId> <groupId>log4j</groupId> </exclusion> </exclusions> </dependency> <!-- zkclient --> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> <exclusions> <exclusion> <artifactId>junit</artifactId> <groupId>junit</groupId> </exclusion> <exclusion> <artifactId>log4j</artifactId> <groupId>log4j</groupId> </exclusion> </exclusions> </dependency>
<?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应用名称 --> <dubbo:application name="server" /> <!-- dubbo注册地址 --> <dubbo:registry address="zookeeper://121.40.171.96:2181" /> <!-- dubbo注册端口 --> <dubbo:protocol name="dubbo" port="-1" /> <!-- 监听注册 --> <dubbo:monitor protocol="registry" /> <!-- dubbo对外开放接口 --> <dubbo:service interface="com.gxx.dubbo.server.service.UserService" ref="userService" version="1.0.0" retries="0" timeout="10000" /> </beans>
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); }
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需要依赖server-service模块
<!-- dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> <exclusions> <exclusion> <artifactId>spring</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>commons-logging</artifactId> <groupId>commons-logging</groupId> </exclusion> <exclusion> <artifactId>log4j</artifactId> <groupId>log4j</groupId> </exclusion> </exclusions> </dependency> <!-- zkclient --> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> <exclusions> <exclusion> <artifactId>junit</artifactId> <groupId>junit</groupId> </exclusion> <exclusion> <artifactId>log4j</artifactId> <groupId>log4j</groupId> </exclusion> </exclusions> </dependency> <!-- 依赖其他模块开始 --> <dependency> <groupId>com.gxx.dubbo</groupId> <artifactId>server-service</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!-- 依赖其他模块结束 -->
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns="http://www.springframework.org/schema/beans" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"> <!-- dubbo应用名称 --> <dubbo:application name="client" /> <!-- dubbo注册地址 --> <dubbo:registry address="zookeeper://121.40.171.96:2181" /> <!-- 消费接口类开始 --> <dubbo:reference id="userService" cluster="failfast" interface="com.gxx.dubbo.server.service.UserService" lazy="true" check="false" version="1.0.0" timeout="10000" /> <!-- 消费接口类结束 --> </beans>
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); }
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); } }
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=林琼英, 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]查询用户!