一 、Dubbo 是什么?
Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 [1] Spring框架无缝集成。
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:
- 面向接口的远程方法调用
- 智能容错和负载均衡
- 服务自动注册和发现。
二、为什么我要区分 2.6.x 和 2.7.x ?
Dubbo有很长一段时间的发展史,2018年的时候不知道为什么阿里暂更了一年,之后又重新开始更新。之前一直是阿里在维护,后面阿里把它捐给了Apache基金会,由Apache来维护,2.6.x之前,maven中的包名都是alibaba,2.7.0之后包名改成了apache,其中整合入系统中有一些差异;发展史:
- 2008年,阿里巴巴开始内部使用 Dubbo;
- 2009年初,发布1.0版本;
- 2011年10月,阿里巴巴宣布开源,版本为2.0.7;
- 2014年,当当网 fork 了 Dubbo 版本,命名为dubbox-2.8.0,并支持 HTTP REST 协议;
- 2014年10月,发布2.3.11版本;
- 2017年9月,阿里巴巴重启维护,重点升级所依赖的 JDK 及组件版本,发布2.5.4/5版本;
- 2018年2月,阿里巴巴宣布将 Dubbo 捐献给 Apache,进入 Apache 孵化器;
- 2018年6月,Apache Dubbo 发布首个加入 Apache 孵化器的版本2.6.2,发展首位committer,来自有赞的@yiji同学;
- 2018年7月,Dubbo 官方域名更新到 dubbo.apache.org,页面焕然一新,并启 用新 logo,品牌全面升级;
- 2018年11月,加入孵化器以来,发展来自有赞的 @yiji同学成为首位 PPMC member;
- 2018年12月,第八届云计算标准和应用大会 ,Dubbo 获得中国优秀开源项目一等奖,同时获得开源中国举办的2018中国优秀开源项目奖,位列排行榜第3;
- 2019年1月,发布了2.7.0,支持 Java 1.8,包名更改为org.apache,支持 Restful 服务;
- 2019年1月,Dubbo 社区正式发布 Dubbo Ecosystem, 升级为完整的微服务解决方案;
- 2019年5月21日,Dubbo 从 Apache 正式毕业。
三、包依赖区别
-
2.6.x alibaba
-
2.7.x apache
从图中可以看出, alibaba包中的starter已经依赖了dubbo、zookeeper、curator、spring-boot-start、dubbo-spring-boot-autoconfigure,而apache的包中只有dubbo-spring-boot-autoconfigure,所以如果使用apache的包的话,需要自行引入dubbo和注册中心的相关包,如果使用的是alibaba的包的话就不需要了。
四、Dubbo项目的基本结构
Dubbo的原理什么的以及它的组成这里就不扯了,直接说说dubbo的项目结构吧。
基本的Dubbo项目组成分为三个部分:
- 接口层
- 服务提供层
- 服务器消费层
五、实现整合
5.1 接口层
接口层这里自定义了接口,实现部分由服务提供层来实现。建议将model也放在接口层中,接口层中对dubbo没有相关依赖,在这里pom就不提供了。
- 实例
// vo层
@Data
public class UserVO implements Serializable {
private Integer id;
private String userName;
private Integer age;
}
// service 接口层
public interface IUserAdminService {
/**
* 通过用户id获取用户
* @param userId
* @return
*/
UserVO getUserById(String userId);
}
完成之后可以mvn install打包到本地仓库或者打包成jar包供提供者或者消费者使用
5.2 服务提供层 2.6.x
- pom
...
2.6.x
<!-- 导入接口依赖 -->
<dependency>
<groupId>com.martain.dubbo</groupId>
<artifactId>api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- duboo -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
2.7.x
<!-- dubbo -->
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.4.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.4.1</version>
</dependency>
<!--zookeeper 注册中心客户端引入 使用的是curator客户端 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.4.1</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
- 服务实现接口
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
import service.IUserAdminService;
@Service // 注意,这个是dubbo包里面的service,不是spring包里面的
@Component
public class UserAdminService implements IUserAdminService {
@Override
public UserVO getUserById(String userId) {
UserVO userVo = ...
...
return userVo;
}
}
- 启动类 Application上添加注解
@SpringBootApplication
@EnableDubbo
@MapperScan(basePackages = "com.jhunicom.community.model.mapper")
public class ServerApplication {
public static void main(String[] args) {
//如果不需要是web项目
new SpringApplicationBuilder(ServerApplication.class)
//非web应用
.web(WebApplicationType.NONE)
.run(args);
// 如果是web应用
// SpringApplication.run(ServerApplication.class,args);
}
}
- 配置文件中配置
dubbo:
application:
name: dubbo-producer #dubbo的注册的服务名, 唯一性
version: 1.0.0 # 服务提供的版本
registry:
address: zookeeper://127.0.0.1:2181 # 注册中心的地址
protocol:
#协议名称
name: dubbo
#服务暴露端口
port: 20880
scan:
base-packages: com.martain.dubbo.server.service # 接口实现类的包名
5.3 消费者层
- pom
2.6.x
<!-- 导入接口依赖 -->
<dependency>
<groupId>com.martain.dubbo</groupId>
<artifactId>api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- duboo -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
2.7.x
<!-- dubbo -->
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.4.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.4.1</version>
</dependency>
<!--zookeeper 注册中心客户端引入 使用的是curator客户端 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.4.1</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
- 远程调用服务
import com.alibaba.dubbo.config.annotation.Reference;
import service.IUserAdminService;
@RestController
public class TestController {
@Reference // 使用该注解,dubbo会自动到注册中心寻找服务提供者
IUserAdminService userAdminService;
@GetMapping("/user/{userId}")
public Result getUserById(@PathVariable String userId){
UserVO userVo = userAdminService.getUserById(userId);
...
- 启动类中添加 @EnableDubbo 注解
@EnableDubbo
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
- 配置文件
dubbo:
application:
name: dubbo-consumer #dubbo的注册的服务名, 唯一性
version: 1.0.0 # 版本号
registry:
address: zookeeper://127.0.0.1:2181 # 配置注册中心