Apache Dubbo 源码搭建与解读(一)—— Dubbo架构

Apache Dubbo 源码搭建与解读(一)

Apache Dubbo 源码搭建与解读(二)

Apache Dubbo 源码搭建与解读(三)

Apache Dubbo 源码搭建与解读(四)

文章目录

  • Apache Dubbo
  • Apache Dubbo 架构
  • Dubbo 架构特点
    • 连通性
    • 健壮性
    • 伸缩性
    • 升级性
  • Dubbo的使用

Apache Dubbo

Apache Dubbo是一款高性能、轻量级的开源 Java RPC 框架,它提供了三大核心能力:

  • 面向接口的远程方法调用;

  • 可靠、智能的容错和负载均衡;

  • 服务自动注册和发现能力。

Apache Dubbo 源码搭建与解读(一)—— Dubbo架构_第1张图片

简单地说, Dubbo 是一个分布式服务框架,致力于提供高性能、透明化的 RPC 远程服务调用方案以及服务治理方案,以帮助我们解决微服务架构落地时的问题。

Apache Dubbo 架构

Apache Dubbo 源码搭建与解读(一)—— Dubbo架构_第2张图片

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

  • Registry:注册中心。 负责服务地址的注册与查找,服务的 Provider 和 Consumer 只在启动时与注册中心交互。注册中心通过长连接感知 Provider 的存在,在 Provider 出现宕机的时候,注册中心会立即推送相关事件通知 Consumer。

  • Provider:服务提供者。 在它启动的时候,会向 Registry 进行注册操作,将自己服务的地址和相关配置信息封装成 URL 添加到 ZooKeeper 中。

  • Consumer:服务消费者。 在它启动的时候,会向 Registry 进行订阅操作。订阅操作会从 ZooKeeper 中获取 Provider 注册的 URL,并在 ZooKeeper 中添加相应的监听器。获取到 Provider URL 之后,Consumer 会根据负载均衡算法从多个 Provider 中选择一个 Provider 并与其建立连接,最后发起对 Provider 的 RPC 调用。 如果 Provider URL 发生变更,Consumer 将会通过之前订阅过程中在注册中心添加的监听器,获取到最新的 Provider URL 信息,进行相应的调整,比如断开与宕机 Provider 的连接,并与新的 Provider 建立连接。Consumer 与 Provider 建立的是长连接,且 Consumer 会缓存 Provider 信息,所以一旦连接建立,即使注册中心宕机,也不会影响已运行的 Provider 和 Consumer。

  • Monitor:监控中心。 用于统计服务的调用次数和调用时间。Provider 和 Consumer 在运行过程中,会在内存中统计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。监控中心在上面的架构图中并不是必要角色,监控中心宕机不会影响 Provider、Consumer 以及 Registry 的功能,只会丢失监控数据而已。

Dubbo 架构特点

连通性

  • 注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小
  • 监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示
  • 服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销
  • 服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销
  • 注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外
  • 注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者
  • 注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表
  • 注册中心和监控中心都是可选的,服务消费者可以直连服务提供者

健壮性

  • 监控中心宕掉不影响使用,只是丢失部分采样数据
  • 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
  • 注册中心对等集群,任意一台宕掉后,将自动切换到另一台
  • 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
  • 服务提供者无状态,任意一台宕掉后,不影响使用
  • 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复

伸缩性

  • 注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心
  • 服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者

升级性

当服务集群规模进一步扩大,带动IT治理结构进一步升级,需要实现动态部署,进行流动计算,现有分布式服务架构不会带来阻力。下图是未来可能的一种架构:
Apache Dubbo 源码搭建与解读(一)—— Dubbo架构_第3张图片
节点角色说明

节点 角色说明
Deployer 自动部署服务的本地代理
Repository 仓库用于存储服务应用发布包
Scheduler 调度中心基于访问压力自动增减服务提供者
Admin 统一管理控制台
Registry 服务注册与发现的注册中心
Monitor 统计服务的调用次数和调用时间的监控中

Dubbo的使用

  • dubbo本身并不是一个服务软件。它其实就是一个jar包能够帮你的java程序连接到zookeeper,并利用zookeeper消费、提供服务。所以你不用在Linux上启动什么dubbo服务。
  • 但是为了让用户更好的管理监控众多的dubbo服务,官方提供了一个可视化的监控程序,不过这个监控即使不装也不影响使用

