用户工具

站点工具


分享:技术:dubbo:dubbo项目示例

dubbo项目示例

介绍

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。

官网:dubbo.io

其核心部分包含:

  • 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
  • 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
  • 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

Dubbo能做什么?

  • 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
  • 软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
  • 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

示例项目

使用zookeeper作为注册中心,server项目注册服务UserService,client项目消费服务UserService

server项目

注意:server-service模块必须deploy到nexus上,让消费项目依赖

pom.xml

pom.xml
			<!-- 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>

application-provider.xml

application-provider.xml
<?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>

UserService.java

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

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

pom.xml
			<!-- 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>
			<!-- 依赖其他模块结束 -->

application-consumer.xml

application-consumer.xml
<?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>

RemoteService.java

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

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

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-admin

server-web和client-web都部署之后,在zookeeper管理界面dubbo-admin上可以看到,consumer和provider的信息

附源码

生成archetype原型

生成archetype,以后有相关项目可以根据原型生成,速度比较快。

分享/技术/dubbo/dubbo项目示例.txt · 最后更改: 2020/08/07 01:39 由 gxx