美文网首页
Dubbo学习笔记

Dubbo学习笔记

作者: 青年心路 | 来源:发表于2019-07-15 11:20 被阅读0次

    一、概念

    1.Dubbo介绍

    Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成。Dubbo框架是基于容器运行的,容器是Spring。
    官方网站:http://dubbo.apache.org/
    阿里巴巴已经将Dubbo框架捐献给了Apache软件基金会

    2.单体架构

    单体架构也称为单体系统或者单体应用,就是一种把系统中所有功能、模块耦合在一个应用中的架构方式。

    优点:

    • 项目易于管理
    • 部署简单

    缺点:

    • 测试成本高
    • 可伸缩性差
    • 可靠性差
    • 迭代困难
    • 跨语言程度差
    • 团队协作难

    缺点大于优点

    3.SOA架构:Service-Oriented Architecture

    面向服务的架构(SOA)是一个组件模块,它将应用程序拆分成不同功能单元(称为服务)通过服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的。它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。

    4.RPC远程过程调用:Remote Procedure Call Protocol

    远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议存在,如TCP和UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

    二、Dubbo框架结构

    1.Dubbo角色介绍
    image.png
    1.1 Registry(注册)

    注册中心:是用于发布和订阅服务的一个平台,是用于替代SOA结构体系框架中的ESB服务总线的。

    • 1.1.1 发布
      开发服务端代码完毕后,将服务信息发布出去,实现一个服务的公开
    • 1.1.2 订阅
      客户端程序,从注册中心下载服务内容,这个过程是订阅
      订阅服务的时候,会将发布的服务所有信息,一次性下载到客户端
      客户端也可以自定义,修改部分服务信息,如:超时的时长,调用的重试次数等
    1.2 Consumer(消费者)

    服务的消费者,就是服务的客户端。
    消费者必须使用Dubbo技术开发部分代码,基本上都是配置文件定义

    1.3 Provider(提供者)

    服务的提供者,就是客户端
    服务端必须使用Dubbo技术开发部分代码,以配置文件为主

    1.4 Container(容器)

    容器:Dubbo技术的服务端(Provider),在启动执行的时候,必须依赖容器才能启动。
    默认依赖的是Spring容器,且Dubbo技术不能脱离Spring框架。
    在2.5.3版本的Dubbo中,默认依赖的是Spring2.5版本技术,可以选用Spring4.5以下版本。
    在2.5.7版本的Dubbo中,默认依赖的是Spring4.3.10版本技术,可以选用任意的Spring版本。

    1.5 Monitor(监视器)

    监控中心:是Dubbo提供的一个jar工程
    主要功能是监控服务端(provider)和消费端(consumer)的使用数据的。如:服务端是什么,有多少接口,多少方法,调用次数,压力信息等。客户端有多少,调用过哪些服务端,调用了多少次等。

    2.Dubbo架构图的执行流程
    image.png
    2.1 Dubbo执行流程

    0 start:启动Spring容器时,自动启动Dubbo的Provider
    1 registry:Dubbo的Provider在启动后会自动去注册中心注册内容,注册的内容包括:

    • 1.1 Provider的IP
    • 1.2 Provider的端口
    • 1.3 Provider对外界提供的接口列表,哪些方法,哪些接口类
    • 1.4 Dubbo的版本
    • 1.5 访问Provider的协议

    2 subscribe:订阅,当Consumer启动时,自动去注册中心获取已注册的服务信息
    3 notify:通知,当Provider的信息发生变化时,自动由Registry向Consumer推送通知
    4 invoke:调用,Consumer调用Provider中的方法

    • 4.1 同步请求,消耗一定性能但是必须是同步请求,因为需要接收调用方法后的结果

    5 count:次数,每隔2分钟Provider和Consumer自动向Monitor发送访问次数,Monitor进行统计

    3.Dubbo支持的协议
    3.1 Dubbo协议(官方推荐协议)

    优点:

    • 采用NIO复用单一长连接,并采用线程池并发处理请求,减少握手和加大并发效率,性能较好(推荐使用)

    缺点:

    • 大文件上传时,可能出现问题(不使用Dubbo文件上传)
      注意:一般不使用Dubbo做文件上传,可以忽略不计
    3.2 RMI(Remote Method Invocation)协议

    优点:

    • JDK自带的能力。可与原生RMI互操作,基于TCP协议

    缺点:

    • 偶尔连接失败
    3.3 Hessian协议

    优点:

    • 可与原生Hessian互操作,基于HTTP协议

    缺点:

    • 需hessian.jar支持,http短连接(增加握手次数)的开销大
    4.Dubbo支持的注册中心
    image.png
    4.1 Zookeeper(官方推荐)

    优点:

    • 支持分布式,有很多周边产品

    缺点:

    • 受限于Zookeeper软件的稳定性,Zookeeper专门分布式辅助软件,稳定较优
    4.2 Multicase

    优点:

    • 去中心化,不需要单独安装软件

    缺点:

    • Provider和Consumer和Registry不能跨机房(路由)
    4.3 Redis

    优点:

    • 支持集群,性能高

    缺点:

    • 要求服务器时间同步,否则可能出现集群失败问题
    4.3 Simple

    优点:

    • 标准RPC服务,没有兼容问题

    缺点:

    • 不支持集群

    三、Dubbo入门案例

    1.安装Zookeeper
    2.创建Provider
    2.1 创建工程

    Provider工程类型是jar

    2.2 添加Dubbo坐标
    • 关于版本的问题:在Dubbo的2.5.3版本中对于Spring的支持是2.5.x,如果替换低版本的Spring应该添加如下标签
        <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>dubbo</artifactId>
          <version>2.5.3</version>
          <!--去除依赖-->
          <exclusions>
            <exclusion>
              <groupId>org.springframework</groupId>
              <artifactId>spring</artifactId>
            </exclusion>
          </exclusions>
        </dependency>
    
    2.3 创建服务

    服务:项目中对外界所提供的能力
    服务标准:接口+接口实现类
    接口:对外界描述当前服务的信息,如协议类型,服务提供者的地址,发布的服务名称,服务中方法名称等信息。
    接口实现类:对发布的接口中的标准的具体实现。

    2.3.1 创建接口
      /**
     * 服务接口
     */
    public interface DubboService {
        String showMsg(String str);
    }
    
    2.3.2 创建接口实现类
      /**
     * 服务接口实现类
     */
    public class DubboServiceImpl implements DubboService {
        @Override
        public String showMsg(String str) {
            return "Hello Dubbo " + str;
        }
    }
    
    2.3.3 配置服务
    <?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="myProvider"/>
    
        <!--配置注册中心-->
        <!--address:当前注册中心的IP和端口,如果zookeeper是一个集群,那么需要将集群中所有的IP和端口添加到该属性中-->
        <!--protocol:当前注册中心的类型-->
        <dubbo:registry address="192.168.254.128:2181,192.168.254.128:2182,192.168.254.128:2183" protocol="zookeeper"/>
    
        <!--配置协议端口-->
        <dubbo:protocol name="dubbo" port="20880"/>
    
        <!--配置注册接口,使用ref属性绑定接口实现类-->
        <dubbo:service interface="com.hxx.service.DubboService" ref="dubboServiceImpl"/>
        <!--配置接口实现类-->
        <bean id="dubboServiceImpl" class="com.hxx.service.impl.DubboServiceImpl"/>
    </beans>
    
    2.4 启动Provider
    2.4.1 启动Zookeeper注册中心
    image.png
    2.4.2 启动Spring容器
    • 方式1:通过Spring的API启动容器
      在ApplicationContext接口中未定义start()方法,需要使用接口实现类

    启动时异常信息

    image.png
    解决:添加如下依赖
        <dependency>
          <groupId>org.apache.curator</groupId>
          <artifactId>curator-framework</artifactId>
          <version>4.0.1</version>
        </dependency>
    

    添加完依赖后可能会出现如下异常


    image.png

    解决:将curator-framework的version修改为4.0.0以下

        <dependency>
          <groupId>org.apache.curator</groupId>
          <artifactId>curator-framework</artifactId>
          <version>2.12.0</version>
        </dependency>
    

    启动代码

    public class Start {
        public static void main(String[] args) throws IOException {
            ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("application-dubbo.xml");
            ac.start();
            //防止主线程死掉
            System.in.read();
        }
    }
    

    注意:还有可能出现的错误
    1.dubbo2.5.4要求jdk版本必须是1.8或以上
    2.Dubbo启动时需要依赖zookeeper基于java语言的客户端工具
    工具名称为zkclient
    修改pom文件添加zkclient的坐标

    • 方式2:使用Dubbo下的Main类中的main方法启动
    public class Start {
        public static void main(String[] args) throws IOException {
    
            //Main类下的main方法在启动时,默认会去classpath:/META-INF/spring/*.xml
            Main.main(args);
        }
    }
    
    image.png
    注意:Main类下的main方法在启动时,默认会去
    classpath:/META-INF/spring/*.xml

    优点:
    1.相比于方式1关闭方式不粗暴,在10s内没有consumer请求才会关闭。
    2.自带线程阻塞

    2.5 注册中心中的服务发布信息

    使用zkClient.sh连接Zookeeper服务,使用ls命令查看服务信息

      ls /dubbo/com.hxx.service.DubboService/providers
    

    显示结果如下:

    dubbo%3A%2F%2F192.168.91.2%3A20880%2Fcom.hxx.service.DubboService%3Fanyhost%3Dtrue%26application%3DmyProvider%26dubbo%3D2.6.2%26generic%3Dfalse%26interface%3Dcom.hxx.service.DubboService%26methods%3DshowMsg%26pid%3D7048%26side%3Dprovider%26timestamp%3D1563099629673

    转换后:

    dubbo://192.168.91.2:20880/com.hxx.service.DubboService?anyhost=true&application=myProvider&dubbo=2.6.2&generic=false&interface=com.hxx.service.DubboService&methods=showMsg&pid=7048&side=provider×tamp=1563099629673

    • %3A代表“:”
    • %2F代表“/”
    • %3F代表“?”
    • %3D代表“=”
    • %26代表“&”
    • %26times代表“×”
    3.Dubbo Admin管理平台搭建
    3.1 安装Admin管理平台

    Admin管理平台是一个war项目
    在Linux系统中安装jdk及tomcat
    使用unzip命令解压zip压缩包
    删除tomcat/webapps目录下的ROOT目录
    将解压出来的ROOT目录拷贝到tomcat/webapps目录下

    3.2配置Admin管理平台
    image.png

    address:zookeeper的连接地址,如果是集群给一个就可以
    root.password:默认设置root用户的密码
    guest.password:默认设置guest用户的密码

    注意:root的权限>guest的权限

    3.3 访问Admin管理平台
    image.png
    4.创建Consumer
    4.1 创建工程
    4.2 添加依赖
      <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>dubbo</artifactId>
          <version>2.6.2</version>
        </dependency>
    
        <dependency>
          <groupId>org.apache.curator</groupId>
          <artifactId>curator-framework</artifactId>
          <version>2.12.0</version>
        </dependency>
    
        <dependency>
          <groupId>com.101tec</groupId>
          <artifactId>zkclient</artifactId>
          <version>0.10</version>
        </dependency>
    
    4.3 编写Consumer
    4.3.1 编写接口
    public interface UserService {
    
        void test(String str);
    }
    
    4.3.2 创建接口实现类
    @Service
    public class UserServiceImpl implements UserService {
    
        @Autowired
        private DubboService dubboService;
    
        @Override
        public void test(String str) {
            //调用Provider下的服务
            System.out.println(this.dubboService);
            String var = this.dubboService.showMsg("hxx");
            System.out.println(var);
        }
    }
    
    4.3.3 配置Consumer
    <?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"
           xmlns:context="http://www.springframework.org/schema/context"
           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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    
        <!--扫描注解-->
        <context:component-scan base-package="com.hxx.service.impl"/>
    
        <!--给应用起名-->
        <dubbo:application name="myConsumer"/>
    
        <!--配置注册中心-->
        <dubbo:registry address="192.168.254.128:2181,192.168.254.128:2182,192.168.254.128:2183" protocol="zookeeper"/>
    
        <!--获取到接口的代理对象,生成接口的Proxy,放到Spring容器中-->
        <!--注意:必须要添加id属性-->
        <dubbo:reference id="dubboService" interface="com.hxx.service.DubboService"/>
    </beans>
    
    4.3.4 编写测试类
      public class ConsumerTest {
        public static void main(String[] args) {
            ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
            UserService userService = ac.getBean(UserServiceImpl.class);
            userService.test("World");
        }
    }
    
    测试结果
    image.png

    相关文章

      网友评论

          本文标题:Dubbo学习笔记

          本文链接:https://www.haomeiwen.com/subject/eopmkctx.html