那dubbo和zookeeper如何引入?

  • dubbo其实是一组jar包,通过maven引入就可以。
  • zookeeper是一个开源的服务软件,需要安装到linux中。

安装zookeeper

  • zookeeper:注册中心,必须有。
  • 开源镜像下载地址:http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.14/
  • 解压到本地
  • 打开\zookeeper-3.4.14\bin目录中的zkServer.cmd,会出现闪退的现象
  • 找到zookeeper-3.4.14\conf目录中的zoo_scmple.cfg文件,复制一份,重命名为zoo.cfg
  • 再次打开zkServer.cmd服务端,然后打开zkCli.cfg客户端,既可以连接上。

安装Dubbo

  • dubbo-admin:是一个监控管理后台,查看我们注册了哪些服务,哪些服务被消费了,可有可无。
  • 下载地址https://github.com/apache/dubbo-admin/tree/master
  • 解压到本地,可以看到是个maven项目。
  • 从cmd进入dubbo-admin-master目录下。
  • 执行maven命令:mvn clean package -Dmaven.test.skip=true,即可打包
  • 在dubbo-admin-master\dubbo-admin\target目录生成了jar包。
  • 使用dubbo之前,一定要先打开zookpeer服务端。在运行jar包。
  • 运行之后,浏览器输入localhost:7001访问,默认用户名和密码d都是root

SpringBoot整合dubbo和zookeeper

provider


<dependency>
    <groupId>org.apache.dubbogroupId>
    <artifactId>dubbo-spring-boot-starterartifactId>
	<version>2.7.3version>
dependency>

<dependency>
    <groupId>com.github.sgroschupfgroupId>
    <artifactId>zkclientartifactId>
    <version>0.1version>
dependency>


<dependency>
    <groupId>org.apache.curatorgroupId>
    <artifactId>curator-frameworkartifactId>
    <version>2.12.0version>
dependency>
<dependency>
    <groupId>org.apache.curatorgroupId>
    <artifactId>curator-recipesartifactId>
    <version>2.12.0version>
dependency>
<dependency>
    <groupId>org.apache.zookeepergroupId>
    <artifactId>zookeeperartifactId>
    <version>3.3.3version>
    
    <exclusions>
	    <exclusion>
          <groupId>org.slf4jgroupId>
          <artifactId>slf4j-log4j12artifactId>
        exclusion>
    exclusions>
dependency>
  • 编写相关的服务类,并在这个类上加注解@Service和@Component,注意:@service注解必须是要org.apache.dubbo.config.annotation.Service,而不是spring的注解。

  • 在配置文件中编写相关信息

spring.dubbo.application.name=provider-server
spring.dubbo.registry.protocol=zookeeper
spring.dubbo.registry.address=192.168.222.20:2181
spring.dubbo.base-package=com.base.package
spring.dubbo.protocol.name=dubbo

application.name就是服务名,不能跟别的dubbo提供端重复
registry.protocol 是指定注册中心协议
registry.address 是注册中心的地址加端口号
protocol.name 是分布式固定是dubbo,不要改。
base-package 注解方式要扫描的包
port 是服务提供端为zookeeper暴露的端口,不能跟别的dubbo提供端重复

  • 在启动类上加上@EnableDubbo这个注解
  • 打开zkServer,并运行jar包,浏览器输入localhost:7001即可看到服务。

消费端

  • 引入相同依赖

  • 配置文件

spring.dubbo.application.name=consumer-server
spring.dubbo.registry.protocol=zookeeper
spring.dubbo.registry.address=192.168.222.20:2181
spring.dubbo.base-package=com.base.package
spring.dubbo.protocol.name=dubbo
spring.dubbo.consumer.timeout=10000
spring.dubbo.consumer.check=false

consumer.timeout 是访问提供端服务的超时时间,默认是1000毫秒
consumer.check 是启动消费端时,是否检查服务端能否正常访问。如果选择true,那启动消费端时,必须保证提供端服务正常,否则接口无法注入。

消费端使用起来也比较简单,只要把原来@Autowired改成@Reference就可以 注意引用的包是

com.alibaba.dubbo.config.annotation.Reference

你可能感兴趣的:(Apache,Dubbo,zookeeper,大数据,分布式,数据库,java)