【手把手系列】 springboot集成dubbo

本教程用于springboot与dubbo的集成,阅读前请确保你已熟悉相关理论知识,并对java基础知识、环境搭建有一定的了解。本教程不再叙述如何安装JDK、配置环境变量、软件安装及启动等过程。欢迎评论及拍砖。

需准备的环境:(windows系统)

  • JDK 1.8.0_131
  • Apache-maven 3.3.9
  • Apache-zookeeper 3.4.13
  • Apache-tomcat 7.0.57
  • IntelliJ IDEA

通过spring初始化工具,新建spring-boot项目,创建3个模块,分别命名为:

  • producer(生产者模块)
  • consumer(消费者模块)
  • api(公用接口封装模块)

项目结构图如下:

图1 - 项目结构示意图

主POM文件

POM引入包如下,我这里放在了主POM中,只需引入web模块、test模块、dubbo和zookeeper(如果不用ZK注册中心,可以不用引入):

<dependencies>
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
   </dependency>

   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
   </dependency>

   <!-- web -->
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
   </dependency>

   <!-- dubbo依赖 -->
   <dependency>
      <groupId>com.alibaba.spring.boot</groupId>
      <artifactId>dubbo-spring-boot-starter</artifactId>
      <version>2.0.0</version>
   </dependency>

   <dependency>
      <groupId>org.apache.zookeeper</groupId>
      <artifactId>zookeeper</artifactId>
      <version>3.3.3</version>
   </dependency>
   <dependency>
      <groupId>com.github.sgroschupf</groupId>
      <artifactId>zkclient</artifactId>
      <version>0.1</version>
   </dependency>
</dependencies>

api模块

定义接口ITestService,定义方法say,代码如下:

public interface ITestService {
    String say(String username);
}

producer模块

application.yml中定义端口server.port=8101(改成yml的书写格式)
在resources下创建dubbo.properties文件,内容如下:

dubbo.container=logback,spring
dubbo.application.logger=slf4j
dubbo.application.name=dubbo-producer
dubbo.application.owner=dev
dubbo.registry.address=zookeeper://localhost:2181
dubbo.provider.retries=0
dubbo.provider.timeout=10000
dubbo.consumer.check=false
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.service.shutdown.wait=30000
dubbo.protocol.host=
dubbo.protocol.accesslog=${accesslog}

在resources下创建config/dubbo-provider.xml文件,内容如下:

<dubbo:application name="${dubbo.application.name}"/>
<!--公共配置在dubbo.properties-->
<dubbo:provider timeout="5000" delay="-1" loadbalance="leastactive" retries="0"
                cluster="failfast" threadpool="fixed" threads="400"/>
<!-- 对外提供的服务 -->
<dubbo:service interface="com.hifun.dubbo.service.ITestService" ref="testService" version="1.0.0"/>

定义接口实现类TestServiceImpl实现ITestService,代码如下:

@Service("testService")
public class TestServiceImpl implements ITestService {
    @Override
    public String say(String username) {
        return "hello " + username;
    }
}

定义Application启动类DubboProducerApplication,代码如下:

@SpringBootApplication
@PropertySource("classpath:dubbo.properties")
@ImportResource("classpath:config/*.xml")
public class DubboProducerApplication {
    public static void main(String[] args) {
        SpringApplication.run(DubboProducerApplication.class, args);
    }
}

启动生产者,确认启动成功。

consumer模块

application.yml中定义端口server.port=8102(改成yml的书写格式)
在resources下创建dubbo.properties文件,内容与producer模块一致即可。
在resources下创建config/dubbo-consumer.xml文件,内容如下:

<!-- 消费方应用信息,用于计算依赖关系 -->
<dubbo:application name="${dubbo.application.name}"/>
<dubbo:registry address="${dubbo.registry.address}" />
<dubbo:reference interface="com.hifun.dubbo.service.ITestService"
                 id="testService" retries="0" timeout="6000" version="1.0.0"/>

定义对外服务接口类TestController,用于提供外部接口服务,代码如下:

@RestController
public class TestController {
    @Autowired
    private ITestService testService;

    @RequestMapping(value = "/hello/{username}")
    public String hello(@PathVariable String username) {
        System.out.println("testService--->" + (testService instanceof ITestService));
        return testService.say(username);
    }
}

定义Application启动类DubboConsumerApplication,代码如下:

@SpringBootApplication
@PropertySource("classpath:dubbo.properties")
@ImportResource("classpath:config/*.xml")
public class DubboClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(DubboClientApplication.class, args);
    }
}

启动消费者,确认启动成功。
浏览器访问地址http://localhost:8102/hello/123, 打印出”hello 123”则表示访问正常。

admin模块

服务治理管理端,dubbo-2.6.1版本之后不再有dubbo-admin,因此需要在之前的版本打包安装,我用的是2.5.4版本。GITHUB地址:dubbo-2.5.4源码。下载后打成war包(mvn package),将dubbo-admin-2.5.4-SNAPSHOT.war放到tomcat的webapps目录下,启动tomcat。

浏览器访问dubbo-admin,输入账号密码root,出现如下界面,表示本地启动成功。

图2 - dubbo-admin

注意事项

  • 生产者和消费者启动成功,但在浏览器访问controller外放的接口时,出现如下报错:
    com.alibaba.dubbo.rpc.RpcException: No provider available from registry localhost:2181 for service com.hifun.dubbo.service.ITestService on consumer xxx.xxx.xxx.xxx use dubbo version 2.6.0, may be providers disabled or not registered ?
    原因: producer通过<dubbo:service/>配置提供dubbo服务,consumer通过<dubbo:reference/>配置指向dubbo服务接口。若配置version属性,则需保持配置一致;否则均不做配置。
  • 生产者和消费者之间互通的接口应放置在独立模块,便于两个模块引入和调用。
  • 参照网上其他的教程,生产者可以不是web项目,只需Application保持启动状态即可。
  • 其他问题遇到后再追加。

如果有哪里写的不对或者可以改进的地方,欢迎留言探讨。如果需要转载,请帮忙评论并附上原文地址https://www.jianshu.com/p/ce77f6038b8b。万分感激。

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

推荐阅读更多精彩内容