|
| 1 | +## Dubbo |
| 2 | + |
| 3 | +#### 1.什么是Dubbo? |
| 4 | + |
| 5 | +Dubbo是基于Java的高性能轻量级的RPC分布式服务框架,现已成为 Apache 基金会孵化项目。 |
| 6 | + |
| 7 | +官网:http://dubbo.apache.org/en-us/ |
| 8 | + |
| 9 | +#### 2.为什么要使用Dubbo? |
| 10 | + |
| 11 | +背景: |
| 12 | + |
| 13 | +随着互联网的快速发展,Web应用程序的规模不断扩大,最后我们发现传统的垂直体系结构(整体式)已无法解决。分布式服务体系结构和流计算体系结构势在必行,迫切需要一个治理系统来确保体系结构的有序发展。 |
| 14 | + |
| 15 | +- 开源免费 |
| 16 | +- 一些核心业务被提取并作为独立的服务提供服务,逐渐形成一个稳定的服务中心,这样前端应用程序就可以更好地响应变化多端的市场需求 |
| 17 | +- 分布式框架能承受更大规模的流量 |
| 18 | +- 内部基于netty性能高 |
| 19 | + |
| 20 | +#### 3.Dubbo提供了哪3个关键功能? |
| 21 | + |
| 22 | +基于接口的远程调用 |
| 23 | + |
| 24 | +容错和负载均衡 |
| 25 | + |
| 26 | +自动服务注册和发现 |
| 27 | + |
| 28 | +#### 4.你知道哪些机构在用Dubbo吗? |
| 29 | + |
| 30 | + |
| 31 | + |
| 32 | +#### 5.Dubbo服务的关键节点有哪些? |
| 33 | + |
| 34 | + |
| 35 | + |
| 36 | +#### 6.说一下Dubbo服务注册流程? |
| 37 | + |
| 38 | +1. 服务容器负责启动,加载,运行服务提供者。 |
| 39 | +2. 服务提供者在启动时,向注册中心注册自己提供的服务。 |
| 40 | +3. 服务消费者在启动时,向注册中心订阅自己所需的服务。 |
| 41 | +4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。 |
| 42 | +5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。 |
| 43 | +6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。 |
| 44 | + |
| 45 | +#### 7.能画一下服务注册流程图吗? |
| 46 | + |
| 47 | + |
| 48 | + |
| 49 | +#### 8.Dubbo架构的特点? |
| 50 | + |
| 51 | +连通性、健壮性、伸缩性、以及向未来架构的升级性。 |
| 52 | + |
| 53 | +#### 9.对jdk的最小版本需求? |
| 54 | + |
| 55 | +jdk1.6+ |
| 56 | + |
| 57 | +#### 10.注册中心的选择? |
| 58 | + |
| 59 | +一般来说选中Zookeeper更稳定更合适。 |
| 60 | + |
| 61 | +除了Zookeeper还有Redis注册中心、Multicast注册中心、Simple注册中心。 |
| 62 | + |
| 63 | +#### 11.Dubbo的核心配置?用途? |
| 64 | + |
| 65 | + |
| 66 | + |
| 67 | +#### 12.配置优先级规则? |
| 68 | + |
| 69 | + |
| 70 | + |
| 71 | +优先级从高到低: |
| 72 | + |
| 73 | +- JVM -D参数,当你部署或者启动应用时,它可以轻易地重写配置,比如,改变dubbo协议端口; |
| 74 | +- XML, XML中的当前配置会重写dubbo.properties中的; |
| 75 | +- Properties,默认配置,仅仅作用于以上两者没有配置时。 |
| 76 | + |
| 77 | +#### 13.如何用代码方式绕过注册中心点对点直连? |
| 78 | + |
| 79 | +```java |
| 80 | +… |
| 81 | + |
| 82 | +ReferenceConfig<XxxService> reference = new ReferenceConfig<XxxService>(); // 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏 |
| 83 | +// 如果点对点直连,可以用reference.setUrl()指定目标地址,设置url后将绕过注册中心, |
| 84 | +// 其中,协议对应provider.setProtocol()的值,端口对应provider.setPort()的值, |
| 85 | +// 路径对应service.setPath()的值,如果未设置path,缺省path为接口名 |
| 86 | +reference.setUrl("dubbo://10.20.130.230:20880/com.xxx.XxxService"); |
| 87 | + |
| 88 | +… |
| 89 | +``` |
| 90 | + |
| 91 | +#### 14.Dubbo配置来源有几种?分别是? |
| 92 | + |
| 93 | +4种 |
| 94 | + |
| 95 | +- JVM System Properties,-D参数 |
| 96 | +- Externalized Configuration,外部化配置 |
| 97 | +- ServiceConfig、ReferenceConfig等编程接口采集的配置 |
| 98 | +- 本地配置文件dubbo.properties |
| 99 | + |
| 100 | +#### 15.如何禁用某个服务的启动检查? |
| 101 | + |
| 102 | +```xml |
| 103 | +<dubbo:reference interface = "com.foo.BarService" check = "false" /> |
| 104 | +``` |
| 105 | + |
| 106 | +#### 16.Dubbo 负载均衡策略?默认是? |
| 107 | + |
| 108 | +- 随机负载平衡(默认) |
| 109 | + |
| 110 | +- RoundRobin负载平衡 |
| 111 | + |
| 112 | +- 最小活动负载平衡 |
| 113 | + |
| 114 | +- 一致的哈希负载平衡 |
| 115 | + |
| 116 | +#### 17.上线兼容老版本? |
| 117 | + |
| 118 | +多版本号(version) |
| 119 | + |
| 120 | +#### 18.开发测试环境,想绕过注册中心如何配置? |
| 121 | + |
| 122 | +- xml |
| 123 | + |
| 124 | +```xml |
| 125 | + <dubbo:reference id="xxxService" interface="com.alibaba.xxx.XxxService" url="dubbo://localhost:20890" /> |
| 126 | + |
| 127 | +``` |
| 128 | + |
| 129 | +- -D |
| 130 | + |
| 131 | + ```powershell |
| 132 | + java -Dcom.alibaba.xxx.XxxService=dubbo://localhost:20890 |
| 133 | + ``` |
| 134 | + |
| 135 | +- .properties |
| 136 | + |
| 137 | + ```properties |
| 138 | + java -Ddubbo.resolve.file=xxx.properties |
| 139 | + ``` |
| 140 | + |
| 141 | +```properties |
| 142 | +com.alibaba.xxx.XxxService=dubbo://localhost:20890 |
| 143 | +``` |
| 144 | + |
| 145 | +#### 19.集群容错几种方法? |
| 146 | + |
| 147 | + |
| 148 | + |
| 149 | +#### 20.Dubbo有几种配置方式? |
| 150 | + |
| 151 | +1. Spring |
| 152 | +2. Java API |
| 153 | + |
| 154 | +#### 21.Dubbo有哪些协议?推荐? |
| 155 | + |
| 156 | +- dubbo://(推荐) |
| 157 | +- rmi:// |
| 158 | +- hessian:// |
| 159 | +- http:// |
| 160 | +- webservice:// |
| 161 | +- thrift:// |
| 162 | +- memcached:// |
| 163 | +- redis:// |
| 164 | +- rest:// |
| 165 | + |
| 166 | +#### 22.Dubbo使用什么通信框架? |
| 167 | + |
| 168 | +dubbo使用netty。 |
| 169 | + |
| 170 | +#### 23.dubbo协议默认端口号?http协议默认端口?hessian?rmi? |
| 171 | + |
| 172 | +- dubbo:20880 |
| 173 | +- http:80 |
| 174 | +- hessian:80 |
| 175 | +- rmi:80 |
| 176 | + |
| 177 | +#### 24.Dubbo默认序列化框架?其他的你还知道? |
| 178 | + |
| 179 | +- dubbo协议缺省为hessian2 |
| 180 | +- rmi协议缺省为java |
| 181 | +- http协议缺省为json |
| 182 | + |
| 183 | +#### 25.一个服务有多重实现时,如何处理? |
| 184 | + |
| 185 | +可以用group分组,服务提供方和消费放都指定同一个group。 |
| 186 | + |
| 187 | +#### 26.Dubbo服务调用默认是阻塞的?还有其他的? |
| 188 | + |
| 189 | +默认是同步等待结果阻塞的,同时也支持异步调用。 |
| 190 | + |
| 191 | +Dubbo 是基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小,异步调用会返回一个 Future 对象。 |
| 192 | + |
| 193 | +#### 27.Dubbo服务追踪解决方案? |
| 194 | + |
| 195 | +- Zipkin |
| 196 | +- Pinpoint |
| 197 | +- SkyWalking |
| 198 | + |
| 199 | +#### 28.Dubbo不维护了吗?Dubbo和Dubbox有什么区别? |
| 200 | + |
| 201 | +现在进入了Apache,由apache维护。 |
| 202 | + |
| 203 | +Dubbox是当当的扩展项目。 |
| 204 | + |
| 205 | +#### 29.Dubbox有什么新功能? |
| 206 | + |
| 207 | +- 支持REST风格远程调用(HTTP + JSON/XML) |
| 208 | + |
| 209 | +- 支持基于Kryo和FST的Java高效序列化实现 |
| 210 | + |
| 211 | +- 支持基于嵌入式Tomcat的HTTP remoting体系 |
| 212 | +- 升级Spring |
| 213 | +- 升级ZooKeeper客户端 |
| 214 | + |
| 215 | +#### 30.io线程池大小默认? |
| 216 | + |
| 217 | +cpu个数 + 1 |
| 218 | + |
| 219 | +#### 31.dubbo://协议适合什么样的服务调用? |
| 220 | + |
| 221 | +采用单一长链接和NIO异步通讯,适用于小数量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。 |
| 222 | + |
| 223 | +不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。 |
| 224 | + |
| 225 | + |
| 226 | + |
| 227 | +#### 32.自动剔除服务什么原理? |
| 228 | + |
| 229 | +zookeeper临时节点,会话保持原理。 |
| 230 | + |
| 231 | +#### 33.从 `2.0.5` 版本开始,dubbo支持通过x命令来进行服务治理? |
| 232 | + |
| 233 | +telnet |
| 234 | + |
| 235 | +#### 34.如何用命令查看服务列表? |
| 236 | + |
| 237 | +```powershell |
| 238 | +telnet localhost 20880 |
| 239 | +``` |
| 240 | + |
| 241 | +进入命令行。然后执行 ls相关命令: |
| 242 | + |
| 243 | +- `ls`: 显示服务列表 |
| 244 | +- `ls -l`: 显示服务详细信息列表 |
| 245 | +- `ls XxxService`: 显示服务的方法列表 |
| 246 | +- `ls -l XxxService`: 显示服务的方法详细信息列表 |
| 247 | + |
| 248 | +#### 35.Dubbo框架设计是怎样的? |
| 249 | + |
| 250 | + |
| 251 | + |
| 252 | +各层说明: |
| 253 | + |
| 254 | +- **config 配置层**:对外配置接口,以 `ServiceConfig`, `ReferenceConfig` 为中心,可以直接初始化配置类,也可以通过 spring 解析配置生成配置类 |
| 255 | +- **proxy 服务代理层**:服务接口透明代理,生成服务的客户端 Stub 和服务器端 Skeleton, 以 `ServiceProxy` 为中心,扩展接口为 `ProxyFactory` |
| 256 | +- **registry 注册中心层**:封装服务地址的注册与发现,以服务 URL 为中心,扩展接口为 `RegistryFactory`, `Registry`, `RegistryService` |
| 257 | +- **cluster 路由层**:封装多个提供者的路由及负载均衡,并桥接注册中心,以 `Invoker` 为中心,扩展接口为 `Cluster`, `Directory`, `Router`, `LoadBalance` |
| 258 | +- **monitor 监控层**:RPC 调用次数和调用时间监控,以 `Statistics` 为中心,扩展接口为 `MonitorFactory`, `Monitor`, `MonitorService` |
| 259 | +- **protocol 远程调用层**:封装 RPC 调用,以 `Invocation`, `Result` 为中心,扩展接口为 `Protocol`, `Invoker`, `Exporter` |
| 260 | +- **exchange 信息交换层**:封装请求响应模式,同步转异步,以 `Request`, `Response` 为中心,扩展接口为 `Exchanger`, `ExchangeChannel`, `ExchangeClient`, `ExchangeServer` |
| 261 | +- **transport 网络传输层**:抽象 mina 和 netty 为统一接口,以 `Message` 为中心,扩展接口为 `Channel`, `Transporter`, `Client`, `Server`, `Codec` |
| 262 | +- **serialize 数据序列化层**:可复用的一些工具,扩展接口为 `Serialization`, `ObjectInput`, `ObjectOutput`, `ThreadPool` |
| 263 | + |
| 264 | +#### 36.你读过Dubbo的源码吗? |
| 265 | + |
| 266 | +这个问题其实面试中如果问dubbo的话,基本就会带这个问题。有时间的话,大家可以下载源码,读一读,如果大家有兴趣的话,我会出后续文章。 |
| 267 | + |
| 268 | +参考:http://dubbo.apache.org/en-us/ |
| 269 | + |
| 270 | + |
| 271 | + |
0 commit comments