• Dubbo系列之微服务框架整合教程


    文章目录

    一、分布式基本知识

    1.1) 架构演变

    在这里插入图片描述

    先给出dubbo官方的图,图片表示了架构的演变。然后我说一下自己的理解。

    应用最开始是单体应用,即一个应用包括了所有应用模块。

    随后就是垂直应用架构,也就是将系统拆分为多个应用模块。

    随后就是RPC架构,之前的垂直应用架构其实可以说是在一个进程内的通讯,而RPC就是一种进步,RPC是进程之间的通讯,远程过程调用就是这么来的。

    有了RPC之后,虽然可以实现进程之间的通讯,但是服务器集群后的服务器资源利用有些时候容易造成浪费,比如有个系统,一般情况都是不能很好地预估需要分配多少机器的,很容易造成一种情况就是业务访问很频繁的模块分配了不足的机器,而访问不是很频繁的模块分配了太多的机器,这种情况就不能实现资源的很好利用,所以针对这种情况就有了SOA(Service Oriented Architecture)的出现,SOA其实就是一个服务注册中心,可以实现资源调度,合理地分配资源,提高资源调度,是一个治理中心。

    1.2)、分布式基本概念

    所以我们了解了架构演变之后,就可以更好的理解分布式,分布式其实就是一种可以实现不同进程之间通讯的架构,然后进程之间怎么通讯的?一般都是通过RPC框架实现。比如Java方面的,Dubbo框架或者Spring Cloud。

    二、RPC简介

    2.1) RPC概念

    RPC:全称远程过程调用,是一种进程间的通信的方式,它所做的事情就是实现进程内的通信,允许调用另外一个地址空间,可以是共享网络里的另外一台机器。

    2.2) RPC核心模块

    RPC有两个核心模块:通信和序列化

    三、Dubbo原理简介

    3.1) Dubbo简介

    Dubbo是阿里巴巴开源的一款Java RPC框架,现在已经捐赠给Apache
    官网:http://dubbo.apache.org/

    3.2) 核心功能

    a、智能容错和负载均衡

    b、服务注册和发现

    c、面向接口的远程方法调用

    3.3) 原理简介

    在这里插入图片描述

    上图是Dubbo官方的图

    角色

    Provider:暴露服务的服务提供者

    Container:服务运行的容器

    Consumer:调用远程服务的消费者

    Registry:服务注册和发现的注册中心

    Minitor:统计服务调用次数和时间的监控中心

    调用

    下面根据我的理解说明一下

    0:服务器容器负责启动、加载、运行服务提供者

    1:服务提供者在启动后就可以向注册中心暴露服务

    2:服务消费者在启动后就可以向注册中心订阅想要的服务

    3:注册中心向服务消费者返回服务调用列表

    4:服务消费者基于软负载均衡算法调用服务提供者的服务,这个服务提供者有可能是一个服务提供者列表,调用那个服务提供者就是根据负载均衡来调用了

    5:服务提供者和服务消费者定时将保存在内存中的服务调用次数和服务调用时间推送给监控中心

    四、Dubbo安装部署

    4.1) Zookeeper安装

    因为没有实践过linux系统的安装,所以本博客只介绍window系统的安装,当然linux安装dubbo环境也不会难。Dubbo的注册中心实现有很多种,比如Redis、Multicast等等,不过官方推荐的还是Zookeeper,所以本博客选Zookeeper注册中心搭建进行介绍。

    下载Zookeeper
    https://archive.apache.org/dist/zookeeper/
    ps:先下载Zookeeper,因为3.5.X的都是公测版或者内测版,所以有可能不太稳定,不建议下载。

    修改配置文件
    解压下载好的Zookeeper压缩文件,zookeeper-3.4.13的配置文件在conf文件夹下面,可以看到里面有个zoo_sample.cfg的文件,我们需要修改文件名称,不然会出现文件找不到,将文件名称改为zoo.cfg

    这里主要改一下Zookeeper临时文件夹,默认是linux系统的tmp/zookeeper,我修改后的配置如下:

    # 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.
    # Linux系统下的临时目录
    # dataDir=/tmp/zookeeper
    dataDir=../tmp/zookeeper
    # the port at which the clients will connect
    clientPort=2181
    # the maximum number of client connections.
    # increase this if you need to handle more clients
    #maxClientCnxns=60
    #
    # Be sure to read the maintenance section of the 
    # administrator guide before turning on autopurge.
    #
    # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
    #
    # The number of snapshots to retain in dataDir
    #autopurge.snapRetainCount=3
    # Purge task interval in hours
    # Set to "0" to disable auto purge feature
    #autopurge.purgeInterval=1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    启动Zookeeper
    在bin目录下面,有个zkServer.cmd文件,这是Zookeeper服务端启动的文件,点击启动

    zkCli.cmd是客户端启动文件,我们点击启动,Zookeeper是一个树形目录结构的

    ### get根目录
    [zk: localhost:2181(CONNECTED) 1] get /
    cZxid = 0x0
    ctime = Thu Jan 01 08:00:00 CST 1970
    mZxid = 0x0
    mtime = Thu Jan 01 08:00:00 CST 1970
    pZxid = 0x0
    cversion = -1
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 0
    numChildren = 1
    ### 看一下根目录下面有什么,默认有Zookeeper这个目录
    [zk: localhost:2181(CONNECTED) 2] ls /
    [zookeeper]
    ### 在根目录下面创建一个taoshop的目录,并写值"mytest"
    [zk: localhost:2181(CONNECTED) 3] create -e /taoshop mytest
    Created /taoshop
    ### 查看一下,创建成功
    [zk: localhost:2181(CONNECTED) 4] ls /
    [taoshop, zookeeper]
    ### 查看一下taoshop目录下面有什么,可以看到"mytest"这个保存的值
    [zk: localhost:2181(CONNECTED) 5] get /taoshop
    mytest
    cZxid = 0x6
    ctime = Sun Nov 04 20:54:19 CST 2018
    mZxid = 0x6
    mtime = Sun Nov 04 20:54:19 CST 2018
    pZxid = 0x6
    cversion = 0
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x1000250f2010000
    dataLength = 6
    numChildren = 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    4.2) Dubbo监控平台部署

    下载一下Dubbo提供的监控平台,可以先去下载master分支,有看到一个develop分支,不过感觉develop分支的还没稳定下来,根据自己需要下载,我就是下载master版本的
    https://github.com/apache/incubator-dubbo-ops/tree/master

    可以git clone一下https://github.com/apache/incubator-dubbo-ops.git

    git clone https://github.com/apache/incubator-dubbo-ops.git
    
    • 1

    然后到dubbo-admin下面打包一下
    incubator-dubbo-ops-master/dubbo-admin

    mvn clean package
    
    • 1

    完成后,到该目录target下面发现一个jar,cmd运行

    java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
    
    • 1

    当然也可以写个简单的bat脚本来执行,不用每次都敲命令,创建一个startDubboAdmin.bat文件
    敲上以下脚本,然后保存,下次就不用再敲命令了,不过jar文件要和bat文件放在同级目录

    @echo off
    java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
    
    • 1
    • 2

    访问Dubbo管理平台

    http://localhost:7001/

    输入账号密码root/root

    在这里插入图片描述

    Dubbo监控平台配置
    在官方下载的incubator-dubbo-ops-master/dubbo-monitor-simple下面
    使用maven命令打包一下

    mvn clean package
    
    • 1

    然后在target文件夹下面会生成
    dubbo-monitor-simple-2.0.0-assembly.tar.gz压缩文件夹,我们解压一下,然后
    在dubbo-monitor-simple-2.0.0-assembly/dubbo-moitor-simple-2.0.0/assembly.bin文件夹下面可以看到start.bat文件,start.sh是linux系统的。win系统可以点击start.bat运行,运行之后访问127.0.0.1:8080,可以看到Dubbo官方提供的一个监控平台页面
    在这里插入图片描述

    五、Dubbo例子

    下面简单写个例子实践一下Dubbo
    Dubbo是处理分布式架构的一种很不错的RPC框架,官方文档比较齐全。
    下面是Dubbo官方给的架构分包建议。ps:Dubbo现在暂不能支持分布式事务,所以服务定义的时候要设计好,尽量避免分布式事务的处理

    建议将服务接口,服务模型,服务异常等均放在 API 包中,因为服务模型及异常也是 API 的一部分,同时,这样做也符合分包原则:重用发布等价原则(REP),共同重用原则(CRP)。

    服务提供者实现
    maven加上jar,Zookeeper注意加上去除log4j依赖,假如你项目引入其它版本的log4j的话,容易造成jar冲突

      
           
                        org.slf4j
                        slf4j-log4j12
         
        
                      log4j
                      log4j
           
       
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    dubbo配置,我放在一个common工程,taoshop-common-rpc

    
            UTF-8
            1.0.0
            3.4.6
        
    
        
            
                io.dubbo.springboot
                spring-boot-starter-dubbo
                ${dubbo.springboot.version}
            
    
             
                org.apache.curator
                curator-framework
                2.12.0
            
    
            
                org.apache.zookeeper
                zookeeper
                ${zookeeper.version}
                
                    
                        org.slf4j
                        slf4j-log4j12
                    
                    
                        log4j
                        log4j
                    
                
            
    
    
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    provider工程一般是Service工程,我新建一个taoshop-provider-item订单工程

    
    
                com.muses.taoshop.provider-api
                taoshop-provider-api-item
                1.0-SNAPSHOT
            
    
            
                com.muses.taoshop.common
                taoshop-common-rpc
                1.0-SNAPSHOT
            
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    dubbo配置:

    spring.dubbo.application.name=taoshop-provider-item
    spring.dubbo.registry.protocol=zookeeper
    spring.dubbo.registry.address=127.0.0.1:2181
    spring.dubbo.protocol.name=dubbo
    spring.dubbo.protocol.port=20880
    spring.dubbo.scan=com.muses.taoshop
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    业务接口实现:
    注意点:这里要加上dubbo提供的@Service注解,而不是spring框架提供的@Service注解

    com.alibaba.dubbo.config.annotation.Service

    package com.muses.taoshop.item.service;
    
    import com.alibaba.dubbo.config.annotation.Service;
    import com.muses.taoshop.item.entity.ItemDetail;
    import com.muses.taoshop.item.entity.ItemPortal;
    import com.muses.taoshop.item.entity.ItemSpec;
    import com.muses.taoshop.item.mapper.ItemMapper;
    import org.springframework.beans.factory.annotation.Autowired;
    
    
    import java.util.List;
    
    /**
     * 
     *  商品信息服务实现类
     * 
    * * @author nicky * @version 1.00.00 *
     * 修改记录
     *    修改后版本:     修改人:  修改日期: 2018.06.24 22:37    修改内容:
     * 
    */ @Service(version = "1.0.0") public class ItemServiceImpl implements IItemService { @Autowired ItemMapper itemMapper; /** * 在门户网站列出商品粗略信息 * * @return */ @Override public List listItemPortal() { return itemMapper.listItemPortal(); } /** * 获取商品详情信息 * @return ItemDetail */ @Override public ItemDetail getItemDetailInfo(int spuId){ ItemDetail itemDetail = itemMapper.getItemDetail(spuId); return itemDetail; } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    随意写个SpringBoot启动类:

    package com.muses.taoshop.item;
    
    /**
     * 
     *  服务提供者
     * 
    * * @author nicky * @version 1.00.00 *
     * 修改记录
     *    修改后版本:     修改人:  修改日期: 2018.11.17 23:24    修改内容:
     * 
    */ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ImportResource; import java.util.concurrent.CountDownLatch; @SpringBootApplication //@ImportResource({"classpath:dubbo-provider.xml"}) public class ItemProviderApplication { // private static final Logger logger = Logger.getLogger(ItemProviderApplication.class); @Bean public CountDownLatch closeLatch() { return new CountDownLatch(1); } public static void main(String[] args) throws InterruptedException { ApplicationContext ctx = SpringApplication.run(ItemProviderApplication.class, args); // logger.info("项目启动!"); // CountDownLatch closeLatch = ctx.getBean(CountDownLatch.class); // closeLatch.await(); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    启动一下provider,在监控平台上可以看到启动成功的服务,服务接口暴露成功
    在这里插入图片描述

    服务消费者
    Dubbo配置:

    spring.dubbo.application.name=taoshop-consume-portal
    spring.dubbo.registry.protocol=zookeeper
    spring.dubbo.registry.address=127.0.0.1:2181
    spring.dubbo.scan=com.muses.taoshop
    spring.dubbo.monitor.protocol=registry
    
    • 1
    • 2
    • 3
    • 4
    • 5

    xml配置就是这样的
    自动发现

    
    
    • 1

    引用,主要是引入import com.alibaba.dubbo.config.annotation.Reference;

    @Reference
    IItemService iItemService;
    
    • 1
    • 2

    参考资料

    SpringBoot+Dubbo

    零基础搭建一套微服务框架(Spring Boot + Dubbo + Docker + Jenkins)

  • 相关阅读:
    MySQL命令行中文乱码问题
    建模杂谈系列156 一个接口服务的改版升级
    Arthas之类操作
    5G RedCap工业智能网关
    【C++】STL之适配器---用deque实现栈和队列
    软著申请模板
    vue面试如何准备,这几道面试题助力你拿到理想offer
    MySQL笔记1(数据库的好处,数据库的概念,数据库的特点,MySQL的启动,数据模型,SQL)
    华秋DFM从2.1.6升级到3.x版本出现的问题
    DSP28335学习记录(四)——ADC、DMA
  • 原文地址:https://blog.csdn.net/asdfadafd/article/details/126716924