dubbo

作者: 云之彼端l | 来源:发表于2018-12-29 08:38 被阅读0次

    一.SOA

    1. 英文名称(Service Oriented Ambiguity)
    2. 中文名称:面向服务架构
    • 2.1 有一个专门提供服务单元.
    • 2.2 其他所有单元都调用这个服务.
    1. SOA定位:
    • 3.1 如何设计项目,让开发时更有效率.
    • 3.2 SOA是一种思想
    1. 之前项目架构设计
    • 4.1 在公司项目不允许所有项目都访问数据库.
    • 4.2 开发时,数据库访问层代码可能出现冗余


    1. 使用SOA架构
    • 5.1 专门访问数据库服务(项目).
    • 5.2 开发时可以实现,数据访问控制和代码复用.
    1. 实现SOA架构时,常用服务.
    • 6.1 Dubbo 做为服务.
    • 6.2 WebService 做为服务.
    • 6.3 Dubbox 做为服务.
    • 6.4 服务方就是web项目,调用web项目的控制器.
      • 6.4.1 使用HttpClient可以调用其他项目的控制器.

    二. RPC

    1. 英文名称(Remote Procedure Call Protocol)
    2. 中文名称:远程过程调用协议
    3. RPC解析:客户端(A)通过互联网调用远程服务器,不知道远程服务器具体实现,只知道远程服务器提供了什么功能.


    1. RPC最大优点:
    • 4.1 数据安全性.

    三.Dubbo简介

    1. Dubbo:一个分布式、高性能、透明化的RPC服务框架
    2. 作用:提供服务自动注册、自动发现等高效服务治理方案.
    3. Dubbo架构图
    • 3.1 Provider :提供者,服务发布方.
    • 3.2 Consumer:消费者, 调用服务方
    • 3.3 Container:Dubbo容器.依赖于Spring容器.
    • 3.4 Registry: 注册中心.当Container启动时把所有可以提供的服务列表上Registry中进行注册.
      • 3.4.1 作用:告诉Consumer提供了什么服务和服务方在哪里.
    • 3.5 Monitor:监听器
    • 3.6 虚线都是异步访问,实线都是同步访问
    • 3.7 蓝色虚线:在启动时完成的功能
    • 3.8 红色虚线(实线)都是程序运行过程中执行的功能
    • 3.9 所有的角色都是可以在单独的服务器上.所以必须遵守特定的协议.


    1. 运行原理:
    • 4.0 启动容器,相当于在启动Dubbo的Provider
    • 4.1 启动后会去注册中心进行注册.注册所有可以提供的服务列表
    • 4.2 在Consumer启动后会去Registry中获取服务列表和Provider的地址.进行订阅.
    • 4.3 当Provider有修改后,注册中心会把消息推送给Consummer
      • 4.3.1 使用了观察者设计模式(又叫发布/订阅设计模式)
    • 4.4 根据获取到的Provider地址,真实调用Provider中功能.
      • 4.4.1 在Consumer方使用了代理设计模式.创建一个Provider方类的一个代理对象.通过代理对象获取Provider中真实功能,起到保护Provider真实功能的作用.
    • 4.5 Consumer和Provider每隔1分钟向Monitor发送统计信息,统计信息包含,访问次数,频率等.

    四.Dubbo支持的注册中心

    1. Zookeeper
    • 1.1 优点:支持网络集群
    • 1.2 缺点:稳定性受限于Zookeeper
    1. Redis
    • 2.1 优点:性能高.
    • 2.2 缺点:对服务器环境要求较高.
    1. Multicast
    • 3.1 优点:面中心化,不需要额外安装软件.
    • 3.2 缺点:建议同机房(局域网)内使用
    1. Simple
    • 4.1 适用于测试环境.不支持集群.

    五.Zookeeper讲解

    1. Zookeeper 分布式协调组件.
    • 1.1 本质一个软件.
    1. Zookeeper常用功能
    • 2.1 发布订阅功能.把zookeeper当作注册中心原因.
    • 2.2 分布式/集群管理功能.
    1. 使用java语言编写的.
    2. zookeeper单机版安装过程

    前提: 已经配置好jdk环境变量

    4.1 上传zookeeper 安装包到linux中/usr/local/temp 中(目录随意,对安装无影响)
    4.2 解压zookeeper压缩包
    tar zxvf /usr/local/temp/zookeeper-3.4.8.tar.gz
    4.3 复制zookeeper解压后的文件夹到/usr/local下并起名为zookpper(复制后名称任意,对安装无影响)
    cp -r /usr/local/temp/zookeeper-3.4.8 /usr/local/zookeeper
    4.4 进入到zookeeper文件夹中
    cd /usr/local/zookeeper
    4.5 在zookeeper中新建data文件夹,做为zookeeper数据存储文件夹
    mkdir data
    4.6 进入到conf文件夹
    cd conf
    4.7 复制zoo_sample.cfg,并给新起名的zoo.cfg
    cp zoo_sample.cfg zoo.cfg
    4.8 修改zoo.cfg中dataDir属性值为新建data文件夹的路径
    vim zoo.cfg
    修改后的效果:

    # The number of milliseconds of each tick
    tickTime=2000
    # The number of ticks that the initial
    # synchronization phase can take
    initLimit=10
    # The number of ticks that can pass between
    # sending a request and getting an acknowledgement
    syncLimit=5
    # the directory where the snapshot is stored.
    # do not use /tmp for storage, /tmp here is just
    # example sakes.
    dataDir=/usr/local/zookeeper/data
    # the port at which the clients will connect
    clientPort=2181
    

    进入到zookeeper/bin文件夹,使用zkServer.sh启动zookeeper

    cd ../bin
    ./zkServer.sh start
    

    启动成功效果图

    [root@localhost zookeeper]# ./bin/zkServer.sh start
    ZooKeeper JMX enabled by default
    Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
    Starting zookeeper ... STARTED
    

    查看状态,其中Mode: standalone表示单机版

    ./zkServer.sh status
    
    [root@localhost zookeeper]# ./bin/zkServer.sh status
    ZooKeeper JMX enabled by default
    Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
    Mode: standalone
    

    为了外部能访问,需要在防火墙中放行2181端口

    六. Dubbo支持的协议

    1. Dubbo
    • 1.1 Dubbo官方推荐的协议.
    • 1.2 本质:使用NIO和线程池进行处理.
    • 1.3 缺点:大文件传输时可能出现文件传输失败问题.
    1. RMI
    • 2.1 JDK提供的协议,远程方法调用协议.
    • 2.2 缺点:偶尔连接失败.
    • 2.3 优点:JDK原生,不需要进行额外配置(导入jar)
    1. Hession
    • 3.1 优点:基于http协议,http请求支持.
    • 3.2 缺点:需要额外导入jar,并在短连接时性能低

    七.Dubbo中Provider搭建

    1. 新建Maven Project, 里面只有接口(dubbo-service)
    • 1.1 为什么这么做?
      RPC框架,不希望Consumer知道具体实现.如果实现类和接口在同一个项目中,Consumer依赖这个项目时,就会知道实现类具体实现.
    1. 新建Maven Project, 写接口的实现类(dubbo-service-impl)
    2. 在dubbo-service-impl中配置pom.xml
    • 3.1 依赖接口
    • 3.2 依赖dubbo,去掉老版本spring
    • 3.3 依赖新版本spring
    • 3.4 依赖zookeeper客户端工具zkClient
    
    <parent>
            <artifactId>dubbo-demo</artifactId>
            <groupId>com.lsw</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>dubbo-service-impl</artifactId>
    
        <dependencies>
            <dependency>
                <artifactId>dubbo-service</artifactId>
                <groupId>com.lsw</groupId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>dubbo</artifactId>
                <version>2.5.3</version>
                <exclusions>
                    <exclusion>
                        <artifactId>spring</artifactId>
                        <groupId>org.springframework</groupId>
                    </exclusion>
                </exclusions>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>4.1.6.RELEASE</version>
            </dependency>
    
            <!--访问zookeeper的客户端jar包-->
            <dependency>
                <groupId>com.101tec</groupId>
                <artifactId>zkclient</artifactId>
                <version>0.10</version>
            </dependency>
        </dependencies>
    
        <build>
    
            <plugins>
                <!-- 指定项目的打包插件信息 -->
                <plugin>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <configuration>
                        <!-- 指定打包描述文件的位置:相对项目根目录的路径 -->
                        <!-- assembly打包的描述文件 -->
                        <descriptor>assembly/assembly.xml</descriptor>
                    </configuration>
                    <executions>
                        <execution>
                            <id>make-assembly</id>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    
    1. 新建实现类,并实现接口方法.
    2. 新建配置文件applicationContext-dubbo.xml,并配置
    • 5.1 <dubbo:application/> 给provider起名,在monitor或管理工具中区别是哪个provider
    • 5.2 <dubbo:registry/> 配置注册中心
      • 5.2.1 address:注册中心的ip和端口
      • 5.2.2 protocol使用哪种注册中心
    • 5.3 <dubbo:protocol/> 配置协议
      • 5.3.1 name 使用什么协议
      • 5.3.2 port: consumer invoke provider时的端口号
    • 5.4 <dubbo:service/> 注册接口
      • 5.4.1 ref 引用接口实现类<bean>的id值
    <?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:context="http://www.springframework.org/schema/context"
           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://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
            http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    
        <!--给当前Provider自定义名字-->
        <dubbo:application name="dubbo-service"/>
    
        <!--配置注册中心-->
    
        <dubbo:registry address="192.168.84.138:2181" protocol="zookeeper"></dubbo:registry>
    
    
        <!--配置端口-->
        <dubbo:protocol name="dubbo" port="20888"></dubbo:protocol>
    
        <!--注册功能-->
        <dubbo:service interface="com.lsw.dubbo.service.DemoService" ref="demoServiceImpl">
        </dubbo:service>
        <bean id="demoServiceImpl" class="com.lsw.dubbo.service.impl.DemoServiceImpl">
        </bean>
    
        <!--只需在实现类上加入@Service注册即可,但这个注册跟声明式事务aop有冲突,所以不推荐注解方式-->
        <!--<dubbo:annotation package="com.lsw.service.impl"/>-->
    </beans>
    
    
    1. 启动容器
    • 6.1 通过spring方式启动
      • 6.1.1 applicationContext-dubbo.xml位置没有要求
    ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext-dubbo.xml");
            ac.start();
            System.out.println("启动成功");
    
    

    6.2 使用dubbo提供的方式启动(推荐使用这种方式)

    • 6.2.1 要求applicationContext-dubbo.xml必须放入类路径下/META-INF/spring/*.xml
    Main.main(args);
    

    八. Admin管理界面

    前提:dubbo-admin-2.5.3.war要求jdk1.7

    1. 本质就是一个web项目
    2. 获取注册中心内Provider注册的信息.用页面呈现出来.
    3. 实现步骤
    • 3.1 把dubbo-admin-2.5.3.war上传到服务器tomcat中.
    • 3.2 启动tomcat完成后关闭tomcat,删除上传的dubbo-admin-2.5.3.war
      • 3.2.1 为什么要删除:需要修改解压后的文件夹,如果不删除.war文件,下次重启tomcat会还原成未修改状态
    • 3.3 进入dubbo-admin-2.5.3/WEB-INF/dubbo.properties,修改第一行为zookeeper的ip和端口
    • 3.3.1 第二行和第三行为管理界面的用户名和密码
    dubbo.registry.address=zookeeper://192.168.84.138:2181
    dubbo.admin.root.password=root
    dubbo.admin.guest.password=guest
    
    • 3.4 启动tomcat, 在浏览器地址栏访问tomcat中dubbo项目

    九.Consumer搭建过程

    1.在pom.xml中除了ssm的依赖添加dubbo相关3个依赖(接口,dubbo.jar,zkClient)
    2.web.xml中修改<init-value>applicationContext-*.xml

        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext-*.xml</param-value>
        </context-param>
    
    1. spring配置文件命名为applicationContext-spring.xml,配置dubbo的配置文件applicationContext-dubbo.xml
    <!--给当前Provider自定义名字-->
        <dubbo:application name="dubbo-consumer-web"/>
    
        <!--配置注册中心-->
    
        <dubbo:registry address="192.168.84.138:2181" protocol="zookeeper"></dubbo:registry>
    
        <!--配置注解扫描-->
        <dubbo:annotation package="com.lsw.consumer.service.impl"/>
    
    1. 不需要编写mapper
    2. 除了ServiceImpl中引用Provider中接口对象改变,其他代码都一样.
    package com.lsw.consumer.service.impl;
    
    import com.alibaba.dubbo.config.annotation.Reference;
    import com.lsw.consumer.service.TestService;
    import com.lsw.dubbo.service.DemoService;
    import org.springframework.stereotype.Service;
    
    /**
     * @作者 lishw
     * @创建时间 2018/12/27
     * @描述
     */
    @Service
    public class TestServiceImpl implements TestService {
    
        @Reference
        private DemoService demoService;
        @Override
        public void test() {
              //implement
        }
    }
    
    

    十. Maven打包插件Assembly

    1. 在dubbo的provider项目(实现类项目)中pom.xml配置assembly插件信息
    <build>
    
            <plugins>
                <!-- 指定项目的打包插件信息 -->
                <plugin>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <configuration>
                        <!-- 指定打包描述文件的位置:相对项目根目录的路径 -->
                        <!-- assembly打包的描述文件 -->
                        <descriptor>assembly/assembly.xml</descriptor>
                    </configuration>
                    <executions>
                        <execution>
                            <id>make-assembly</id>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    
    1. 在项目根目录下新建assembly文件夹
    1. 在assembly文件夹中新建assembly.xml
    <?xml version='1.0' encoding='UTF-8'?>
    <assembly
        xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
        <!-- 该字符会添加到最终tar.gz包的名称后面,作为后缀 -->
        <id>assembly</id>
        <!-- 指定打包的格式为tar.gz,该类型压缩包在linux中比较常见 -->
        <formats>
            <format>tar.gz</format>
        </formats>
        <!-- 在tar.gz压缩包中是否包含根文件夹,该根文件夹名称和tar.gz去掉id后缀一致 -->
        <includeBaseDirectory>true</includeBaseDirectory>
        <fileSets>
            <!-- 将项目根路径下assembly/bin路径中的内容打包到压缩包中的根目录下的bin目录中 -->
            <fileSet>
                <!-- 相对项目根路径的相对路径 -->
                <directory>assembly/bin</directory>
                <outputDirectory>bin</outputDirectory>
                <!-- 设置最终tar.gz中该文件夹下的权限,跟linux权限写法一致 -->
                <fileMode>0755</fileMode>
            </fileSet>
            <!-- 将项目根路径下assembly/conf路径中的内容打包到压缩包中的根目录下的conf目录中 -->
            <fileSet>
                <directory>assembly/conf</directory>
                <outputDirectory>conf</outputDirectory>
                <!-- 设置其linux权限 -->
                <fileMode>0644</fileMode>
            </fileSet>
        </fileSets>
        <!-- 将所有依赖的jar包打包到压缩包中的根目录下的lib目录中 -->
        <!-- 此lib目录中包含自己开发的项目jar包以及demo_service.jar,还有第三方的jar包 -->
        <dependencySets>
            <dependencySet>
                <outputDirectory>lib</outputDirectory>
            </dependencySet>
        </dependencySets>
    </assembly>
    
    
    1. 解压下载的dubbo-monitor-simple-2.5.3-assembly.tar.gz压缩包,把解压后的bin和conf粘贴到项目下assembly文件夹中.
    • 4.1 清空conf/dubbo.properties中内容.
    1. 进入dubbo的provider项目(实现类项目) 执行 maven install
    • 5.1 在target下出现: 项目名-版本-assembly.tar.gz压缩包
    1. 把压缩包复制到window或linux中
    • 6.1 window中使用start.bat启动,关闭命令窗口关闭服务.
    • 6.2 linux中使用start.sh启动使用stop.sh关闭.

    十一. 部署dubbo-monitor-simple

    1.dubbo-monitor简介
    监控中心负责统计各服务器调用次数,调用时间等并以报表展示。Monitor可以不安装。它不会影响Consumer和Provider之间的调用。

    部署前提:dubbo-monitor是一个web工程,是基于内嵌的jetty。dubbo-monitor是使用java编写的项目,所以部署前需要安装jdk

    1.创建dubbo-monitor并上传dubbo-monitor压缩包至此目录下

    [root@localhost ~]# mkdir /usr/local/dubbo-monitor
    

    2.解压dubbo-monitor-simple压缩包

    [root@localhost ~]# cd /usr/local/dubbo-monitor/
    [root@localhost dubbo-monitor]# tar -xvf dubbo-monitor-simple-2.5.3-assembly.tar.gz
    

    3.修改dubbo.properties配置文件

    [root@localhost dubbo-monitor]# vi dubbo-monitor-simple-2.5.3/conf/dubbo.properties,修改内容如下:
    
    ##
    dubbo.container=log4j,spring,registry,jetty
    dubbo.application.name=simple-monitor
    dubbo.application.owner=
    #dubbo.registry.address=multicast://224.5.6.7:1234 #注释这一行
    dubbo.registry.address=zookeeper://192.168.84.138:2181 #zookeeper注册中心地址
    #dubbo.registry.address=redis://127.0.0.1:6379
    #dubbo.registry.address=dubbo://127.0.0.1:9090
    dubbo.protocol.port=7070 #这是monitor自身要发布的接口使用的端口
    dubbo.jetty.port=7000 #这是monitor提供的web界面的接口
    dubbo.jetty.directory=/usr/local/dubbo-monitor/dubbo-monitor-simple-2.5.3 #这是dubbo monitor的解压目录
    dubbo.charts.directory=/usr/local/dubbo-monitor/dubbo-monitor-simple-2.5.3/charts
    dubbo.statistics.directory=/usr/local/dubbo-monitor/dubbo-monitor-simple-2.5.3/statistics
    dubbo.log4j.file=logs/dubbo-monitor-simple.log
    dubbo.log4j.level=WARN
    

    4.在Dubbo服务提供者和服务消费者中的spring配置文件中增加以下配置:
    <dubbo:monitor protocol="registry"/>
    注:
    如果为protocol="registry",表示从注册中心发现监控中心地址,否则直连监控中心,直连监控中心服务器地址,如: <dubbo:monitor address="192.168.84.138:7070"/>

    1. 启动/停止

    通过 bin/start.sh,stop.sh来启动停止monitor

    1. 访问monitor服务

    通过 http://host_ip:7000(dubbo.jetty.port配置的端口)访问monitor服务

    相关文章

      网友评论

          本文标题:dubbo

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