Dubbo(Dubbox)框架

Dubbo(Dubbox) 框架

简单介绍:

Dubbox 是一个分布式服务框架,其前身是阿里巴巴开源项目 Dubbo ,被国内电商及互联网项目中使用,后期阿里巴巴停止了该项目的维护,当当网便在 Dubbo 基础上进行优化,并继续维护,为了与原有的 Dubbo 区分,故将其命名为 Dubbox。

Dubbox 致力于提供高性能和透明化的RPC 远程服务调用方案,以及 SOA服务治理方案。简单的说,dubbox就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有 dubbox这样的分布式服务框架的需求,并且本质上是个服务调用的东西,其实就是个远程服务调用的分布式框架。

image.png

节点角色说明:

Provider: 暴露服务的服务提供方。Consumer: 调用远程服务的服务消费方。Registry: 服务注册与发现的注册中心。Monitor: 统计服务的调用次调和调用时间的监控中心。Container: 服务运行容器。调用关系说明:

0.服务容器负责启动,加载,运行服务提供者。

1.服务提供者在启动时,向注册中心注册自己提供的服务。

2.服务消费者在启动时,向注册中心订阅自己所需的服务。

3.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

4.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

5.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

注册中心 Zookeeper

Zookeeper  介绍

官方推荐使用 zookeeper 注册中心。注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小Zookeeper 是 Apacahe Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbox 服务的注册中心,工业强度较高,可用于生产环境。

Zookeeper在 Linux  系统的安装
安装步骤:
第一步:安装 jdk
第二步:把 zookeeper 的压缩包(zookeeper-3.4.6.tar.gz)上传到linux
系统。
Alt+P 进入 SFTP ,输入 put d:\zookeeper-3.4.6.tar.gz 上传
第三步:解压缩压缩包
tar -zxvf zookeeper-3.4.6.tar.gz
第四步:进入 zookeeper-3.4.6 目录,创建 data 文件夹。
mkdir data
第五步:进入 conf目录 ,把 zoo_sample.cfg 改名为 zoo.cfg
cd conf
mv zoo_sample.cfg zoo.cfg
第六步:打开 zoo.cfg , 修改 data 属性:dataDir=/root/zookeeper-3.4.6/data
Zookeeper  服务启动
进入 bin目录,启动服务输入命令
./zkServer.sh start
关闭服务输入命令
./zkServer.sh stop
查看状态:
./zkServer.sh status

关于Dubbo的帮助文档以及快速上手见dubbo官网http://dubbo.apache.org/zh-cn/docs/user/quick-start.html

<!--1.导入依赖jar包-->
<!-- 集中定义依赖版本号 -->
   <properties>
       <junit.version>4.12</junit.version>
       <spring.version>4.2.4.RELEASE</spring.version>
       <pagehelper.version>4.0.0</pagehelper.version>
       <servlet-api.version>2.5</servlet-api.version>
       <dubbo.version>2.8.4</dubbo.version>
       <zookeeper.version>3.4.7</zookeeper.version>
       <zkclient.version>0.1</zkclient.version>
       <mybatis.version>3.2.8</mybatis.version>
       <mybatis.spring.version>1.2.2</mybatis.spring.version>
  <mybatis.paginator.version>1.2.15</mybatis.paginator.version>
       <mysql.version>5.1.32</mysql.version>
       <druid.version>1.0.9</druid.version>
       <commons-fileupload.version>1.3.1</commons-fileupload.version>
       <freemarker.version>2.3.23</freemarker.version>
       <activemq.version>5.11.2</activemq.version>
       <security.version>3.2.3.RELEASE</security.version>
       <solrj.version>4.10.3</solrj.version>
       <ik.version>2012_u6</ik.version>
   </properties>
 
     <!-- dubbo相关 -->
       <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>dubbo</artifactId>
           <version>${dubbo.version}</version>
       </dependency>
       <dependency>
           <groupId>org.apache.zookeeper</groupId>
           <artifactId>zookeeper</artifactId>
           <version>${zookeeper.version}</version>
       </dependency>
       <dependency>
           <groupId>com.github.sgroschupf</groupId>
           <artifactId>zkclient</artifactId>
           <version>${zkclient.version}</version>
       </dependency>
       <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>4.9</version>
       </dependency>
       <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>fastjson</artifactId>
           <version>1.2.28</version>
       </dependency>
       <dependency>
           <groupId>javassist</groupId>
           <artifactId>javassist</artifactId>
           <version>3.11.0.GA</version>
       </dependency>
       <dependency>
           <groupId>commons-codec</groupId>
           <artifactId>commons-codec</artifactId>
           <version>1.10</version>
       </dependency>
       <dependency>
           <groupId>javax.servlet</groupId>
           <artifactId>servlet-api</artifactId>
           <version>2.5</version>
           <scope>provided</scope>
       </dependency>
       <dependency>
           <groupId>com.github.pagehelper</groupId>
           <artifactId>pagehelper</artifactId>
           <version>${pagehelper.version}</version>
       </dependency>
