阿里官方提供的dubbo-spring-boot-starter 1.0.1 整合的dubbo 2.6.0和spring boot 1.5.9 案例

简介

1、根据阿里官方提供的dubbo-spring-boot-starter 1.0.1 整合的dubbo 2.6.0和spring boot 1.5.9。
2、项目有四个工程,提供者provider、消费者 consumer、服务接口 api 、测试项目test。
3、consumer项目是web项目,其他的为jar项目。
4、注意修改application.yaml(application.properties) 配置文件中的zookeeper地址和端口号。
5、测试项目主要是一直发送请求,测试当服务的提供者,消费者和注册中心挂掉后请求是否能够丢失。

操作步骤:

1、创建maven parent工程统一管理项目所有的jar的版本,parent的父项目设置为spring boot

image.png

勾选‘Create a simplate project’ ,创建简单项目


image.png

设置组名,项目名,包类型为pom


image

在dubbo-parent项目的pom.xml文件中添加spring-boot依赖使项目变成spring-boot项目。
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

添加项目的公共依赖jar包:

    <!--dubbo-springBoot依赖-->
    <dependency>
            <groupId>com.alibaba.spring.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>1.0.1</version>
    </dependency>
        <!--zookeeper依赖-->
        <dependency>
              <groupId>org.apache.zookeeper</groupId>
              <artifactId>zookeeper</artifactId>
              <version>3.4.11</version>
        </dependency>
        <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.10</version>
    </dependency>

添加打包配置: 红色部分配置自己的javac地址或者在maven的settings.xml中配置javapath

    <build>
        <finalName>dubbo-parent</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>  
                <groupId>org.apache.maven.plugins</groupId>  
                <artifactId>maven-compiler-plugin</artifactId>  
                <version>3.1</version>  
                <configuration>  
                    <verbose>true</verbose>  
                    <fork>true</fork>  
                    <executable>D://Program Files/Java/jdk1.8.0_25/bin/javac</executable>  
                </configuration>  
            </plugin> 
        </plugins>
    </build>

2、创建模块项目 dubbo-api,此项目是服务的接口项目,需要打成jar包供服务端和消费端调用。

image.png

创建 Maven Model 项目


image.png

选择默认的简单项目


image.png

模块项目的目录
image.png

编写服务暴露接口 DemoService.java :
package cn.xuhao.dubbo.api;

public interface DemoService {
    public String sayHello(String s);
}

在 bean 包中添加公共实体类。
通过maven打包,放到本地仓库中,用于服务端和消费端调用。

3、创建dubbo-provide 服务端项目,可创建jar项目或者web项目,这里创建jar项目。

创建项目同dubbo-api项目相同。
修改pom.xml文件,添加dubbo-api的依赖

        <dependency>
            <groupId>cn.xuhao</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

在spring-boot的启动类:Application.java中添加注解(@EnableCaching和@EnableDubboConfiguration)和挂起服务(不挂起执行完就结束了):
如果创建的是web项目就不用修改代码,只添加注解就好了。

package cn.xuhao.dubboProvide;

import java.util.concurrent.CountDownLatch;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;

@EnableCaching
@SpringBootApplication
@EnableDubboConfiguration
public class Application {
    //使用jar方式打包的启动方式
    private static CountDownLatch countDownLatch = new CountDownLatch(1);
    public static void main(String[] args) throws InterruptedException {
    SpringApplication.run(Application.class, args).registerShutdownHook();
    countDownLatch.await();
    }
}

实现dubbo-api项目中的接口 DemoServerImp.java :

package cn.xuhao.dubboProvide.service.impl;

import org.springframework.stereotype.Service;

import com.alibaba.dubbo.config.annotation.Reference;

import cn.xuhao.dubbo.api.DemoService;
import cn.xuhao.dubbo.api.TestService;

@com.alibaba.dubbo.config.annotation.Service(interfaceClass = DemoService.class)
@Service
public class DemoServerImp implements DemoService {

    @Reference(check=false)//启动消费者不检查服务者是否存在
    public TestService testService;
    
    @Override
    public String sayHello(String s) {
        String test = "调用失败";
        try {
            test = testService.testService(s);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "provide服务提供方0:你好,"+s+"! \t\t " + test;
    }
}

编写项目中的application.yaml(application.properties)配置文件,配置dubbo服务,注意修改协议的端口号:

spring:
  dubbo:
    appname: provider-test
    registry: zookeeper://192.168.76.128:2181
    protocol: dubbo
    port: 20880

4、创建dubbo-consumer服务的消费端。项目创建为web类型的项目。

项目pom.xml文件中添加web和接口依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--服务接口 -->
        <dependency>
          <groupId>cn.xuhao</groupId>
          <artifactId>dubbo-api</artifactId>
          <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>

项目的目录结构为:


image.png

在项目启动的Application.class文件中添加@EnableDubboConfiguration注解:

package cn.xuhao.dubboConsumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;

@SpringBootApplication
@EnableDubboConfiguration
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

编写DubboTestController.java ,使用@Reference注解使用dubbo服务端服务

package cn.xuhao.dubboConsumer.controller;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.dubbo.config.annotation.Reference;

import cn.xuhao.dubbo.api.DemoService;


@RestController
public class DubboTestController {
    @Reference(check=false)//启动消费者不检查服务者是否存在
    public DemoService demoService;

