01. 微服务架构
1 微服务架构
1.1 传统单体应用架构问题
传统单体应用架构都是模块化的设计逻辑,程序在编写完成后会被打包并部署为一个具体的应用,而应用的格式则依赖于相应的应用语言和框架。
但随着用户人数的增加,一台机器已经满足不了系统的负载,此时我们就会考虑系统的水平扩展。通常情况下,我们只需要增加服务器的数量,并将打包好的应用拷贝到不同服务器(如Tomcat),然后通过负载均衡器(如Apache、Nginx)就可以轻松实现应用的水平扩展
存在的问题
- 应用复杂度增加,更新、维护困难
- 易造成系统资源浪费
- 影响开发效率
- 应用可靠性低
- 不利于技术的更新
1.2 解决问题
针对传统单体架构的问题,大部分企业通过SOA(Service-Oriented Architecture,面向服务的架构)来解决上述问题。SOA 的思路是把应用中相近的功能聚合到一起,以服务的形式提供出去,因此基于SOA架构的应用可以理解为一批服务的组合。
SOA将原来的单体架构按照功能细分为不同的子系统,然后再由各个子系统依赖服务中间件(这里指企业服务总线EnterpriseService Bus,简称ESB)来调用所需服务。
使用SOA可以将系统切分成多个组件服务,这种通过多个组件服务来完成请求的方式有很多好处
- 把项目拆分成若干个子项目,不同的团队可以负责不同的子项目,从而提高开发效率。
- 把模块拆分,使用接口通信,降低了模块之间的耦合度。
- 为企业的现有资源带来了更好的重用性。·能够在最新的和现有的应用之上创建应用。
- 能够使客户或服务消费者免予服务实现的改变所带来的影响。
- 能够升级单个服务或服务消费者而无需重写整个应用,也无需保留已经不再适用于新需求的现有系统。
虽然使用SOA解决了单体架构中的问题,但多数情况下,SOA中相互独立的服务仍然会部署在同一个运行环境中(类似于一个Tomcat实例下,运行了很多web应用)。和单体架构类似,随着业务功能的增多,SOA 的服务会变得越来越复杂。本质上看,单体架构的问题并没有因为使用SOA而变得更好。
针对单体架构和SOA的问题,许多公司(如Amazon、eBay和NetFlix)通过采用微处理结构模式解决了系统架构中的问题。其思路不是开发一个巨大的单体式的应用,而是将应用分解为小的、互相连接的微服务。随着微服务的使用,微服务架构的思想也随之产生。
1.3 微服务架构的概念
微服务架构是一种架构风格和架构思想,它倡导我们在传统软件应用架构的基础上,将系统业务按照功能拆分为更加细粒度的服务,所拆分的每一个服务都是一个独立的应用,这些应用对外提供公共的API,可以独立承担对外服务的职责,通过此种思想方式所开发的软件服务实体就是“微服务”,而围绕着微服务思想构建的一系列体系结构(包括开发、测试、部署等),我们可以将它称之为“微服务架构”
微服务和微服务架构是两个不同的概念。微服务强调的是服务的大小,它关注的是某一个点,而微服务架构是一种架构思想,需要从整体上对软件系统进行全面的考虑
微服务架构优点:
- 复杂度可控
- 可独立部署
- 技术选型灵活
- 易于容错
- 易于扩展
- 功能特定
存在的不足:
-
开发人员必须处理创建分布式系统的复杂性
- 开发工具(或IDE)是面向构建传统的单体应用程序的,不为开发分布式应用程序提供全面功能上的支持。
- 测试更加困难。在微服务架构中,服务数量众多,每个服务都是独立的业务单元,服务主要通过接口进行交互,如何保证依赖的正常,是测试面临的主要挑战。
- 开发人员必须实现服务间的通信机制。
- 实现用例跨多个服务时,需要面对使用分布式事务管理的困难。
- 实现跨多个服务的用例,需要团队之间进行仔细的协调。
-
部署的复杂性
-
增加内存消耗
微服务架构与SOA的区别
1.4 微服务架构的常见组件
- 服务注册中心:注册系统中所有服务的地方。
- 服务注册:服务提供方将自己调用地址注册到服务注册中心,让服务调用方能够方便地找到自己。
- 服务发现:服务调用方从服务注册中心找到自己需要调用服务的地址。
- 负载均衡:服务提供方一般以多实例的形式提供服务,使用负载均衡能够让服务调用方连接到合适的服务节点。
- 服务容错:通过断路器(也称熔断器)等一系列的服务保护机制,保证服务调用者在调用异常服务时快速地返回结果,避免大量的同步等待。
- 服务网关:也称为API网关,是服务调用的唯一入口,可以在这个组件中实现用户鉴权、动态路由、灰度发布、负载限流等功能。
- 分布式配置中心:将本地化的配置信息(properties、yml、yaml 等)注册到配置中心,实现程序包在开发、测试、生产环境的无差别性,方便程序包的迁移。
部署了一系列的微服务,每个微服务都会访问自己的数据库(Database)。当这些微服务启动时,会将其信息注册到服务注册中心(Service Registry),在客户端发送请求时,请求首先会被API网关(APIGateWay)拦截,API网关会读取请求数据,并从注册中心获取对应的服务信息,然后API网关会根据服务信息调用所需的微服务。