栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > 架构设计

Dubbo介绍及入门

架构设计 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Dubbo介绍及入门

一、Dubbo背景简介 1、Dubbo演变
  • 单一应用框架(ORM)

    • 当网站流量很小时,只需一个应用,将所有功能,如下单支付等都部署在一起,以减少部署节点和成本。
    • 缺点:单一系统架构,使得在开发过程中,占用的资源越来越多,而且随着流量的增加越来越难以维护。
    • 关键:用于简化增删改查工作量的数据访问呢框架ORM是关键。
  • 垂直应用框架(MVC)

    • 垂直应用架构解决了单一应用架构所面临的扩容问题,流量能够分散到各个子系统当中,且系统的体积可控,一定程度上降低了开发人员之间协同以及维护的成本,提升了开发效率。
    • 优点:扩展容易
    • 缺点:但是在垂直架构中相同逻辑代码需要不断的复制,不能复用。页面修改后,可能造成整个项目重新部署,业务与界面没有分开,随着业务种类增加,怎么解决业务之间的互相调用问题,订单服务器与用户服务器交互效率的问题。
    • 关键:用于加速前端页面开发的web框架MVC是关键。
  • 分布式应用架构(RPC)

    • 当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心。
    • 优点:解决了分布式系统中相互调用的问题。
    • 缺点:假设有100台服务器,50台用户业务服务器,50台订单业务服务器,但是在上线后发现,用户服务器使用率很小,但是订单服务器压力很大,最佳配比应该是1:4,这时候需要有一个统一管理的调度中心(即,注册中心)。
    • 关键:用于提高业务复用及整合的分布式服务框架RPC是关键。
  • 流动计算架构(SOA)

    • 随着服务化的进一步发展,服务越来越多,服务之间的调用和依赖关系也越来越复杂,诞生了面向服务的架构体系(SOA),也因此衍生出了一系列相应的技术,如对服务提供、服务调用、连接处理、通信协议、序列化方式、服务发现、服务路由、日志输出等行为进行封装的服务框架。
    • 关键:用于提高及其利用率资源调度和治理中心SOA是关键。
2、Dubbo前世今生
  • 2011年之前,作为alibaba内部使用框架;
  • 2011年,托管到了GitHub上开源;
  • 2014年11月,发布2.4.11版本后停止更新,此后很多公司开源了自己基于Dubbo的变种版本(例如当当网的Dubbo X,网易考拉的Dubbo K等);
  • 2017年,SpringCloud(分布式框架)横空出世,Dubbo感到压力后连续更新了版本;
  • 2018年1月,阿里联合当当网将Dubbo和Dubbo X合并,发布了2.6版本;
  • 2018年除夕夜,阿里将Dubbo贡献给了Apache基金会;
  • 2018除夕夜至今,Apache维护更新Dubbo。
3、RPC简介
  • RPC(Remote Procedure Call Protocol):远程过程调用
    • 两台服务器A、B,分别部署于不同的应用a、b。当服务器A想调用服务器B提供的方法时,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义传达调用的数据。因此出现了远程服务调用。
  • RPC是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
    • RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
  • RPC采用客户机/服务器模式,请求程序就是一个客户机,而服务提供程序就是一个服务器。
    • 首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。
    • 在服务器端,进程保持睡眠状态直到调用信息到达为止。
    • 当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息。
    • 最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
  • RPC需要解决的问题
    • 通讯问题
      • 通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。
    • 寻址问题
      • A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称是什么,这样才能完成调用。
      • 比如基于Web服务协议栈的RPC,就要提供一个endpoint URI,或者是从UDDI服务上查找。如果是RMI调用的话,还需要一个RMI Registry来注册服务的地址。
    • 序列化 与 反序列化
      • 当A服务器上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到B服务器,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize)或编组(marshal),通过寻址和传输将序列化的二进制发送给B服务器。
      • 同理,B服务器接收参数要将参数反序列化。B服务器应用调用自己的方法处理后返回的结果也要序列化给A服务器,A服务器接收也要经过反序列化的过程。
  • RPC框架:Dubbo的RPC、gRPC、Thrift、HSF等等(国内用Dubbo多)
二、Dubbo 1、Dubbo概念
  • Dubbo是一款分布式服务框架,高性能和透明化的RPC远程服务调用方案,SOA服务治理方案。
  • 三大核心能力:
    • 面向接口的远程方法调用
    • 智能容错和负载均衡
    • 服务自动注册和发现
