Dubbo配置,高可用及相关原理
Dubbo
- 基础知识:
什么是分布式系统:就是若干独立计算机的集合
RPC:远程过程调用
影响RPC框架性能的两点:服务器之间能否快速建立连接;序列化与反序列化机制的反应速度
Dubbo与Spring Boot的整合步骤 :
- 在pom文件中加入Dubbo的依赖
- 在application.properties文件中加入配置:
3.要暴露服务就用@service注解,要远程引用服务就用@Reference注解
Dubbo配置文件的加载顺序:
启动时检查:
默认情况是=check=true;在启动时就会自动检查所需的服务是否在注册中心,如果没有就会报错。所以修改为false,只有在调用服务时才会检查服务是否可用。
服务超时:在规定时间内服务消费者没有对服务消费者做出反应就中止服务,防止线程大量阻塞
<Timeouot=0>:时间单位是毫秒,默认值是1000
起作用的优先级:
Timeout一般配合retries(重试次数)使用
Retries是一个整数,但是不包括第一次调用<retries=”0>,0代表不重试,一次出错就出错
在幂等(无论重试多少次输出效果都一样)方法设置重试次数来提高性能【查询,删除,修改】,非幂等方法不能设置重试次数【新增】
多版本:使用场景就是当系统出现不兼容的版本升级
与Spring Boot的三种整合方式:
- 导入Dubbo的starter,在application.properties中配置Dubbo的相关的属性,主要使用@service标签来暴露服务和是哟个@Reference标签来引用。注意要用@EnableDubbo注解开启基于注解Dubbo功能
- 保留Dubbo的XML配置文件的方式,再加上@ImportResource
暴露服务也不需要用@Service注解
3.使用注解API的方式
将每一个组件手动创建到容器中,让Dubbo扫描其他组件就可以
配置Dubbo的扫描路径:
高可用场景:
- zookeeper宕机与dubbo直连
现象:zookeeper注册中心宕机还可以消费dubbo暴露的服务
原因:
也可以绕过注册中心,即Dubbo直连:
- 集群下Dubbo负载均衡配置,默认使用随机权重负载均衡机制
即寻找处理最快的
服务降级:
什么是服务降级:当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务的和页面有策略地不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作。
可以通过服务降级功能临时屏蔽某个出错的非关键业务,并定义降级后的返回策略,向注册中心写入动态配置覆盖规则
其中:
- mock=force:return+null表示消费方对该服务的方法的调用都直接返回null值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响
mock=fail:return+null表示消费方对该服务的方法调用在失败后在返回null值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响
集群容错:
在集群调用失败时,Dubbo提供了多种容错方案,缺省为failover
集群容错模式:
整合Hystrix服务容错:
- 配置spring-cloud-starter-netfilx-hystrix
Springboot官方提供了对hystrix的集成,直接在pom.xml里加入依赖
@EnableHystrix开启服务容错
Dubbo的原理
RPC原理:
一次完整的RPC调用流程如下(同步调用):
- 服务消费方(client)调用以本地调用方式调用服务
- Client stub接收到调用后负责将方法,参数等组装成能够进行网络传输的消息体
- Client stub找到服务地址,并将消息发送到服务端
- Server stub接收到消息后进行解码
- Server stub根据解码结果调用本地的服务
- 本地服务执行并将结果返回给server stub
- Server stub将返回结果打包成消息并发送至消费方
- Client stub接收到消息并进行解码
- 服务消费方的到最终结果
RPC框架的目标就是将2-8步的过程封装起来,对用户不可见
Netty通信原理:
Netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。极大地简化了TCP和UDP套接字服务器等网路编程。
阻塞式IO:
非阻塞式IO:
Selector一般称为选择器,也可以理解为多路复用器
Connect:连接就绪 -- Accept:接受就绪 -- Read:读就绪-- Write:写就绪