    @RequestMapping(value = "hello/{name}",method = RequestMethod.GET)
    public String Hello(@PathVariable String name){
        String ret_msg;
        try {
            ret_msg  = demoService.sayHello(name);
        }catch (Exception e){
            e.printStackTrace();
            ret_msg = "出错啦!";
        }
        return  ret_msg;
    }
}

修改application.properties配置文件,配置tomcat端口和dubbo服务

## tomcat端口号配置  
server.port=8088
## 项目访问路径配置  
server.context-path=/
## Dubbo 应用名称  
spring.dubbo.appname=consumer-test
##Dubbo 注册中心地址  
spring.dubbo.registry=zookeeper://192.168.76.128:2181
##Dubbo 协议名称  
spring.dubbo.protocol=dubbo

现在依次启动dubbo-provide,dubbo-consumer项目,就会在dubbo管控中心看到对应的提供者和消费者


image.png

image.png

5、创建测试项目dubbo-test

项目的创建方式同dubbo-api项目,创建简单的jar项目,通过jsoup调用服务消费者。
项目目录:


image.png

编写简单的测试类Main:

package dubboTest;

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

public class Main{
    public static void main(String[] args){
        long sumtime = 0;
        int count = 10000;
        //循环调用,请求id连续,判断请求是否丢失
        for(int i= 0;i< count;i++) {
            try {
                long start = System.currentTimeMillis();
                //jsoup 调用消费者地址
                Document doc = Jsoup.connect("http://localhost:8088/hello/请求"+i).get();
                Elements elements = doc.select("body");  //获取body中的内容
                long end = System.currentTimeMillis();
                long time = end-start;  //记录调用时间
                sumtime += time;
                String result = "执行时间" + time + "\t\t"+elements.text();
                System.out.println(result);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //计算平均调用时间
        float avgTime = sumtime/count;
        System.out.println("平均执行时间:" + avgTime +"毫秒");
    }
}

测试执行结果:

1、三个服务提供者,测试1w次请求:
image.png

测试请求1w次,平均执行时间3ms

2、测试多个服务端,其中一个服务端挂掉,请求与调用是否会丢失?

一个服务端挂掉后,消费者的rpc调用失败,dubbo进行重连,请求会被别的服务端执行不会丢失。
我关闭 服务提供方1,第2346次请求调用服务提供方1失败,重连后调用的服务提供方0.


image.png

image.png
3、服务端全部挂掉后服务怎么办。

服务消费端报错,服务调用失败,服务消费端无限重连。


image.png

image.png
4、服务服务注册中心挂掉。

消费端能够缓存注册中心注册的服务端,注册中心挂掉后,消费端能够根据缓存调用服务端,当有服务端挂掉也会根据缓存的服务端进行失败重连,直到所有服务端挂掉才会调用失败,dubbo管控台不会感知挂掉的服务。
我关掉服务提供端0,dubbo只调用的提供端1,没有服务丢失。


image.png

image.png

image.png

dubbo服务调用执行流程:


image

调用流程:
1、服务提供方启动运行,向注册中心注册服务;
2、服务消费者启动运行,向注册中心注册,并订阅自己所需的服务。
3、注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送不变更数据给消费者。
4、服务消费者,从提供者地址列表中基于负载均衡算法,选一台提供者进行调用,如果调用失败再选另一台调用。
5、服务消费者和提供者,在内存中累计调用次数和调用时间,每分钟发送一次统计数据到监控中心。

github源码地址: https://github.com/xuejian0616/dubbo-spring-boot-starter-demo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容

  • 为什么你的判断是错的? 在日常工作、生活过程中,人们会遇到各种各样的问题。 解决问题的能力,是一个人的核心竞争力,...
    Ceelog阅读 520评论 0 1
  • 昨日在梦回鼓浪屿中,说起了菽庄花园的主人林尔嘉生平独爱菊,今天分享一篇菊花的诗句。 过故人庄 (孟浩然) ...
    乐明月阅读 401评论 0 1
  • 七年之痒,仿佛是一个劫数一般,让许多山盟海誓的情侣走到尽头,细细想想,大抵是恋爱的时间长了却没有给彼此一个安全的前...
    嗅到海棠香阅读 265评论 0 0
  • 今日主讲老师 潘非,助教 陈沿伊。 静坐观修环节进步很大,观修内容依然是发愿,陈老师想,慢慢教会孩子观察自己的心...
    老潘圆非阅读 599评论 0 2
  • 最近竟在我觉得只会浪费学生时间的课堂上体会到一些东西。 首先是一门需要做论文报告的课堂上。论文对我来说,是那种能看...
    Shuiha11阅读 241评论 0 0