zoukankan      html  css  js  c++  java
  • 微服务起源及实践——”微服务哪些事“摘录

    早上看到这篇文章讲的很不错,将里面的一些观点摘绿整理一下:http://www.oschina.net/news/70121/microservice

    一、微服务概念的提出:Martin,敏捷开发方法创始人之一,《重构》《企业应用架构模式》作者,ThoughtWorks公司的首席科学家

    微服务的流行,Martin功不可没,这老头也是个奇人,特别擅长抽象归纳和制造概念,我觉的这就是最牛逼的markting啊,感觉这也是目前国人欠缺的能力。

    Martin Fowler是国际著名的OO专家,敏捷开发方法的创始人之一,现为ThoughtWorks公司的首席科学家.福勒(Martin Fowler),在面向对象分析设计、UML、模式、软件开发方法学、XP、重构等方面,都是世界顶级的专家,现为Thought Works公司的首席科学家。Thought Works是一家从事企业应用开发和集成的公司。早在20世纪80年代,Fowler就是使用对象技术构建多层企业应用的倡导者,他著有几本经典书籍: 《企业应用架构模式》、《UML精粹》和《重构》等。—— 百度百科

    二、微服务的目的:微服务的目的是有效的拆分应用,实现敏捷开发和部署 。

    传统的web开发方式所有的功能打包在一个 WAR包里,基本没有外部依赖(除了容器),部署在一个JEE容器(Tomcat,JBoss,WebLogic)里,包含了 DO/DAO,Service,UI等所有逻辑。
    screenshot

    优点是:

    • 开发简单直接,集中式管理
    • 基本不会重复开发
    • 功能都在本地,没有分布式的管理开销和调用开销

    它的缺点也非常明显,特别对于互联网公司来说(不一一列举了):

    • 开发效率低:所有的开发在一个项目改代码,递交代码相互等待,代码冲突不断
    • 代码维护难:代码功能耦合在一起,新人不知道何从下手
    • 部署不灵活:构建时间长,任何小修改必须重新构建整个项目,这个过程往往很长
    • 稳定性不高:一个微不足道的小问题,可以导致整个应用挂掉
    • 扩展性不够:无法满足高并发情况下的业务需求

    所以,现在主流的设计一般会采用Microservice Architecture,就是基于微服务的架构。 
    screenshot

    三、一些定义标准:系统拆分成进程独立服务、分布式管理、自动化运维、容错、快速演化

    1. 一些列的独立的服务共同组成系统

    2. 单独部署,跑在自己的进程里
    3. 每个服务为独立的业务开发
    4. 分布式的管理

    • 分布式服务组成的系统
    • 按照业务而不是技术来划分组织
    • 做有生命的产品而不是项目
    • Smart endpoints and dumb pipes(我的理解是强服务个体和弱通信)
    • 自动化运维(DevOps)
    • 容错
    • 快速演化

    四、实践方法:服务管理、访问、通信、容错

    客户端如何访问这些服务?

    原来的Monolithic方式开发,所有的服务都是本地的,UI可以直接调用,现在按功能拆分成独立的服务,跑在独立的一般都在独立的虚拟机上的 Java进程了。客户端UI如何访问他的?后台有N个服务,前台就需要记住管理N个服务,一个服务下线/更新/升级,前台就要重新部署,这明显不服务我们 拆分的理念,特别当前台是移动应用的时候,通常业务变化的节奏更快。另外,N个小服务的调用也是一个不小的网络开销。还有一般微服务在系统内部,通常是无 状态的,用户登录信息和权限管理最好有一个统一的地方维护管理(OAuth)。

    所以,一般在后台N个服务和UI之间一般会一个代理或者叫API Gateway,他的作用包括

    • 提供统一服务入口,让微服务对前台透明
    • 聚合后台的服务,节省流量,提升性能
    • 提供安全,过滤,流控等API管理功能

    我的理解其实这个API Gateway可以有很多广义的实现办法,可以是一个软硬一体的盒子,也可以是一个简单的MVC框架,甚至是一个Node.js的服务端。他们最重要的作 用是为前台(通常是移动应用)提供后台服务的聚合,提供一个统一的服务出口,解除他们之间的耦合,不过API Gateway也有可能成为单点故障点或者性能的瓶颈。

    一般用过Taobao Open Platform的就能很容易的体会,TAO就是这个API Gateway。
    screenshot

    服务之间如何通信?

    因为所有的微服务都是独立的Java进程跑在独立的虚拟机上,所以服务间的通行就是IPC(inter process communication),已经有很多成熟的方案。现在基本最通用的有两种方式。这几种方式,展开来讲都可以写本书,而且大家一般都比较熟悉细节了, 就不展开讲了。

    • 同步调用
      • REST(JAX-RS,Spring Boot)
      • RPC(Thrift, Dubbo)
    • 异步消息调用(Kafka, Notify, MetaQ)

    screenshot

    一般同步调用比较简单,一致性强,但是容易出调用问题,性能体验上也会差些,特别是调用层次多的时候。RESTful和RPC的比较也是一个很有意 思的话题。一般REST基于HTTP,更容易实现,更容易被接受,服务端实现技术也更灵活些,各个语言都能支持,同时能跨客户端,对客户端没有特殊的要 求,只要封装了HTTP的SDK就能调用,所以相对使用的广一些。RPC也有自己的优点,传输协议更高效,安全更可控,特别在一个公司内部,如果有统一个 的开发规范和统一的服务框架时,他的开发效率优势更明显些。就看各自的技术积累实际条件,自己的选择了。

    而异步消息的方式在分布式系统中有特别广泛的应用,他既能减低调用服务之间的耦合,又能成为调用之间的缓冲,确保消息积压不会冲垮被调用方,同时能 保证调用方的服务体验,继续干自己该干的活,不至于被后台性能拖慢。不过需要付出的代价是一致性的减弱,需要接受数据最终一致性;还有就是后台服务一般要 实现幂等性,因为消息发送出于性能的考虑一般会有重复(保证消息的被收到且仅收到一次对性能是很大的考验);最后就是必须引入一个独立的broker,如 果公司内部没有技术积累,对broker分布式管理也是一个很大的挑战。

    这么多服务,怎么找?

    在微服务架构中,一般每一个服务都是有多个拷贝,来做负载均衡。一个服务随时可能下线,也可能应对临时访问压力增加新的服务节点。服务之间如何相互 感知?服务如何管理?这就是服务发现的问题了。一般有两类做法,也各有优缺点。基本都是通过zookeeper等类似技术做服务注册信息的分布式管理。当 服务上线时,服务提供者将自己的服务信息注册到ZK(或类似框架),并通过心跳维持长链接,实时更新链接信息。服务调用者通过ZK寻址,根据可定制算法, 找到一个服务,还可以将服务信息缓存在本地以提高性能。当服务下线时,ZK会发通知给服务客户端。

    • 客户端做:优点是架构简单,扩展灵活,只对服务注册器依赖。缺点是客户端要维护所有调用服务的地址,有技术难度,一般大公司都有成熟的内部框架支持,比如Dubbo。
    • 服务端做:优点是简单,所有服务对于前台调用方透明,一般在小公司在云服务上部署的应用采用的比较多。

    screenshot

    这么多服务,服务挂了怎么办?

    前面提到,Monolithic方式开发一个很大的风险是,把所有鸡蛋放在一个篮子里,一荣俱荣,一损俱损。而分布式最大的特性就是网络是不可靠 的。通过微服务拆分能降低这个风险,不过如果没有特别的保障,结局肯定是噩梦。我们刚遇到一个线上故障就是一个很不起眼的SQL计数功能,在访问量上升 时,导致数据库load彪高,影响了所在应用的性能,从而影响所有调用这个应用服务的前台应用。所以当我们的系统是由一系列的服务调用链组成的时候,我们 必须确保任一环节出问题都不至于影响整体链路。相应的手段有很多:

    • 重试机制
    • 限流
    • 熔断机制
    • 负载均衡
    • 降级(本地缓存)

    这些方法基本上都很明确通用,就不详细说明了。比如Netflix的Hystrix:https://github.com/Netflix/Hystrix
    screenshot

    WHY – 微服务的应用

    这里有一个图非常好的总结微服务架构需要考虑的问题,包括

    • API Gateway
    • 服务间调用
    • 服务发现
    • 服务容错
    • 服务部署
    • 数据调用

    screenshot

    对已微服务架构, 技术上不是问题,意识比工具重要。

    • 按照业务 或者客户需求组织资源(这是最难的)

    • 做有生命的产品,而不是项目

    • 头狼战队,全栈化

    • 后台服务贯彻Single Responsibility Principle

    • VM->Docker (to PE)

    • DevOps (to PE)

    微服务的优点和缺点(或者说挑战)一样明显。

      • 优点
        • 开发简单
        • 技术栈灵活
        • 服务独立无依赖
        • 独立按需扩展
        • 可用性高
      • 缺点(挑战)
        • 多服务运维难度
        • 系统部署依赖
        • 服务间通信成本
        • 数据一致性
        • 系统集成测试
        • 重复工作
        • 性能监控
  • 相关阅读:
    Python 模块 itertools
    Python 字符串的encode与decode
    python 模块 hashlib(提供多个不同的加密算法)
    暴力尝试安卓gesture.key
    hdu 1300 Pearls(DP)
    hdu 1232 畅通工程(并查集)
    hdu 1856 More is better(并查集)
    hdu 1198 Farm Irrigation(并查集)
    hdu 3635 Dragon Balls(并查集)
    hdu 3038 How Many Answers Are Wrong(并查集)
  • 原文地址:https://www.cnblogs.com/doit8791/p/5975302.html
Copyright © 2011-2022 走看看