Spring-Cloud微服务实战学习(一):微服务的概念

微服务介绍

“微服务”一词源于Martin Fowler的名为Microservices的博文,具体可以在他的博客看到:https://www.martinfowler.com/articles/microservices.html
简而言之,微服务是一种设计风格,它的目标是将一个独立的系统拆解成多个小型的服务,这些小型服务都在各自独立的进程中运行。每个服务都有各自的数据存储、业务领域、测试案例、部署机制。各个服务之间使用轻量级通信协议进行通信。

与单体系统的区别

单体系统存在庞大臃肿的问题,存在各个功能间依赖过多,往往部署一个单体应用本身启动就会很久,而且单点故障导致整个系统不可用的可能性也会增多,多个团队协作开发也存在困难性。
而微服务每个服务都能独立部署和扩展,每个服务都运行在自己的进程内,有稳固的边界,每个服务的更新都不会影响别的服务的运行。由于是独立部署的,我们也可以精确的为每个服务评估性能容量。

微服务面临的问题

微服务进行拆分之后尽管有很多优点,但是也需要考虑一些问题:

  • 运维的挑战:运维维护的进程增加,运维过程需要更多的自动化,要求运维人员具备一定的编排能力管理各个微服务。
  • 接口的一致性:虽然拆分了微服务,但是业务逻辑上的依赖并没有消除,若某个依赖的接口变更了,相应的接口调用方也需要同步变更以保证接口的调用。
  • 分布式的复杂性:由于拆分后的微服务都是独立部署的,运行在各自的进程中,分布式环境的问题也是微服务架构设计需要考虑的。

微服务架构的特点

Martin Fowler在Microservices一文中提出了微服务架构的九大特性:

  • 服务组件化:微服务作为一个组件可以独立开发、部署。
  • 按业务组织团队:传统的技术团队分为各个技术路线:开发团队、DBA团队、运维团队、设计师团队, 而在微服务的架构设计中,这种组织架构已经不适用了,需要按照业务线划分技术团队。
  • 做产品的态度:技术团队需要对微服务的整个开发周期负责,包括开发、测试、运维。
  • 通信的选择:由于各个组件间通信改为了RPC的调用,这必然会影响通信的效率,需要在设计时避免繁琐的调用,也需要选择合适的通信协议。
  • 去中心化治理:集中化的治理方案往往会限制过多,我们希望的治理方案是尽可能轻量级的通信接口,这样各个组件就能有更大的自由度。
  • 去中心化管理数据:实施微服务脚骨时,希望每一个服务都管理各自的数据库。
  • 基础设施自动化:我们需要自动化测试、自动化部署的持续交付平台,要不然运维成本会无限增大。
  • 容错设计:单体应用中,往往不存在单个组件故障而其他部件正常运转的情况,而在微服务架构中,则存在这种情况,并且有相应的故障检测机制和自动恢复机制。
  • 演进式设计:实施一个微服务架构,需要考虑的设计和成本不小,所以一般情况下都会以演进的形式。初期单体架构,然后逐步将一部分经常变动或有一定时效的内容进行微服务处理,而稳定不太变动的模块就作为核心微服务存在。

微服务架构的选择:Spring Cloud

微服务架构中诞生了很多优秀的解决方案和开源框架:

  • 服务治理:阿里的Dubbo、当当网在其扩展的DubboX、Netflix的Eureka、Apache的Consul等。
  • 分布式配置管理:百度的Diconf、Netflix的Archaius、SpringCloud的Config、淘宝的Diamond等。
  • 批量任务:当当网的Elastic-Job、LinkedIn的Azkaban、SpringCloud 的Task等。
  • 服务追踪:京东的Hydra、SpringCloud的Sleuth、Twitter的Zipkin等。
    这些方案可以说都是微服务实践过程中遇到的各种各样问题的优秀的解决方案。我坚持认为实践了才知道好与坏,对于刚接触微服务的情况,推荐使用Spring Cloud架构。可以这样说,Spring Cloud已经为我们考虑到了微服务架构的各自问题,也有相应的完善的解决方案。无论是Spring的背景,还是其社区的活跃度,选择从Spring Cloud入门都是不错的选择。

Spring Cloud介绍

Spring Cloud 是一个基于Spring Boot实现的微服务架构开发工具套件。它为微服务架构中设计的配置管理、服务治理、断路器、智能路由、微代理、控制总线、全局锁、分布式会话和集群状态管理都提供了相应的工具和套件:

  • Spring Cloud Config:配置管理
  • Spring Cloud NetFlix:对多个Netflix开源套件整合
    • Eureka:服务治理
    • Hystrix:容错管理
    • Ribbon:客户端负载均衡套件
    • Feign:基于Ribbon和Hystrix的声明式服务调用组件
    • Zuul:网关组件
    • Archaius:外部化配置组件
  • Spring Cloud Bus:事件、消息总线
  • Spring Cloud Consul: 服务发现和配置管理工具
  • Spring CLoud Stream:声明式模型发送和接收消息
  • Spring Cloud Security:安全工具包
  • Spring Cloud Sleuth:分布式跟踪实现
  • Spring Cloud CLI:Spring Boot 的命令行插件

可以看到,Spring Cloud 确实功能丰富。