一、Dubbo简介
1,官方说明
Apache Dubbo 是一个高可用的,基于Java的开源RPC框架。
Dubbo框架不仅仅是具备RPC访问功能,还包含服务治理功能。
2.发展历史
Dubbo是最开始是阿里巴巴内部使用的RPC框架。
2011年对外提供。
2012年停止更新。
2017年开始继续更新。
2019年捐献给Apache,由Apache维护2.7以上版本。
3.Dubbo架构讲解
3.1架构图
3.2架构说明
3.2.1Registry
注册中心。放置所有Provider对外提供的信息。包含Provider的IP,访问端口,访问遵守的协议,对外提供的接口,接口中有哪些方法等相关信息。
3.2.2Provider
服务提供者。容器(Spring容器),Dubbo完全基于Spring实现的。
3.2.3Consumer
消费者(RPC调用者,SOA调用服务的项目)
3.2.4 Monitor
监控中心。监控Provider的压力情况等。每隔2分钟Consumer和Provider会把调用次数发送给Monitor,由Monitor进行统计。
4.执行流程
- start:启动Spring容器时会把Provider启动。
- register:把Provider相关信息注册到Registry里
- subscribe:Consumer从Registry中订阅Provider的信息
- notify:通知给Consumer
- invoke:Consumer根据Registry通知的信息进行调用Provider中方法。
- count:Consumer和Provider把调用次数信息异步发送给Monitor进行统计。
二、Dubbo支持的协议
1.Dubbo协议(官方推荐协议)
优点:
采用NIO复用单一长连接,并使用线程池并发处理请求,减少握手和加大并发效率,性能较好(推荐使用)
缺点:
大文件上传时,可能出现问题(不使用Dubbo文件上传)
2.RMI(Remote Method Invocation)协议
优点:
JDK自带的能力。
缺点:
偶尔连接失败.
3.Hessian协议
优点:
可与原生Hessian互操作,基于HTTP协议
缺点:
需hessian.jar支持,http短连接的开销大
三、Dubbo支持的注册中心
1.Zookeeper(官方推荐)
1) 优点:
支持分布式.很多周边产品.
2) 缺点:
受限于Zookeeper软件的稳定性.
2.Multicast
1) 优点:
去中心化,不需要单独安装软件.
2) 缺点:
2.2.1 Provider和Consumer和Registry不能跨机房(路由)
3.Redis
1) 优点:
支持集群,性能高
2) 缺点:
4.Simple
1) 优点:
标准RPC服务.没有兼容问题
2) 缺点:
不支持集群.
四、Dubbo项目搭建
1、创建Maven聚合工程
依赖的jar如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>DubboDemo</artifactId>
<packaging>pom</packaging>
<version>1.0.0</version>
<modules>
<module>api</module>
<module>provider</module>
<module>cunsumer</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.10.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<!-- springboot依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.1.10.RELEASE</version>
</dependency>
<!-- web依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.10.RELEASE</version>
</dependency>
<!-- dubbo依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<!-- zk依赖 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2、zk搭建
待补充
3、定义API接口
public interface DemoDubboService {
public String demo(String param);
}
3、生产者搭建
3.1、pom文件
<!-- API接口jar -->
<dependency>
<artifactId>api</artifactId>
<groupId>com.test</groupId>
<version>1.0.0</version>
</dependency>
<!-- springboot依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- dubbo依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<!-- zk依赖 curator框架 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
</dependency>
3.2、服务执行方法
@Service
public class DemoDubboServiceImpl implements DemoDubboService {
public String demo(String param) {
System.out.println("执行demo");
return “”;
}
}
1.集成的是api包里面的DemoDubboService
2.@Service(dubbo是基于spring)
3.3、配置文件
配置文件
dubbo:
application:
name: dubbo-provider
registry:
address: zookeeper://xxxx:2181
- registry:zk注册地址
- application:服务名称
3.4、服务启动
@SpringBootApplication
@EnableDubbo
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class , args);
}
}
添加 @EnableDubbo 注解
4、消费者搭建
4.1、pom文件
<!-- API接口jar -->
<dependency>
<artifactId>api</artifactId>
<groupId>com.test</groupId>
<version>1.0.0</version>
</dependency>
<!-- springboot依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- dubbo依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<!-- zk依赖 curator框架 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
</dependency>
4.2、调用服务
@Service
public class DemoServiceImpl implements DemoService{
@Reference
private DemoDubboService demoDubboService ;
@Override
public String demo() {
return demoDubboService.demo("11111");
}
}
- 使用 @Reference注解去调用dubbo的服务生产者
4.4、Controller
@Controller
public class DemoController {
@Autowired
private DemoService demoService ;
@RequestMapping("/demo")
@ResponseBody
public String demo()
{
return demoService.demo();
}
}
4.5、配置文件
dubbo:
application:
name: dubbo-consumer
registry:
address: zookeeper://xxxx:2181
- registry:zk注册地址
- application:服务名称
4.6、启动服务
@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
添加 @EnableDubbo 注解