读-李林峰-分布式服务框架和原理8-13

原创 2017年05月25日 10:50:25

服务调用

几个误区

  • NIO就是异步服务:
    1. 需要区分通信框架的NIO,不等于上层应用调用的异步,2个完全是不同角度,不是一个层面的事情,即使是底层通信的NIO也可以实现上层同步调用服务的功能;
    2. NIO的好处:
      NIO对比
      关于这个看之前那章里面推荐文章。
    3. 服务调用和通信框架的关系
      异步调用和通讯框架的关系
      这里是通过中间的消息队列来实现隔离上层同步异步跟底层通信框架的IO解耦的,现实中会去掉消息队列,使用future模式来实现。
  • 服务调用天生就是同步的:
    1. 现在rpc这么普及,应该不会有人还存在这种观点了吧;
    2. OneWay模式,只有请求没有应答:
      OneWay
    3. 请求-应答模式:
      请求应答模式
  • 异步调用性能更高:个人觉得首先要想清楚为什么需要异步,需要分布式,而不是单纯考虑那个性能更好。

调用方式

  • 同步:
    同步
  • 异步
    异步1
    异步2
  • 并行
    批量
  • 泛化,框架提供通用接口方法,应用实现具体服务,然后发布和引用
    通用
  • 回调,单列出来,在异步的基础上执行回调方法。

服务注册中心

统一管理服务注册发布和订阅。

概念

  • 服务提供者
  • 服务消费者
  • 服务注册中心,有几个特点:
    1. 高HA:支持数据持久化,支持集群;
    2. 数据一致性问题;
    3. 数据变更主动推送。

关键功能特性设计

注册中心工作原理

  1. 服务提供者在启动时,根据配置,向注册中心发布服务相关信息;
  2. 服务消费者启动时,根据配置,向注册中心订阅所需服务,本地缓存;
  3. 注册中心返回服务提供者信息给消费者,如有变更,主动推送消费者,消费者刷新本地缓存;
  4. 服务消费者根据本地缓存的服务提供者地址列表,选择相应提供者进行调用;

    • 支持对等集群
      服务注册中心集群部署
      注册中心组网
    • 注册中心提供CRUD接口
    • 安全加固
  5. 链路的安全性:指的是注册中心与客户端连接的安全认证,基于IP的黑白名单或基于用户名+密码或基于秘钥+数字证书的认证;
  6. 数据安全性:指的是数据的权限控制:
    数据安全性
    • 发布订阅机制:除了启动时的发布订阅,最关键的是动态发布订阅的支持;
    • 可靠性:注册中心集群部署,任意一台宕机,不影响注册中心的使用,集群不可用,只会影响新服务的发布订阅,不影响已缓存服务的使用。

基于zk的服务注册中心设计

基于zk的发布订阅

服务发布和引用

服务提供者需要支持通过配置、注解、api接口调用等方式发布服务,同理,服务消费者也可以通过这些方式引用服务。

服务发布

服务发布

  • 服务发布的几种方式:
    1. xml配置,注解,api接口调用
      服务发布3种方式比较
  • 本地实现类封装成代理,其好处:
    1. 发布流程享受,通过抽象代理层,可对服务发布行为本身进行封装和抽象;
    2. 通过动态代理,可对服务发布进行动态拦截,方便对服务发布定制;
    3. 扩展和替换;
  • 服务发布成指定协议
  • 服务提供者信息注册,目的:
    1. 供消费者订阅服务地址信息;
    2. 基于注册中心的统一服务治理;
    3. 服务注册的目录结构可以按照主机、服务名、url来,按实际需求判断,例如按主机来:
      服务注册目录结构按主机

感觉少了一步,在完成服务注册后,服务提供者需要启动监听,等待服务调用。

服务引用

服务引用

  • 本地接口调用转换成远程服务调用,主要是根据配置或注解的远程服务信息,生成服务的动态代理;
  • 服务地址本地缓存,在生成动态代理之前,就会根据引用的服务信息,连接注册中心,获取服务相关配置信息和服务提供者列表,缓存到本地,后期就可以直接在本地查询。
    服务地址本地缓存
  • 远程服务调用,从本地缓存列表获取服务提供者地址信息,根据路由策略,选择链路,然后就是一系列的服务治理,最后远程调用。
    服务远程调用

最佳实践

  • 对等设计:服务的发布或引用,配置支持的,必须也能够通过注解或api接口实现支持;
  • 启动顺序,主要是服务提供者、注册中心、服务消费者3者的系统启动顺序无法控制,其实最主要的是要支持注册中心的断连重连机制,客户端(提供者和消费者)和注册中心定时通信,发布或获取服务信息,这样就无所谓启动顺序;
  • 同步还是异步发布服务,这个主要是服务太多了,如果系统启动时,就发布服务,会影响启动时间,看需求吧;
  • 警惕网络风暴,对于注册中心,可能需要注册的服务太多或者服务变更频繁,挤占注册中心网络带宽,需要考虑的是那些信息需要向注册中心同步;
  • 配置扩展,主要是发布或引用需要支持扩展。

