微服务小白入门概述

松花皮蛋me 2019-03-07 00:32
文章首发于公众号 松花皮蛋的黑板报松花皮蛋的黑板报,作者就职于京东,在稳定性保障、敏捷开发、高级JAVA、微服务架构有深入的理解

一、单体应用架构转向微服务的必然性

  1. 1、部署效率低下:依赖包下载/构建/启动慢
  2. 2、团队协作开发成本高
  3. 3、系统可用性差:模块隔离性差

二、微服务的特点

:单体应用中已经经过足够时间业务上的检验,将其中模式比较稳定,整体高内聚的业务进行抽离

微服务的特点:服务细拆分/独立部署/独立维护/服务治理能力要求高

三、服务的发布和引用

常见的方式

XML配置/RESTful API/IDL文件

服务发布

服务引用

实现

基于Javassit的静态代理拦截:在目标类的基础上增加切面逻辑,生成增强的目标类

四、注册和发现服务

以ZooKeeper为例,目前JSF使用的是DB

  1. 1、服务存储
    一般采用层次化的目录结构,接口+方法名+分组+协议
  2. 2、健康状态检测
    基于客户端和服务端的长连接和会话超时控制机制(存活/重连的/连上但是心跳连续异常)
  3. 3、服务状态变更通知
    服务消费者在调用 ZooKeeper 的 getData 方法订阅服务时,通过监听器Watcher的process方法获取服务的变动

    推拉结合

    服务节点缓会存在客户端

当然要考虑网络抖动的情况,比如注册中心不能摘取超时20%的节点

五、RPC远程调用

  1. 1、网络连接:TCP/HTTP/SOCKET,目前JSF采用的是基于Netty4实例的TCP长连接
  2. 2、服务端处理请求:同步阻塞、同步非阻塞、异步非阻塞、回调
  3. 3、服务端生成一个CallBack代理类,和消息队列绑定
  4. 4、数据传输协议
  5. 5、序列和反序列:解码/映射
    {“class”:”com.jd.testjsf.ExampleObj”,”field1″:”xxx”,”field2″:”yyy” }

六、LBS负载均衡实现

  1. 1、FULLNAT
    修改请求报文(源/目的)地址、(源/目的)端口,返回时经过VIP
  2. 2、DLVS
    修改目的MAC(DR模式),返回时不经过VIP
  3. 3、NGINX
    反向代理,返回时不经过VIP

七、负载均衡调度

流量调度

  1. 1、随机算法
  2. 2、轮询算法
  3. 3、加权轮询算法:生成节点序列,如a/b/c权重分别为3/2/1,序列为{a,a,a,b,b,c},依次请求
  4. 4、最少活跃连接算法
  5. 5、一致性hash算法/粘性算法: 同一来源的请求都映射到同一节点

节点上下线调度

将节点切换为下线后,标记为软下线,不再处理新请求,当旧请求全部处理完后标记为真下线

服务路由

  1. 1、分组调用,同机房调用优先
  2. 2、灰度发布
  3. 3、流量切换
  4. 4、读写分离

条件路由

IP路由/参数路由/分组路由,实现A/B测试、熔断

八、服务跟踪

traceId:标识某一次具体的请求ID。spanId:标识一次RPC调用在分布式调用的位置


九、架构(以Dubbo为例)

  1. 1、服务发布与引用:
    Proxy 服务代理层,Proxy 根据客户端和服务端的接口描述,生成接口对应的客户端和服务端的 Stub,使得客户端调用服务端就像本地调用一样。
  2. 2、服务注册与发现:
    Registry 注册中心层,Registry 根据客户端和服务端的接口描述,解析成服务的 URL 格式,然后调用注册中心的 API。
  3. 3、服务调用:Protocol 远程调用层
    Protocol 把客户端的本地请求转换成 RPC 请求。通过Transporter 层实现通信,Codec 层实现协议封装,Serialization 层来实现数据序列化和反序列化。
  4. 4、服务监控:Filter 调用链层
  5. 5、服务治理:Cluster 层;节点管理、负载均衡、服务路由以及服务容错

十、微服务的原则

服务拆分不是银弹,需要围绕服务治理进行平台建议,重点是持续交付中的版本管理、部署、配置管理、自动化测试、四个黄金指标监控、日记监控等等,但是整体都离不开以下几个原则:

  1. 1、围绕业务的限界上下文定义接口
    不仅能形成更稳定的接口,还能确保我们能够更好的反映业务流程的变化
  2. 2、接受自动化文化
    比如使用环境定义来明确差异,保持使用统一的部署方式,考虑创建自定义镜像加快部署,并且创建全自动不可变容器,方便定位系统问题
  3. 3、隐藏内部实现细节
    一个服务独立于另外一个服务,独立演化。要明确哪些可以共享哪些需要隔离。
  4. 4、让一切都去中心化
  5. 5、可独立部署
  6. 6、隔离失败
    当使用网络调用时,不能像使用本地调用那样处理远程调用,需要正确设置超时和使用断路器
  7. 7、高度可观察