一起来学SpringBoot(十四)Dubbo的整合

Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。

在2月15日,大年三十,经过一系列紧张的投票,来自阿里巴巴的广受社区欢迎的RPC开源框架Dubbo宣布正式进入Apache孵化器。说起Dubbo框架,可能很多后端开发者都有所了解,它是国内比较早的、影响较大的开源项目,包括阿里巴巴、京东、当当网、去哪儿网、网易考拉、微店等电商平台都有其成功应用案例。

Dubbo于2011年开源,之后就迅速成为了国内该类开源项目的佼佼者。可以想象,2011年时,优秀的、可在生产环境使用的RPC框架很少,Dubbo的出现迅速给人眼前一亮的感觉,而同时它又有阿里巴巴背书,所以也迅速收到了开发者的亲睐。Dubbo 目前在 GitHub 上有超过 16000 个 star 和超过 12000 的 fork 数,绝对是国内影响力最大的开源项目之一。

但奇怪的是,在2014年10月30日发布2.4.11版本后,Dubbo突然停止更新,当时社区一片哗然(其实是在2012年10月之后就基本停止了重要升级,改为阶段性维护)。具体原因现在也不得而知,知乎上也有一些讨论,包括团队调整、内部主推HSF等。不过可以确认的是,在4年前,国内企业对于开源的重视程度都远远没有今天高。

而在官方停止更新Dubbo之后,当当网(Dubbox)、网易考拉(Dubbok)都有维护自己单独的分支,这也可以从另外一个侧面证明Dubbo确实应用到了这些企业的重点业务,并且规模不小。

随着阿里巴巴对于开源的逐步重视,2017年9月7日,Dubbo悄悄的在GitHub发布了2.5.4版本。随后,没过多久,又迅速发布了2.5.5、2.5.6、2.5.7等版本。在10月举行的云栖大会上,阿里宣布Dubbo被列入集团重点维护开源项目,这也就意味着Dubbo起死回生,开始重新进入快车道。

这章主要介绍Dubbo是怎么集成springboot的,Dubbo起死回生后,同样官方也放出的对应boot的start

1
2
3
4
5
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>

最新版本呢是兼容springboot 2.x 以上,其中还有0.1.0版本主要针对springboot1.5x的兼容,整合包内默认提供了apcache的curator 来连接zookeeper,所以不用在引用连接zookeeper的包。

项目结构

img

  • dubbo-api 是服务的接口
  • dubbo-provider 是服务的生产者 引用dubbo-api
  • dubbo-consumer 是服务的消费者 引用dubbo-api

服务接口

1
2
3
4
5
package com.maoxs.service;

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

定义一个DemoService的接口,并且写一个sayHello的方法

生产者

首先呢看下yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
spring:
application:
name: springboot-service-provider
server:
port: 9001
dubbo:
protocol:
port: 20880
name: dubbo
application:
registry: zookeeper://127.0.0.1:6379 #如果想改用redis注册中心呢把zookeeper改为redis即可
name: dubbo-provider-demo
id: dubbo-provider-demo
qos-port: 1111
scan:
basePackages: com.maoxs.service.impl
demo:
service:
version: 1.0.0

如果想改用redis注册中心呢把zookeeper改为redis即可。这里的scan.basePackages来扫描dubbo的服务

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.maoxs.service.impl;

import com.alibaba.dubbo.config.MethodConfig;
import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.dubbo.validation.MethodValidated;
import com.maoxs.service.DemoService;

@Service(version = "${demo.service.version}")
public class DefaultDemoService implements DemoService {
public String sayHello(String name) {
return "Hello, " + name + " (from Spring Boot)";
}
}

这个呢是服务的具体实现,切记,这里的@Service用的是dubbo的注解

然后呢是启动类 由于生产者作用只是把服务注册到注册中心,所以可以把启动类设置类非web应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.maoxs;

import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;

@SpringBootApplication
public class SpringbootDubboProviderApplication {

public static void main(String[] args) {
new SpringApplicationBuilder(SpringbootDubboProviderApplication.class)
.web(WebApplicationType.NONE) // 非 Web 应用
.run(args);
}
}

消费者

在来看些消费者的代码

还是先看yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
spring:
application:
name: springcloud-service-consumer
server:
port: 8001
dubbo:
registry:
address: zookeeper://127.0.0.1:2181
#address: redis://127.0.0.1:6379
application:
name: service-consumer
scan:
basePackages: com.maoxs.controller
demo:
service:
version: 1.0.0

然后呢,我们这里做一个controller来调用远程的服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

package com.maoxs.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.maoxs.service.DemoService;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoConsumerController {

@Reference(version = "${demo.service.version}")
private DemoService demoService;

@RequestMapping("/sayHello/{name}")
public String sayHello(@PathVariable String name) {
return demoService.sayHello(name);
}
}

然后呢,我们启动zookeeper 注册中心,把服务注册上去来看下效果

img

ok,我们看到调用成功了!!

本博文是基于springboot2.x 如果有什么不对的请在下方留言。

相关连接:

个人博客地址 : www.fulinlin.com

csdn博客地址:https://blog.csdn.net/qq_32867467

集合源码地址 : https://gitee.com/Maoxs/springboot-test

交流群:826953936

个人qq: 1670245232

注:如果不对联系本宝宝及时改正~~