2、Dubbo架构
  • Dubbo架构
    • Provider:暴露服务的服务提供方
    • Consumer:调用远程服务的服务消费方
    • Registry:服务注册与发现的注册中心
    • Monitor:统计服务的调用次数和调用时间的监控中心
    • Container:服务运行容器
  • 调用流程
    • step1(start):服务容器负责启动、加载、运行服务提供者;
    • step2(register):服务提供者在启动时,向注册中心注册自己提供的服务;
    • step3(subscribe):服务消费者在启动时,向注册中心订阅自己所需的服务;
    • step4(notify):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者;
    • step5(invoke):服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用;
    • step6(count ):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中。
  • 架构特点(了解)
    • 连通性
      • 注册中心:负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。
      • 监控中心:负责统计各服务调用次数,调用时机等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示。
      • 服务提供者:向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销。
      • 服务消费者:向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销。
      • 注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外。
      • 注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者。
      • 注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表。
      • 注册中心和监控中心都是可选的,服务消费者可以直连服务提供者。
    • 健壮性
      • 监控中心宕掉不影响使用,只是丢失部分采样数据。
      • 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务。
      • 注册中心对等集群,任意一台宕掉后,将自动切换到另一台。
      • 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯。
      • 服务提供者无状态,任意一台宕掉后,不影响使用。
      • 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复。
    • 伸缩性
      • 注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心。
      • 服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者。
    • 升级性
3、Dubbo注册中心
  • 将服务进行统一管理,可以有效地优化内部应用对服务发布/使用的流程和管理。服务注册中心可以通过特定协议来完成服务对外的统一。
    • 对于服务提供方:它需要发布服务,而由于应用系统的复杂性,服务数量、类型不断膨胀;
    • 对于服务消费方:它需要获取所需服务,而面对复杂应用系统,需要管理大量的服务调用;
    • 对于服务提供方和提供消费方:它们还有可能兼具这两种角色,既需要提供服务,又需要消费服务。
  • Dubbo提供的注册中心有以下几种类型:
    • Multicast注册中心:组播方式
    • Zookeeper注册中心:使用zookeeper作为注册中心
    • Redis注册中心:使用redis作为注册中心
    • Simple注册中心:就是一个dubbo服务,作为注册中心,提供查找服务功能
4、Dubbo优缺点
  • 优点
    • 透明化的远程方法调用
      • 像调用本地方法一样调用远程方法;
      • 只需简单配置,没有任何API侵入。
    • 软负载均衡及容错机制
      • 可以在内网替代nginx lvs等硬件负载均衡器。
    • 服务注册中心自动注册 & 配置管理
      • 不需要写死服务提供者地址,注册中心基于接口名自动查询提供者IP;
      • 使用类似zookeeper等分布式协调服务作为服务注册中心,可以将绝大部分项目配置移入zookeeper集群。
    • 服务接口监控与治理
      • Dubbo-admin与Dubbo-monitor提供了完善的服务接口管理与监控功能,针对不同应用的不同接口,可以进行 多版本,多协议,多注册中心管理。
  • 缺点
    • 只支持Java。
5、Dubbo高性能
  • RPC框架主要是远程调用,提升性能最关键、最耗时的两个因素:序列化和网络通信。
  • 序列化
    • 本地对象要在网络上传输,必须要实现Serializable接口,即序列化
    • 序列化方案:可以采用xml、json、二进制流等等,其中二进制流效率最高(因为计算机是二进制的),所以dubbo采用的是效率最高的二进制。
  • 网络通信
    • HTTP 需要七步(即,三次握手,四次挥手),效率低。
    • 但是Dubbo采用的是Socket通信机制,一步到位,提升通信效率,而且可以建立长连接,不用反复链接,直接传输数据。
三、Dubbo入门Demo

Dubbo+Zookeeper+Spring整合

1、大致步骤
  • 安装Zookeeper并启动;
  • 创建maven项目,构建Dubbo+Zookeeper+Spring实现简单Demo;
  • 安装Dubbo-admin,实现监控。
2、详细步骤 2.1 Zookeeper介绍与安装
  • Zookeeper介绍
    • Zookeeper是一个分布式服务框架,是树型的目录服务的数据存储,可以做到集群管理数据,支持变更推送,适合作为Dubbo服务的注册中心,可用于生产环境,推荐使用;
    • Dubbo能与Zookeeper做到集群部署。
      • 当提供者出现断电等异常停机时,Zookeeper注册中心能自动删除提供者信息;
      • 当提供者重启时,能自动恢复注册数据,以及订阅请求。
  • Zookeeper安装
    • zookeeper官网下载地址:https://zookeeper.apache.org/releases.html
      • step1:访问下载地址
      • step2:选择其中一个版本点击进入step3界面
      • step3:点击tar.gz下载
    • 修改配置
      • 复制/conf/zoo_sample.cfg文件,改名为zoo.cfg
    • 启动
      • E:apache-zookeeper-3.6.1-binbin>zkServer
    • 启动报错问题及分析
      • 错误一
        • 报错信息:java.lang.NumberFormatException: For input string: "E:apache-zookeeper-3.6.1-binbin..confzoo.cfg"
        • 报错截图
        • 解决方案:不能用zkServer start启动,直接zkServer 启动就行
      • 错误二
        • 报错信息:Caused by: java.lang.IllegalArgumentException: E:apache-zookeeper-3.6.1-binbin..confzoo.cfg file is missing
        • 报错截图
        • 解决方案:由于conf目录下没有zoo.cfg文件,需要在conf目录下复制zoo_sample.cfg文件,改名为zoo.cfg,重新启动即可成功
