=========================请看上篇================================
第7章 RPC服务的发展历程和对比分析
1. RPC采用客户端/服务端模式,请求程序就是一个客户端,服务提供程序就是一个服务端。
RPC是构建在语言级之上的,是跨语言的,它在OSI七层模型中介于会话层和表示层之间。
2. RPC实现透明的远程过程调用的重点
就是创建客户存根(client stub),存根(stub)就像代理(agent)模式里的代理(agent),在生成代理代码后,代理的代码就能与远程服务端通信了,通信的过程都由RPC框架实现,而调用者就像调用本地代码一样方便。在客户端看来,存根函数就像普通的本地函数一样,但实际上包含了通过网络发送和接收消息的代码。
(1)客户端存根的方法会将参数打包并封装成一个或多个网络消息体并发送到服务端。将参数封装到网络消息中的过程被称为编码(encode),它会将所有数据序列化为字节数组格式。
(2)服务端存根(server stub)接收客户端发送的消息,并对参数消息进行编码(decode),通常它会将参数从标准的网络格式转换成特定的语言格式。
(3)服务端存根在将该返回值进行编码并序列化后,通过一个或多个网络消息发送给客户端。
3. 在使用RMI的JVM中,Java支持两种操作:标记脏数据和清理。当对象仍在使用时,本地JVM会定期向服务器的JVM发送一个标记脏数据的调用。标记脏数据基于服务器给定的时间间隔定期重新发送心跳信息。当客户端没有更多的本地引用远程对象时,会发送一个清理的调用给服务器。
第8章 Dubbo实战及源码分析
1. Dubbo的三大类配置
(1)服务发现类:表示该配置项用于服务的注册与发现,目的是让消费者找到提供者。
(2)服务治理类:表示该配置项用于治理服务间的关系,或为开发测试提供便利条件。
(3)性能调优类:表示该配置项用于调优性能,不同的选项会对性能产生不同的影响。
2. 由服务提供者设置超时,因为服务提供者更清楚一个方法需要执行多久。
3.
(1)如果服务需要预热的时机,比如初始化缓存、等待相关资源就位等,就可以使用delay属性进行服务延迟暴露。
(2)如果一个服务的并发量过大,超出了服务器的承受能力 --- 使用executes属性控制并发。
(3)客户端进行并发控制,通过actives属性限制。
4. 服务隔离
是为了在系统发生故障时限定传播范围和影响范围,从而保证只有出问题的服务不可用,其他服务还是正常的。
隔离一般有线程隔离、进程隔离、读写隔离、集群隔离和机房隔离,而Dubbo还提供了分组隔离,即使用group属性分组。
5. Dubbo中的异步调用时基于NIO的非阻塞机制实现的。
在远程调用的过程中如果出现异常或者需要回调,则可以使用Dubbo的事件通知机制。
6. Dubbo支持的协议
Dubbo协议 --- 通信数据包小、并发高的服务
Hessian协议 --- 传输数据大且提供者比消费者数量多的服务
HTTP或Hessian协议 --- 对于外部与内部进行通信的场景,若想要穿透防火墙的限制
7. Dubbo协议的使用注意事项
(1)在实际情况下消费者的数据比提供者的数量更多
(2)不能传大的数据包
(3)推荐使用异步单一长连接方式
长连接可以减少连接握手验证等,并且使用异步I/O,可以复用线程池,防止出现C10K问题。
8. Dubbo的I/O线程模型
Dubbo的服务提供者主要有两种线程池类型:一种是I/O处理线程池;另一种是业务调度线程池。
Dubbo默认配置无限制大小的CachedThreadPool线程池,这意味着它对所有服务的请求都不会拒绝,但是Dubbo限制了I/O线程数,默认是核数+1。
9. 服务熔断与服务降级
(1)服务熔断
是一种保护措施,一般用于防止在软件系统中由于某些原因使服务出现了过载现象,从而造成整个系统发生故障。
(2)服务降级
是在服务器压力剧增的情况下,根据当前的业务情况及流量对一些服务和页面有策略地进行降级,以释放服务器资源并保证核心任务的正常运行。
10. Dubbo是通过JDK的ShutdownHook来完成优雅停机的。
11. 线上问题排查(此处敲敲黑板)
(1)发现问题
1》系统层面的监控
对系统的CPU利用率、系统负载、内存使用情况、网络I/O负载、磁盘负载、I/O等待、交换区的使用、线程数及打开的文件句柄数等
2》应用层面的监控
对服务接口的响应时间、吞吐量、调用频次、接口成功率及接口的波动率
3》资源层的监控
对数据库(负载、慢SQL、连接数)、缓存(连接数、占用内存、吞吐量、响应时间)和消息队列(响应时间、吞吐量、负载、积压情况)的监控
(2)定位问题
考虑如下问题:
1》问题系统最近是否进行了上线?
2》依赖的基础平台和资源是否进行了上线或者升级?
3》依赖的系统最近是否进行了上线?
4》运营人员是否在系统里做过运营变更?
5》网络是否有波动?
6》最近的业务是否上量?
7》服务的使用方是否有促销活动?
(3)解决问题
每个系统都会对各种严重情况设计止损和降级开关,因此在发生严重问题时先使用止损策略,在恢复问题后再定位和解决问题。解决问题要以定位问题为基础,必须清晰地定位问题产生的根本原因,再提出解决问题的有效方案,切记在没有明确原因之前,不要使用各种可能的方法来尝试修复问题,这样可能导致还没有解决这个问题又引出另一个问题。
(4)消除影响
首先,找运维看日志。
其次,保存现场并恢复现场。在JVM中保存现场快照通常包括保存当前运行线程的快照和保存JVM内存堆栈快照。
12. SPI(Service Provider Interface)
是Java提供的一种服务加载方式,可以避免在Java代码中写死服务提供者,而是通过SPI服务加载机制进行服务的注册和发现,实现多个模块的解耦。
第9章 高性能网络中间件
1. 在OSI中,每一层都使用下一层的协议和服务。每一层的数据包都包含自己的一个包头,这个包头包含本层定义的典型信息如IP地址、TCP端口号,以及本层服务需要的信息如IP分片信息、TCP的流量控制信息等。
因为TCP层的数据包是在IP层的数据包内增加了自己的TCP头,所以在IP层看来,任意一个TCP包都是一个普通的IP包。
2. TCP的核心还是接收序号和确认序号,通过它们可以在中途有数据丢失的情况下,通过返回ACK的序号进行重发。
3. 在应用层进行失效转移、降级、备份方案、重试等操作。