Dubbo
# 为什么用分布式?
分布式是将整个系统拆分成不同的服务,然后将这些服务放在不同的服务器上减轻单体服务的压力,提高并发量;
拆分之后的每个服务可以部署再不同的机器上,如果某一个服务的访问量比较大的话可以将这个服务同时部署在多台机器上;
# Dubbo架构
- Provider:暴露服务的服务提供方,会向注册中心注册自己提供的服务;
- Container:服务运行容器,负责加载、运行服务提供者;
- Consumer:调用远程服务的服务消费方,会向注册中心订阅自己所需的服务;
- Registry:服务注册与发现的注册中心。注册中心会返回服务提供者地址列表给消费者;
- Monitor: 统计服务的调用次数和调用时间的监控中心。服务消费者和提供者会定时发送统计数据到监控中心;
# Invoker
对远程调用的抽象;
实现了真正的远程服务调用;
- 服务提供
Invoker
- 服务消费
Invoker
# Dubbo工作原理
十层架构:
左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口;
config 配置层:Dubbo 相关的配置。支持代码配置,同时也支持基于 Spring 来做配置,以
ServiceConfig
,ReferenceConfig
为中心proxy 服务代理层:调用远程方法像调用本地的方法一样简单的一个关键,真实调用过程依赖代理类,以
ServiceProxy
为中心。registry 注册中心层:封装服务地址的注册与发现。
cluster 路由层:封装多个提供者的路由及负载均衡,并桥接注册中心,以
Invoker
为中心。monitor 监控层:RPC 调用次数和调用时间监控,以
Statistics
为中心。protocol 远程调用层:封装 RPC 调用,以
Invocation
,Result
为中心。exchange 信息交换层:封装请求响应模式,同步转异步,以
Request
,Response
为中心。transport 网络传输层:抽象 mina 和 netty 为统一接口,以
Message
为中心。serialize 数据序列化层:对需要在网络传输的数据进行序列化。
著作权归JavaGuide(javaguide.cn)所有 基于MIT协议 原文链接:https://javaguide.cn/distributed-system/rpc/dubbo.html
# ServiceBean
每个暴露出去的服务都会生成一个ServiceBean;
public class ServiceBean<T> extends ServiceConfig<T> implements InitializingBean, DisposableBean, ApplicationContextAware, ApplicationListener<ContextRefreshedEvent>, BeanNameAware {
// 代码省略
}
2
3
- ServiceConfig:用于服务暴露,SPI机制;
- InitializingBean:用到了afterPropertiesSet方法,在对象实例化完毕后,调用该方法,做一些值的初始化;
- DisposableBean:主要用到destroy() 方法, 在spring容器showdown的时候调用;
- ApplicationContextAware:为了得到applicationContext;
- ApplicationListener:添加了上下文刷新监听,用于暴露服务使用;
- BeanNameAware:用于设置Bean的名称;
# 服务暴露
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
// 服务没有延迟加载 && 服务没有发布 && 服务没有下线过 。 满足这三个条件,则进行服务暴露
if (isDelay() && !isExported() && !isUnexported()) {
if (logger.isInfoEnabled()) {
logger.info("The service ready on spring started. service: " + getInterface());
}
// 服务暴露
export();
}
}
2
3
4
5
6
7
8
9
10
11
12
在服务没有延迟加载的时候,会调用export方法进行服务暴露, 该方法是其父类的方法,ServiceConfig中的方法;