2.2 创建maven项目
  • 项目结构(三大模块)

    • dubbo-api:存放公共接口
    • dubbo-provider :提供远程服务
    • dubbo-consumer:调用远程服务
  • 导入依赖:spring、dubbo、zookeeper等jar包。

  • dubbo-api 模块

    • pom.xml

      
      
          
              DubboDemo
              com.awen
              1.0-SNAPSHOT
          
          4.0.0
          dubbo-api
          war
          dubbo-api Maven Webapp
          http://maven.apache.org
          
              
                  junit
                  junit
                  3.8.1
                  test
              
          
          
              dubbo-api
          
      
    • 定义服务接口DemoService (该接口需单独打包,在服务提供方和消费方共享)

      package com.alibaba.dubbo.demo;
      import java.util.List;
      public interface DemoService {
          List getPermissions(Long id);
      }
  • dubbo-provider 模块

    • pom.xml(引入公共接口所在的dubbo-api依赖)
      
      
          
              DubboDemo
              com.awen
              1.0-SNAPSHOT
          
          4.0.0
          dubbo-provider
          
              
                  com.awen
                  dubbo-api
                  1.0-SNAPSHOT
              
          
      
    • DemoServiceimpl 实现公共接口 DemoService (该接口对消费者隐藏)
      package com.alibaba.dubbo.demo.impl;
      import com.alibaba.dubbo.demo.DemoService;
      import java.util.ArrayList;
      import java.util.List;
      public class DemoServiceImpl implements DemoService {
          @Override
          public List getPermissions(Long id) {
              List list = new ArrayList<>();
              list.add(String.format("Permission_%d", id - 1));
              list.add(String.format("Permission_%d", id));
              list.add(String.format("Permission_%d", id + 1));
              return list;
          }
      }
    • provider.xml(用spring配置声明暴露服务)
      • 服务提供方应用信息,用于计算依赖关系,在 dubbo-admin 或 dubbo-monitor 会显示这个名字,方便辨识
      • 使用 zookeeper 注册中心暴露服务,注意要先开启zookeeper
      • 用 dubbo 协议在20880端口暴露服务
      • 使用dubbo协议实现定义好的 api.PermissionService 接口
      • 具体实现该接口的bean
      
      
          
          
          
          
          
          
          
          
          
          
      
    • Provider.java(启动远程服务)
      package com.alibaba.dubbo.demo.impl;
      import org.springframework.context.support.ClassPathXmlApplicationContext;
      import java.io.IOException;
      public class Provider {
          public static void main(String[] args) throws IOException {
              ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("provider.xml");
              System.out.println(classPathXmlApplicationContext.getDisplayName() + "here");
              classPathXmlApplicationContext.start();
              System.out.println("服务已经启动...");
              System.in.read();
          }
      }
  • dubbo-consumer1 模块

    • pom.xml(引入公共接口所在的dubbo-api依赖)
      
      
          
              DubboDemo
              com.awen
              1.0-SNAPSHOT
          
          4.0.0
          dubbo-consumer1
          
              
                  com.awen
                  dubbo-api
                  1.0-SNAPSHOT
              
          
      
    • dubbo-consumer1.xml(用spring配置引用远程服务)
      • 向zookeeper订阅provider地址,由zookeeper定时推送
      • 使用dubbo协议调用定义好的api.PermissionService接口
      
      
          
          
          
          
          
      
    • Consumer1.java(调用远程服务)
      package com.alibaba.dubbo.consumer1;
      import com.alibaba.dubbo.demo.DemoService;
      import org.springframework.context.support.ClassPathXmlApplicationContext;
      public class Consumer1 {
          public static void main(String[] args) {
              //测试常规服务
              ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("consumer1.xml");
              classPathXmlApplicationContext.start();
              System.out.println("consumer1 start");
              DemoService demoService = classPathXmlApplicationContext.getBean(DemoService.class);
              System.out.println("consumer1");
              System.out.println(demoService.getPermissions(1L));
          }
      }
