什么是 Dubbo?它有哪些核心功能?
普通人
Dubbo 是以高性能 RPC 框架,它提供了分布式架构下的服务之间通信方案,使
得开发者可以不需要关心网络通信的细节。通过该框架可以使得远程服务调用方
式和本地服务调用方式一样简单。
高手
Dubbo 是一款高性能、轻量级的开源 RPC 框架。由 10 层模式构成,整个分层
依赖由上至下。
通过这张图我们也可以将 Dubbo 理解为三层模式:
第一层的 Business 业务逻辑层由我们自己来提供接口和实现还有一些配置信息。
第二层的 RPC 调用的核心层负责封装和实现整个 RPC 的调用过程、负载均衡、
集群容错、代理等核心功能。
Remoting 则是对网络传输协议和数据转换的封装。
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
根据
Dubbo
官方文档的介绍,
Dubbo
提供了六大核心能力
面向接口代理的高性能
RPC
调用。
智能容错和负载均衡。
服务自动注册和发现。
高度可扩展能力。
运行期流量调度。
可视化的服务治理与运维。
面试官:既然说到
Dubbo
的功能,请详细说说
Dubbo
负载均衡的几种策略
高手:
Dubbo
有五种负载策略:
第一种是加权随机:假设我们有一组服务器
servers = [A, B, C]
,他们对应的权
重为
weights = [5, 3, 2]
,权重总和为
10
。现在把这些权重值平铺在一维坐标值
上,
[0, 5)
区间属于服务器
A
,
[5, 8)
区间属于服务器
B
,
[8, 10)
区间属于服
务器
C
。接下来通过随机数生成器生成一个范围在
[0, 10)
之间的随机数,然后
计算这个随机数会落到哪个区间上就可以了。
第二种是最小活跃数:每个服务提供者对应一个活跃数
active
,初始情况下,
所有服务提供者活跃数均为
0
。每收到一个请求,活跃数加
1
,完成请求后则将
活跃数减
1
。在服务运行一段时间后,性能好的服务提供者处理请求的速度更快,
因此活跃数下降的也越快,此时这样的服务提供者能够优先获取到新的服务请求。
第三种是一致性
hash
:通过
hash
算法,把
provider
的
invoke
和随机节点生成
hash
,并将这个
hash
投射到
[0, 2^32 - 1]
的圆环上,查询的时候根据
key
进
行
md5
然后进行
hash
,得到第一个节点的值大于等于当前
hash
的
invoker
。
第四种是加权轮询:比如服务器
A
、
B
、
C
权重比为
5:2:1
,那么在
8
次请求中,
服务器
A
将收到其中的
5
次请求,服务器
B
会收到其中的
2
次请求,服务器
C
则收到其中的
1
次请求。
第五种是最短响应时间权重随机: 计算目标服务的请求的响应时间,根据响应
时间最短的服务,配置更高的权重进行随机访问。
面试官:
Dubbo
的工作原理是什么样的?
高手:
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
1.
服务启动的时候,
provider
和
consumer
根据配置信息,连接到注册中心
register
,分别向注册中心注册和订阅服务
2.register
根据服务订阅关系,返回
provider
信息到
consumer
,同时
consumer
会把
provider
信息缓存到本地。如果信息有变更,
consumer
会收到来自
register
的推送
3.consumer
生成代理对象,同时根据负载均衡策略,选择一台
provider
,同时
定时向
monitor
记录接口的调用次数和时间信息
4.
拿到代理对象之后,
consumer
通过代理对象发起接口调用
5.provider
收到请求后对数据进行反序列化,然后通过代理调用具体的接口实现
面试官:最后在说说
Dubbo
与
Spring Cloud
的区别吧!
Dubbo
是
SOA
时代的产物,它的关注点主要在于服务的调用,流量分发、流
量监控和熔断。而
Spring Cloud
诞生于微服务架构时代,考虑的是微服务治理
的方方面面,另外由于依托了
Spirng
、
Spirng Boot
的优势之上,两个框架在
开始目标就不一致,
Dubbo
定位服务治理、
Spirng Cloud
是一个生态。
两者最大的区别是
Dubbo
底层是使用
Netty
这样的
NIO
框架,是基于
TCP
协议传输的,配合以
Hession
序列化完成
RPC
通信。而
SpringCloud
是基
于
Http
协议
+Rest
接口调用远程过程的通信,相对来说,
Http
请求会有更大
的报文,占的带宽也会更多。但是
REST
相比
RPC
更为灵活,服务提供方和调
用方的依赖只依靠一纸契约,不存在代码级别的强依赖。
以上就是我对
Dubbo
的理解了!
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
谈一谈你对 MySQL 性能优化的理解。
大家好,我是
MIC
,一个工作了
13
年的
Java
程序员。
MySQL
作为一种免费开源的关系型数据库,深受着互联网公司的喜爱。
因此,它也成为了技术面试官最常问的问题之一。
今天,我们就通过普通人与高手的形式,带大家深入了解
MySQL
的性能优化技
巧。
普通人
MySQL 的性能优化主要在于对 SQL 执行的优化,因为慢的 SQL 执行会带来不好
的用户体验,所以我们要关注 SQL 的执行时间,比如有些没有创建索引的列我们
要创建索引.不合理的联表查询我们要简化或者规避.比如,在我以前的一个项目
中,我的 SQL 没有索引执行,所以平均执行都需要很多的时间.后面我加上了索引
就好多了.
高手
MySQL
的性能优化我认为可以分为
4
大部分
l
硬件和操作系统层面的优化
l
架构设计层面的优化
l MySQL
程序配置优化
l SQL
优化
硬件及操作系统层面优化
从硬件层面来说,影响
Mysql
性能的因素有,
CPU
、可用内存大小、磁盘读写
速度、网络带宽
从操作系层面来说,应用文件句柄数、操作系统网络的配置都会影响到
Mysql
性能。
这部分的优化一般由
DBA
或者运维工程师去完成。
在硬件基础资源的优化中,我们重点应该关注服务本身承载的体量,然后提出合
理的指标要求,避免出现资源浪费!
架构设计层面的优化
MySQL
是一个磁盘
IO
访问量非常频繁的关系型数据库
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
在高并发和高性能的场景中
.MySQL
数据库必然会承受巨大的并发压力,而此时,
我们的优化方式可以分为几个部分。
1.
搭建
Mysql
主从集群,单个
Mysql
服务容易单点故障,一旦服务器宕机,将
会导致依赖
Mysql
数据库的应用全部无法响应。 主从集群或者主主集群可以保
证服务的高可用性。
2.
读写分离设计,在读多写少的场景中,通过读写分离的方案,可以避免读写
冲突导致的性能影响
3.
引入分库分表机制,通过分库可以降低单个服务器节点的
IO
压力,通过分表
的方式可以降低单表数据量,从而提升
sql
查询的效率。
4.
针对热点数据,可以引入更为高效的分布式数据库,比如
Redis
、
MongoDB
等,他们可以很好的缓解
Mysql
的访问压力,同时还能提升数据检索性能。
MySQL
程序配置优化
MySQL
是一个经过互联网大厂验证过的生产级别的成熟数据库,对于
Mysql
数
据库本身的优化,一般是通过
Mysql
中的配置文件
my.cnf
来完成的,比如。
Mysql5.7
版本默认的最大连接数是
151
个,这个值可以在
my.cnf
中修改。
binlog
日志,默认是不开启
缓存池
bufferpoll
的默认大小配置等。
由于这些配置一般都和用户安装的硬件环境以及使用场景有关系,因此这些配置
官方只会提供一个默认值,具体情况还得由使用者来修改。
关于配置项的修改,需要关注两个方面。
l
配置的作用域,分为会话级别和全局
l
是否支持热加载
因此,针对这两个点,我们需要注意的是:
l
全局参数的设定对于已经存在的会话无法生效
l
会话参数的设定随着会话的销毁而失效
l
全局类的统一配置建议配置在默认配置文件中,否则重启服务会导致配置失效
SQL
优化又能分为三步曲
l
第一、慢
SQL
的定位和排查
我们可以通过慢查询日志和慢查询日志分析工具得到有问题的
SQL
列表。
l
第二、执行计划分析
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构
跟着Mic学架构