服务灰度发布

作用参考AB测试,保证系统的稳定性前提下,灰度发布解决升级后的兼容性问题。

流程设计

  • 环境准备
    灰度环境准备
  • 灰度规则设置,这个更多的是灰度路由规则,将流量引入灰度环境;
    灰度规则
  • 灰度规则下发;
    下发
  • 灰度路由;
    路由
  • 失败回滚
    失败回滚
  • 灰度发布总结,为下一轮灰度打基础

没搞过这些流程,而且,服务发布可以只发布部分集群,然后为集群配置路由规则引入流量,所以对这一块没想太深入。

参数传递

服务消费者和提供者之间的交互通信,除了正常的业务参数,可能需要携带额外的信息,如消费者的ip地址,调用链的ID等,要保证这些额外信息不影响正常业务参数,即使有线程切换的场景发生。
作者说这些额外参数不能通过业务接口来进行传递,需要框架支持这种参数传递,不太同意,正确的说应该不要影响正常业务接口参数即可。

内部传参

  • 业务内部参数传递
    1. 硬编码,api接口传参,也可以通过ThreadLocal传递(无线程切换场景);
    2. 业务编排引擎对业务进行编排,参数通过编排上下文进行;
    3. 专业的BPM流程引擎进行编排,流程上下文传递参数;
  • 服务框架内部参数传递,内部模块可能发生线程切换,可以直接把所有参数带上,也可以通过将一次调用的参数放入框架的context中,后续参数从其中取值;

外部传参

  • 通信协议支持,参考之前的协议设计,在自定义协议中,支持参数的扩展;
  • 传参接口定义,框架提供接口,用于跨进程的参数传递,通过context线程变量供传参使用。

最佳实践

  • 防止参数互相覆盖,框架的参数不能覆盖业务参数;
  • 参数的生命周期管理,主要是放入context的变量,要记得在调用完成或异常等场景下清理。

服务多版本

服务上线后的功能变更,bug修复,需要多版本管理。

服务多版本管理设计

  1. 服务提供者:发布时,支持指定服务的版本号;
  2. 服务消费者:消费服务的时候,支持指定引用的服务版本号或版本范围。

    • 服务版本号管理,主版本+副版本+微版本
    • 服务提供者,服务消费者:
  3. 服务提供者,发布服务的时候,指定版本号,对于经常变动的服务,单独部署发布;
  4. 服务提供者引用服务时指定版本号或版本范围;
    • 基于版本号的服务路由
      基于版本号路由
    • 服务热升级
      热升级

与OSGI的对比

淘宝的HSF基于osgi,挺牛,能把osgi玩好的不容易。

osgi基于插件管理,支持热部署和热升级,参考eclipse的插件体系。

不使用osgi的原因很多,最主要的就是学习成本太高,不易理解,实现复杂,而他的有点又可以通过其他技术解决,所以除了淘宝的HSF实在没听说太多应用。

服务的多版本管理感觉就是发布服务和引用服务的时候需要指定版本,不能单靠服务的多版本解决问题兼容性问题,更多的关注点应该放在服务本身的兼容性设计上。

下节继续学习….

读-李林峰-分布式服务框架和原理1-7

这哥们还写过一本netty的书,说实话这本书感觉不好,来过公司介绍过netty,讲的比较入门,因为当时在看netty源码,所以就不太感冒。后来学习公司服务框架的源码,想找本书系统了解下,又搜到这哥们,...

Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)

本文会从传统的BIO到NIO再到AIO自浅至深介绍,并附上完整的代码讲解。 1、BIO编程 1.1、传统的BIO编程 网络编程的基本模型是C/S模型,即两个进程间的通信。 服务...
  • anxpp
  • anxpp
  • 2016年05月29日 01:46
  • 80038

一篇文章,读懂Netty的高性能架构之道

Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用...

读-李林峰-分布式服务框架和原理14-17

流量控制通过合理设置流控配置,避免消费方的并发请求数超出服务提供方的承受能力,导致服务不可用。静态流控静态流控主要是针对客户端的并发请求进行控制,根据SLA的约定的QPS做全局流量控制。 传统静态流控...

分布式服务框架的服务调用

对于分布式服务框架服务调用的一些考虑~~~
  • njys1
  • njys1
  • 2017年03月31日 05:42
  • 393

分布式服务框架原理与实践

  • 2017年11月21日 13:45
  • 29.27MB
  • 下载

读分布式服务框架原理与实践读后感

从来没有写过一篇读后感,利用每天早上早到办公室的半个小时时间,零零散散的将《分布式服务框架--原理与实践》给读完了。也许是我自己的能力有限,源码部分没有怎么关注,但是里面的大概知识点,我结合公司现有的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:读-李林峰-分布式服务框架和原理8-13
举报原因:
原因补充:

(最多只允许输入30个字)