2.3 运行项目
  • step1:启动zookeeper
  • step2:启动Provider.java,启动远程服务
  • step3:启动Cusumer1.java,调用远程服务
    • 如果先启动Customer,没有启动Provider,则会报错
      • Caused by: java.lang.IllegalStateException: Failed to check the status of the service com.alibaba.dubbo.demo.DemoService. No provider available for the service com.alibaba.dubbo.demo.DemoService from the url zookeeper://localhost:2181/com.alibaba.dubbo.registry.
      • 报错截图
2.4 dubbo-admin
  • 详情过程见六 Dubbo管理控制台。
四、Dubbo配置文件详解 1、dubbo 配置文件信息解释
  • 应用配置:配置当前应用信息

    eg:

  • 注册中心配置:配置连接注册中心信息

    eg:

  • 协议配置:配置提供服务的协议信息,协议由提供方指定,消费方被动接收

    eg:

    • 属性name:协议名称
    • 属性port:协议端口号(用哪个端口暴露服务)
    • Dubbo支持协议
      • dubbo、redis、hessian、rmi、http、webservice、thrift、memcached
      • dubbo官方推荐dubbo协议,dubbo协议默认端口20880
  • 服务配置:暴露一个服务,定义服务的元信息;一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心

    eg:

    • 属性protocol:使用哪个dubbo协议,与 dubbo:protocol 标签里的 name 值对应
  • 引用服务配置:创建一个远程服务代理,一个引用可以指向多个注册中心

  • 模块配置:可选,配置当前模块信息

  • 监控中心配置:可选,配置连接监控中心信息

  • 提供方缺省值:可选,当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值

  • 消费方缺省配置:可选,当ReferenceConfig某属性没有配置时,采用此缺省值

  • 方法配置:用于ServiceConfig和ReferenceConfig指定方法级的配置信息

  • 用于指定方法参数配置

2、不同粒度配置的覆盖关系
  • 方法级优先,接口级次之,全局配置再次之。
  • 如果级别一样,则消费方优先,提供方次之。
  • 其中,服务提供方配置通过URL经由注册中心传递给消费方。
  • 例子(以timeout为例)
3、分类(随后再补充)

(按超时设置、启动时检查、订阅、回声测试、延迟连接、令牌验证、日志适配、dubbo缓存文件分类)

4、分类(随后再补充)

(按服务发现、服务治理、性能调优分类)

  • 服务发现:让消费者找到服务
  • 服务治理:治理服务之间的关系
  • 性能调优:对服务进行性能调优
五、Dubbo服务化最佳实践 1、分包
  • 建议将服务接口、服务模型等均放在公共包中。
2、粒度
  • 服务接口尽可能大粒度,每个服务付费代表一个功能,而不是某功能的一个步骤;
  • 服务接口建议以业务场景为单位划分,并对相近业务做抽象,防止接口数据爆炸;
  • 不建议使用过于抽象的通用接口,如Map,这样的接口没有明确语义,会给后期维护带来不便;
3、版本
  • 每个接口都应该定义版本号,区分同一接口的不同实现。

    如:

六、Dubbo管理控制台 1、管理控制台功能

路由规则、动态配置、服务降级、访问控制、权重调整、负载均衡

2、步骤
  • step1:下载dubbo-admin:https://github.com/apache/dubbo/tree/2.5.x,clone 2.5.x版本

  • step2:进入到dubbo/dubbo-admin目录下,打包"mvn package -Dmaven.skip.test=true"

    • 然后dubbo/dubbo-admin/target目录下会生成dubbo-admin-2.5.10.war包
  • step3:将dubbo-admin-2.5.10.war复制到apache-tomcat-8.0.32//webapps目录下,并解压

  • step4:将dubbo-admin-2.5.10文件夹下的所有文件复制到ROOT文件夹里

  • step5:修改tomcat启动端口号为8090,因为zookeeper启动端口号也是8080。(进入apache-tomcat-8.0.32/conf下,修改server.xml文件)

  • step6:启动zookeeper(进入apache-zookeeper-3.6.1-bin/bin,双击启动zkServer.cmd)

    zookeeper介绍与安装:参考Dubbo入门Demo–详细步骤–Zookeeper介绍与安装

  • step7:启动tomcat(进入apache-tomcat-8.0.32/bin,双击启动startup.bat)

  • step8:访问dubbo-admin地址:http://127.0.0.1:8090/dubbo-admin-2.5.10/

    • 账号密码在webapps/ROOT/WEB-INF下的dubbo.properties文件中,可以是root/root,也可以是guest/guest
    • 需要账号密码登录
    • 登录成功
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/912783.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号