服务者的配置和使用:
<!--服务层在applicationContext-service.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:p="http://www.springframework.org/schema/p"      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
   <!--提供服务  20881 dubbo向外提供服务时的端口号  默认是20880-->
   <dubbo:protocol name="dubbo" port="20881"></dubbo:protocol>
   <!--连接zookeeper-->
   <dubbo:application name="chenqi-sellergoods-service"/>
   <dubbo:registry address="zookeeper://192.168.25.128:2181"/>
   <!--dubbo:annotation是对<context:component-scan base-package=""增强 开启注解扫描 作用:扫描该目录下的服务,注册到Zookeeper注册中心,给消费者使用!-->
   <dubbo:annotation package="com.test.sellergoods.service.impl"/>
   <dubbo:provider timeout="50000"/>
</beans>

<!--web.xml配置-->
<!-- 加载spring容器 -->
   <listener>
       <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
   </listener>
   <context-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>classpath*:spring/applicationContext*.xml</param-value>
   </context-param>
// 注意服务类的写法!!!
// @Service注解用 com.alibaba.dubbo.config.annotation.Reference;
// 作用:暴露服务
@Service
public class BrandServiceImpl implements BrandService {

   @Autowired
   private TbTestMapper testMapper;
 ........
}
消费者的配置和使用
<!--在springmvc.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:p="http://www.springframework.org/schema/p"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
  <!--导入配置文件-->
   <context:property-placeholder location="classpath:config/application.properties" />
 
  <!-- 引用dubbo 服务 -->
  <dubbo:application name="chenqi-manager-web" />
  <dubbo:registry address="zookeeper://192.168.25.128:2181"/>

  <!--dubbo:annotation是对<context:component-scan base-package=""增强 也就是开启注解扫描 ,扫描该包下的消费者-->
  <dubbo:annotation package="com.test.manager.controller" />

  <!--放行静态资源-->
  <mvc:default-servlet-handler/>
</beans>

<!--web.xml配置-->
   <servlet>
       <servlet-name>springmvc</servlet-name>
       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
       <!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载-->
       <init-param>
           <param-name>contextConfigLocation</param-name>
           <param-value>classpath:spring/springmvc.xml</param-value>
       </init-param>
   </servlet>
   <servlet-mapping>
       <servlet-name>springmvc</servlet-name>
       <url-pattern>/</url-pattern>
   </servlet-mapping>
// 注意处理器的写法!!!
@Controller
@RequestMapping("/test")
public class BrandController {
   @Reference // 作用:消费者调用注册到zookeeper的服务 不要用@Autowired!!!
   private TestService service;
}

一句话总结Dubbox和Zookeeper:

Dubbox干嘛的:一个分布式框架 解决高并发问题 可以分担服务器压力

Zookeeper干嘛的:注册中心,服务注册到注册中心供消费者调用

发表评论