这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战
简介dubbo和SpringCloud
dubbo
- 阿里开源被apache收购.
- 可使用的注册中心为zookeeper、redis、memcached
- 可使用的rpc协议为dubbo、hession、thrift
- dubbo协议是基于netty的nio的http长连接
- dubbo自带admin(后台管理页面)和monitor(服务监控和预警)
SpringCloud了解各个组件
1. Eureka
注册中心
eureka包括eureka-server、eureka-client两个
client将本地服务的ip及监听的端口注册到server中
server有一个注册表,其中记录着所有的client的信息
client每隔一段时间会获取server的注册表信息将其缓存在本地
2. feign
远程服务调用
动态代理的方式
3. ribbon
负载均衡
默认使用轮询的策略进行负载均衡
4. hystrix
隔离、熔断和降级
逻辑中订单服务需要调用库存服务、仓储服务和积分服务.如果其中积分服务挂掉了.会导致订单服务中的线程阻塞,时间长了会影响订单服务访问其他服务.从而导致整体服务的宕机.所以这个时候就需要熔断机制.
5. zuul
网关
将所有的服务全部集合起来.由网关统一进行分发请求.
面试问题---eureka
- Eureka Server是如何保证轻松抗住这每秒数百次请求,每天千万级请求的呢?
- Eureka注册中心使用什么样的方式来储存各个服务注册时发送过来的机器地址和端口号?
1. eureka缓存与心跳机制
- 缓存:eureka-client,每隔30s就会请求一次eureka-server拉去最近有变化的服务信息.
- 心跳机制:eureka-client每隔30s请求一次eureka-server告诉server我还活着
2. eureka注册表结构
基于纯内存维护的一个registry的CocurrentHashMap数据结构.
-
首先,这个ConcurrentHashMap的key就是服务名称,比如“inventory-service”,就是一个服务名称。
-
value则代表了一个服务的多个服务实例。Map<String, Lease<InstanceInfo>>
- key为服务的实例id
- value是一个叫做Lease的类
- 这个InstanceInfo就代表了服务实例的具体信息,比如机器的ip地址、hostname以及端口号。
- 而这个Lease,里面则会维护每个服务最近一次发送心跳的时间
-
举例:比如“inventory-service”是可以有3个服务实例的,每个服务实例部署在一台机器上。
3. eureka-server的多级缓存机制
- ReadOnlyCacheMap
- ReadWriteCacheMap
- 内存
三十秒重置一次所有缓存数据,从内存中获取进行重新更新
- 在拉取注册表的时候:
-
- 首先从ReadOnlyCacheMap里查缓存的注册表。
-
- 若没有,就找ReadWriteCacheMap里缓存的注册表。
-
- 如果还没有,就从内存中获取实际的注册表数据。
- 在注册表发生变更的时候:
-
- 会在内存中更新变更的注册表数据,同时过期掉ReadWriteCacheMap。
-
- 此过程不会影响ReadOnlyCacheMap提供人家查询注册表。
-
- 一段时间内(默认30秒),各服务拉取注册表会直接读ReadOnlyCacheMap
-
- 30秒过后,Eureka Server的后台线程发现ReadWriteCacheMap已经清空了,也会清空ReadOnlyCacheMap中的缓存
-
- 下次有服务拉取注册表,又会从内存中获取最新的数据了,同时填充各个缓存。
面试问题---SpringCloud与dubbo之间的区别
面试问题---开发和测试在同一个注册中心,如何做到隔离
在发布和订阅服务的时候指定group或version
RPC
RPC有三要素 socket 动态代理 序列化
Dubbo
dubbo的工作原理
- service:业务层,提供provider和consumer
- config
- proxy层,生成代理,代理之间进行网路通信
- registry层,将所有的provider都注册,方便进行调用
- cluster层,集群,将多个同类型服务集群成一个服务
- monitor,监控监控rpc接口的调用情况
- protocol,远程调用,封装rpc调用
- exchange,信息交换
- transport,网络传输层
- serialize,数据序列化层
dubbo的通信协议,序列化协议
dubbo协议是基于NIO的长链接协议.使用hession进行序列化
dubbo负载均衡策略
- 随机
- 轮询
- 自动感知
- 一致hash算法
dubbo集群容错策略
- 失败自动切换
- 一次调用失败就立即失败
- 出现异常时忽略掉
- 失败了后台自动记录请求
dubbo的spi思想
插件扩展场景.也就是dubbo定义了接口,可以自己按照接口进行自定义自己的实现类