概述:
Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统,可提供的服务主要有:配置服务、名字服务、分布式同步、组服务等。
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
Spring框架:
◆目的:解决企业应用开发的复杂性
◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
◆范围:任何Java应用,Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
以下是dubbo服务调用的示例图,其中zookeeper充当Registry注册中心。
实战部署
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目录下创建提供者的配置文件
<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协议的端口号,以及暴露的服务接口和接口实现的位置
接下来看一下发布的接口和接口实现
接口定义,与普通接口没有区别,定义想要实现的接口即可
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”应相同。
通过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查看器,可以看到相应的服务
注意事项:远程调用传输的DTO需实现Serializable序列化接口,否则会报错
结果展示:
consumer日志
provider日志
查询到的商品信息和历史曲线