概述:

Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统,可提供的服务主要有:配置服务、名字服务、分布式同步、组服务等。

Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

Spring框架:

◆目的:解决企业应用开发的复杂性

◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能

◆范围:任何Java应用,Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。

以下是dubbo服务调用的示例图,其中zookeeper充当Registry注册中心。

dubbos使用zookeeper了吗 dubbo zookeeper springboot_Dubbo

实战部署

1.zookeeper启动

zookeeper的配置文件在conf文件夹下的zoo.cfg,如果没有就从zoo_sample复制一个。里面可以配置如tickTime(心跳时间)、initLimit、syncLimit、dataDir(数据存放目录)、clientPort(端口号)、maxClientCnxns(最大客户机连接数)等,配置好后在bin目录启动zookeeper。

2.创建springboot项目(略)

使用eclipse的小伙伴请参看

3.引入相应jar包

<!-- //dubbo-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
            <exclusions>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.alibaba</groupId>
                    <artifactId>fastjson</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- //zookeeper-->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        <!-- //dubbo-->

4.springBoot连接zookeeper,并发布服务

在resources目录下创建提供者的配置文件

dubbos使用zookeeper了吗 dubbo zookeeper springboot_SpringBoot_02

<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:application name="xixi_provider"/>
	<!-- 使用zookeeper注册中心暴露服务地址 -->
	<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/>
	<!-- 用dubbo协议在20880端口暴露服务 -->
	<dubbo:protocol name="dubbo" port="20880"/>
	<!-- 声明需要暴露的服务接口 -->
	<dubbo:service interface="com.goods.search.service.SearchService" ref="searchService"/>
    <!-- 具体的实现bean -->
    <bean id="searchService" class="com.goods.search.serviceImpl.SearchServiceImpl"/>
</beans>

以配置文件的形式看上去比较清楚,主要配置了提供方应用信息,zookeeper注册地址,dubbo协议的端口号,以及暴露的服务接口和接口实现的位置

接下来看一下发布的接口和接口实现

dubbos使用zookeeper了吗 dubbo zookeeper springboot_SpringBoot_03

接口定义,与普通接口没有区别,定义想要实现的接口即可

public interface SearchService {
	 SearchResponseDTO search(SearchRequestDTO searchRequestDTO);
}

 接口实现类(注意点:@Service注解要采用dubbo的注解,这样才能被dubbo管理)

import com.alibaba.dubbo.config.annotation.Service;

@Service
public class SearchServiceImpl implements SearchService {

	private static Logger logger = LoggerFactory.getLogger(SearchServiceImpl.class);

	@Override
	@ResponseBody
	public SearchResponseDTO search(SearchRequestDTO searchRequestDTO) {
		logger.info("开始查询数据----------");
        //具体代码略
    }
}

——————————————————————————————————————————————————————

5.再构建一个springBoot项目,作为服务消费者

在resources目录下创建消费者的配置文件consumer.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:application name="dubbo-consumer" />
	<!-- 连接注册中心配置 -->
	<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />
	<!--dubbo注解所在的包信息-->
	<dubbo:annotation package="com.goods.display.controller"/>
	<!-- 生成远程服务代理,interface:调用服务接口名 -->
	<dubbo:reference id="searchService" interface="com.goods.search.service.SearchService" />
</beans>

注意:服务的消费者和生产者的接口路径应相同,否则zookeeper无法定位服务的地址,如这里的“com.goods.search.service.SearchService”应相同。

dubbos使用zookeeper了吗 dubbo zookeeper springboot_zookeeper_04

通过dubbo 的@Reference注解引入服务代理,当调用该代理时,dubbo会去注册中心查找相应的服务实现,提供rpc远程服务。

import com.alibaba.dubbo.config.annotation.Reference;

@Controller
public class DisplayController {
	private static Logger logger = LoggerFactory.getLogger(DisplayController.class);

	@Reference
	SearchService searchService;

	/**
	 * @Description: 分页查询商品信息
	 * @author chenwb
	 * @date 2019/2/22 13:26
	 * @param searchRequestDTO
	 * @return SearchResponseDTO
	 */
	@RequestMapping(value = "/search",method = RequestMethod.POST)
	@ResponseBody
	public SearchResponseDTO search(@RequestBody SearchRequestDTO searchRequestDTO){
		SearchResponseDTO searchResponseDTO =  searchService.search(searchRequestDTO);
		if(searchResponseDTO.getTotal() == 0){
			return searchResponseDTO;
		}
		for(Product product:searchResponseDTO.getProducts()){
			product.setProductImg(product.getProductImg().split(",")[0]);
		}
		logger.info("商品数量{}",searchResponseDTO.getProducts().size());
		return searchResponseDTO;
	}

此时运行项目,打开zk查看器,可以看到相应的服务

dubbos使用zookeeper了吗 dubbo zookeeper springboot_Dubbo_05

注意事项:远程调用传输的DTO需实现Serializable序列化接口,否则会报错

结果展示:

consumer日志

dubbos使用zookeeper了吗 dubbo zookeeper springboot_zookeeper_06

 provider日志

dubbos使用zookeeper了吗 dubbo zookeeper springboot_SpringBoot_07

 查询到的商品信息和历史曲线

dubbos使用zookeeper了吗 dubbo zookeeper springboot_dubbos使用zookeeper了吗_08