Dubbo是由阿里巴巴开源的一个高性能、基于Java开源的远程调用框架。如其他RPC系统一样,Dubbo是基于定义服务的概念,指定可以通过参数和返回类型远程调用的方法。在服务器端,服务器实现这个接口,并运行一个Dubbo服务器来处理客户端调用。在客户端,客户机有一个存根,它提供与服务器相同的方法。
Dubbo的三个核心功能:基于接口的远程调用、容错和负载均衡,以及服务的自动注册与发现。Dubbo框架广泛的在阿里巴巴内部使用,以及其他平台。
Container:服务运行容器
Provider:服务提供者
Consumer:服务消费者
Registry:服务注册与发现中心
Monitor:监控器,统计服务的调用次数和调用时间的监控中心
【Provider】—》(1.register)【Registry】:服务提供者注册到注册中心
【Consumer】----》(2.subscribe)【Registry】;服务消费者去注册中心订阅
【Registry】—》(3.notify)【Consumer】:注册中心告知消费者订阅成功,能够找到对应的服务提供者
【Consumer】—》(4.invoke)【Provider】:远程调用生产者进行消费。
【Monitor】:监控整个Dubbo运行的参数。
整个过程中,只有消费者调用生产者是同步,其他均为异步操作
Multicast注册中心不需要启动任何中心节点,只要广播地址一样,就可以互相发现。
1.提供方启动时广播自己的地址
2.消费方启动时广播订阅请求
3.提供方收到订阅请求时,单播自己的地址给订阅者,如果设置了unicast=false,则广播给订阅者
4.消费方收到提供方地址时,连续该地址给RPC调用。
不建议生产使用Multicast,只适合小规模使用。组播地址段:224.0.0.0-239.255.255.255
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
<dubbo.version>2.7.3</dubbo.version>
</properties>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.version}</version>
</dependency>
创建demo,Project下包含三个maven项目,分别是api,customer,provider。
api项目中,创建接口。
provider项目中实现接口,并且在实现Service上不能用
不能用@Component注解,要使用dubbo提供的@Service注解
并且Service注解可以指定版本@Service(version="1.0"),如果消费着调用的版本不同时,也是无法调用的。
配置文件配置
# 防止端口冲突
server:
port: 8001
# dubbo配置
dubbo:
application:
# 应用名称
name: provider
registry:
# 注册中心地址
address: multcast://224.5.6.7:1234
# 超时时间
timeout: 6000
protocol:
# 协议名称
name: dubbo
# 协议端口
port: 20880
scan:
# 扫描包位置,暴露服务位置
base-packages: com.dubbo.provider.service
而在customer项目中,
@Component
public class ss implements CommandLineRunner {
//不用autowired注解,而是使用Reference注解,并且该注解时dubbo中的,不要选成其他的。
//unicast由于本机自测,需要使用广播方式,才能获取到服务提供者
@Reference(version = "1.0",parameters = {"unicast","false"})
private UserService userService;
@Override
public void run(String... args) throws Exception {
System.out.println(userService.findById());
}
}
另外在配置文件中配置:
# 防止端口冲突
server:
port: 8002
# dubbo配置
dubbo:
application:
# 应用名称
name: consumer
registry:
# 注册中心地址
address: multcast://224.5.6.7:1234
注意:不推荐使用Multicast注册中心
Dubbo支持curator作为Zookeeper客户端实现。
Zookeeper是开源的分布式应用程序协调服务,是Hadoop和Hbase的重要组件。它是一个分为应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
在此,Zookeeper主要作为服务注册中心存在。将编写好的服务注册到Zookeeper服务注册中心。
服务注册中心,给客户端提供可调用的服务列表,客户端在调用远程服务时,根据服务列表选择服务方的服务地址进行服务调用。负责服务地址的注册与发现,相当于目录服务。
是一个树形结构。
创建安装目录zookeeper。
mkdir -p /usr/local/zookeeper
解压
tar zxvf zookeeper-3.6.1-bin.tar.gz -C /usr/local/zookeeper
把conf目录下的zoo_sample.cfg改名为:zoo.cfg
mv zoo_sample.cfg zoo.cfg
配置文件内容介绍:
# 心跳的秒数
tickTime = 2000
# 初始化的线程数
initLimit = 10
# 同步的线程数
syncLimit = 5
# 数据的目录
DataDir = /tmp/zookeeper
# 建议指定自定义目录
DataDir = /usr/local/zookeeper/data
logDir = /usr/local/zookeeper/logs
# 默认端口2181
clientPort = 2181
bin目录下:
主要关注:zkServer.sh(linux启动程序)
启动命令:
./zkServer.sh start
查看启动状态:
./zkServer.sh status
在api项目中,引入依赖。注册中心客户端引入curator客户端
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<type>pom</type>
</dependency>
生产者yml文件修改
dubbo:
application:
# 应用名称
name: provider
registry:
# 注册中心地址,改为自己本机IP
address: zookeeper://192.168.10.100:2181
# 超时时间
timeout: 6000
# 元中心地址
metadata-report:
address:zookeeper://192.168.10.100:2181
protocol:
# 协议名称
name: dubbo
# 协议端口
port: 20880
scan:
# 扫描包位置,暴露服务位置
base-packages: com.dubbo.provider.service
消费者只需要把注册中心地址改为zookeeper地址即可,不需要添加元数据中心地址.
消费者会拉去注册中心的服务缓存到本地,即使注册中心宕机,之前的服务也能用,但是新的服务无法发现