# 什么是微服务架构

"微服务"以此源于Martin Fowler的名为Microservice的博文,可以在他的官方博客 上找到: http://martinfowler.com/articles/microservices.html (opens new window)

The term "Microservice Architecture" has sprung up over the last few years to describe a particular way of designing software applications as suites of independently deployable services. While there is no precise definition of this architectural style, there are certain common characteristics around organization around business capability, automated deployment, intelligence in the endpoints, and decentralized control of languages and data.

简单的说,微服务是系统架构上的一种设计风格,它的主旨是将一个原本独立的系统拆分成多个小型服务, 这些小型服务都在各自独立的进程中运行,服务之间通过基于HTTP的RESTful API 进行通信协作. 被拆分成的每一个小型服务都围绕着系统中的某一项或一些耦合度较高的业务进行构建, 并且每个服务都维护者自身的数据存储,业务开发,自动化测试案例以及独立部署机制. 由于有了轻量级的通信协作基础,所以这些微服务可以使用不同的语言来编写.

# 与单体系统的区别

在以往传统的企业系统架构中,我们针对一个复杂的业务需求通常使用对象或业务类型来构建一个单体项目.

在项目中我们通常将需求分为三个主要部分:数据库,服务端处理,前端展现.

在业务发展初期,由于所有的业务逻辑在一个应用中,开发,测试,部署都还比较容易且方便. 但是,随着企业的发展,系统为了应对不同的业务需求会不断为该单体项目增加不同的业务模块; 同时随着移动端设备的进步,前端展现模块已经不仅仅局限了Web的形式,这对于系统后端向前端的支持需要更多的接口模块. 单体用于由于面对的业务需求更为宽泛,不断扩大的需求会使得单体因公变得越来越臃肿.

单体应用的问题就逐渐凸显出来,由于单体系统部署在一个进程内,往往我们修改了一个很小的功能,为了部署上线会影响其他功能的运行. 并且,单体应用中的这些功能模块的使用场景,并发量,消耗的资源类型都各有不同,对于资源的利用又互相影响,这样使得我们对各个业务模块的系统容量很难给出较为 准确的评估.

所以,单体系统在初期虽然可以非常方便的进行开发和使用,但是随着系统的发展,维护成本会变得便来越大,并且难以控制

为了解决单体系统变得庞大臃肿之后产生的难以维护的问题,微服务架构诞生了并被大家所关注.

我们将系统中的不同功能模块拆分成多个不同的服务,这些服务都能够独立部署和扩展.

由于每个服务都运行在自己的进程内,在部署上有稳固的边界,这样每个服务的更新都不会影响其他服务的运行. 同时,由于是独立部署的,我们可以更准确地为每个服务评估性能容量, 通过配合服务间的协作流程也可以更容易的发现系统的瓶颈位置,以及给出较为准确的系统级性能容量评估.

# Spring Cloud 简介

Spring Cloud 是一个基于Spring Boot实现的微服务架构开发工具.它为微服务架构中设计的配置管理,服务治理,断路器,智能路由,微代理,控制总线,全局锁, 决策竞选,分布式会话和集群状态管理等操作提供了一种简单的开发方式.

Spring Cloud 包含多个子项目(针对分布式系统中涉及的多个不同的开源产品),如下:

  • Spring Cloud Config: 配置管理工具,支持使用Git存储配置内容,可以使用它实现应用配置的外部化存储,并支持客户端信息刷新,加密/解密配置内容等.
  • Spring Cloud Netflix: 核心组件,对多个Netflix OSS开源套件进行整合
    • Eureka: 服务治理组件,包含服务注册中心,服务注册与发现机制的实现.
    • Hystrix: 容错管理组件,实现断路器模式,帮助服务依赖中出现的延迟和为故障提供强大的容错能力
    • Ribbon: 客户端负载均衡的服务调用组件
    • Feign: 基于Ribbon和Hystrix的声明式服务调用组件.
    • Zuul: 网关组件,提供智能路由,访问过滤等功能.
    • Archaius: 外部化配置组件
  • Spring Cloud Bus: 时间,消息总线.用于传播集群中的状态变化或事件,以触发后续的处理,比如用来动态刷新配置等.
  • Spring Cloud Cluster: 针对Zookeeper,Redis,Hazelcast,Consul的选举算法和通用状态模式的实现
  • Spring Cloud Consul: 服务发现与配置管理工具
  • Spring Cloud Stream: 通过Redis,Rabbit或者Kafka实现的消费微服务,可以通过简单的声明式模型来发送和结构消息.
  • Spring Cloud AWS: 用于简化整合Amazon Web Service的组件
  • Spring Cloud Security: 安全工具包,提供在Zuul代理中对OAuth2客户端请求中的中继器
  • Spring Cloud Sleuth: Spring Cloud 应用的分布式追踪实现,可以完全整合Zipkin
  • Spring Cloud Zookeeper: 基于Zookeeper的服务发现与配置管理组件
  • Spring Cloud Starters: Spring Cloud 的基础组件,它是基于Spring Boot风格项目的基础依赖模块
  • Spring Cloud CLI: 用于在Groovy中快速创建Spring Cloud应用的Spring Boot CLI插件
  • ......