Dubbo
一、Dubbo基础
1.分布式介绍
1)分布式的定义
2)应用架构的演变
ORM(单一应用)->MVC(垂直应用架构)->RPC(远程过程调用)->SOA(面向服务、ESB企业服务总线)->微服务->云计算
分布式系统组合:1.zookeeper+dubbo组合 2.springboot+springcloud组合
注册中心:zookeeper
RPC框架(远程调用框架):dubbo,ali开源的分布式服务框架。
2.远程调用方式
2.1 RPC(长连接:性能好):dubbo
跨操作系统在同一编程语言内使用
2.2 http(三次握手):httpClient
跨系统跨编程语言的远程调用框架
二、dubbo介绍
1.dubbo是基于Java的高性能RPC分布式服务框架。核心功能:面向接口的远程方法调用、智能容错和负载均衡、服务自动注册和发现。
2 设计架构
节点角色说明:
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
调用关系说明:
0) 服务容器负责启动,加载,运行服务提供者。
1) 服务提供者在启动时,向注册中心注册自己提供的服务。
2) 服务消费者在启动时,向注册中心订阅自己所需的服务。
3) 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4)服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5) 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
3 zookeeper注册中心
4 管理控制台(监控中心)
dubbo-admin:dubbo控制台。图形化服务管理页面,安装时需要指定注册中心地址,即可从注册中心获取到所有的提供者/消费者进行配置管理。
5 创建提供者消费者工程
6 创建提供者配置和测试
7 创建消费者配置和测试
8 监控中心
dubbo-monitor-simple:简单的监控中心。
三、dubbo与spring-boot整合
1.整合步骤
1)dubbo-spring-boot-starter
2)application.properties配置相关配置
服务提供者配置:
3)@EnableDubbo:开启基于注解的dubbo功能
@Service:dubbo service,提供者, 暴露接口
@Reference:消费者
2. dubbo.properties
-D(虚拟机参数) > xml > properties
3.启动检查
check="false"
<dubbo:consumer check="false" />
4.超时配置和覆盖关系配置
timeout
1)精确优先:方法>接口>全局配置
2)消费者优先:消费方>提供方
5.重试次数
6 多版本
7.本地存根
8.dubbo与springboot整合的三种方式
8.1 常用
1)dubbo-spring-boot-starter
2)application.properties配置相关配置
3)@EnableDubbo:开启基于注解的dubbo功能
@Service:dubbo service,提供者, 暴露接口
@Reference:消费者
8.2 dubbo.xml配置文件
1)dubbo-spring-boot-starter
2)使用ImportResource导入dubbo.xml配置文件
8.3 使用注解API的方式
四、dubbo高可用
1.zookeeper宕机与dubbo直连
通过本地缓存通讯
2.负载均衡机制
1)轮询(可加权重)
2)随机(可加权重)
3)最小连接数
4)一致性hash
3.服务降级
1)mock=force:return+null。直接返回null
2)mock=fail:return+null。调用失败返回null
4.集群容错和整合Hystrix
4.1集群容错模式
1) failover cluster:失败自动切换 默认
2) failfast:快速失败,非幂等性
3) failsafe:失败安全
4) failback:失败自动恢复
5) forking:并行调用多个服务器
6) broadcast:广播调用所有提供者
4.2集群容错配置
1)消费者或提供者配置
<dubbo:service cluster="failsafe" />或
<dubbo:reference cluster="failsafe" />
4.3整合Hystrix 默认
1) 导入hystrix的依赖
spring-cloud-starter-netflix-hystrix
2)@EnableHystrix:启用
五、Dubbo原理
1.RPC和Netty原理
1.1 RPC原理
1)RPC调用流程图:
2)rpc实现技术:
2.1)动态代理
生成 rpc-client和rpc-server 需要用到 Java 动态代理技术 ,我们可以使用JDK原生的动态代理机制,可以使用一些开源字节码工具框架 如:CgLib、Javassist等。
2.2)序列化
为了能在网络上传输和接收 Java对象,我们需要对它进行 序列化和反序列化操作。
* 序列化:将Java对象转换成byte[]的过程,也就是编码的过程;
* 反序列化:将byte[]转换成Java对象的过程;
可以使用Java原生的序列化机制,但是效率非常低,推荐使用一些开源的、成熟的序列化技术,例如:protobuf、Thrift、hessian、Kryo、Msgpack
关于序列化工具性能比较可以参考:jvm-serializers
2.3)NIO
当前很多RPC框架都直接基于netty这一IO通信框架,比如阿里巴巴的HSF、dubbo,Hadoop Avro,推荐使用Netty 作为底层通信框架。
2.4)服务注册中心
可选技术:
* Redis
* Zookeeper
* Consul
* Etcd
1.2 Netty通信原理 NIO
dubbo通信是通过netty框架。
NIO:同步非阻塞,多个通道,可以多路复用。
2.架构设计
3.标签解析
4.服务暴露流程
5.服务应用流程
6.服务调用流程
7.结束语