聊聊微服务架构

2019/04/11

集群/分布式/微服务

集群的概念:

计算机集群简称集群是一种计算机系统,它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作。在某种意义上,他们可以被看作是一台计算机。集群系统中的单个计算机通常称为节点,通常通过局域网连接,但也有其它的可能连接方式。集群计算机通常用来改进单个计算机的计算速度和/或可靠性。一般情况下集群计算机比单个计算机,比如工作站或超级计算机性能价格比要高得多。

集群的作用及特点

集群主要解决的问题:单机瓶颈问题

  • 两大特性
    • 可扩展性
    • 高可用性
  • 两大能力
    • 负载均衡
    • 错误恢复
  • 两大技术
    • 集群地址
    • 内部通信

分布式系统的概念:

分布式系统是一组计算机,通过网络相互连接传递消息与通信后并协调它们的行为而形成的系统。组件之间彼此进行交互以实现一个共同的目标。

从分布式系统概念出发来看下面的两个系统架构哪个是属于分布式的?

  • 图一

  • 图二

当大家看见这两个架构图时我想大多数人都会认为图二才是分布式架构,图一是一个单机架构。

那我们就从分布式加架构的定义来分析一下图一。图一是由客户端、服务端以及数据库组成的,那么问题来了客户端算不算是一个计算机呢?服务端算不算一个计算机呢?数据库算不算一个计算机呢? 答案是肯定的,它们都可以看成是一个单独运行的计算机。将它们组合在一起也就构成了计算机组,这一组计算也是通过网络互连传递消息与通信后完成同一个目标的(为客户完成一个完整的响应)。这样分析是不是颠覆了很多人对分布式架构的认知。

横看成岭侧成峰,远近高低高低各不同。看待一个“分布式系统”的时候,内在胜于表象。只要涉及多个进程协作才能提供一个完整功能的系统,就是“分布式系统”

分布式系统的特点

  • 模块之间独立
  • 便于扩展
  • 复用性高
  • 高吞吐量

微服务的概念

微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。这些服务共用一个最小型的集中式的管理,服务可用不同的语言开发,使用不同的数据存储技术。

微服务的起源

微服务的概念源于2014年3月Martin Fowler(马丁.富勒)所写的一篇文章《Microservices》 文章地址:https://martinfowler.com/articles/microservices.html

传统架构发展史

单体架构:

单体架构在小微企业比较常见,典型代表就是一个应用、一个数据库、一个web容器就可以跑起来。 在两种情况下可能会选择单体架构:一是在企业发展的初期,为了保证快速上线,采用此种方案较为简单灵活;二是传统企业中垂直度较高,访问压力较小的业务。在这种模式下对技术要求较低,方便各层次开发人员接手,也能满足客户需求。

下面是单体架构的架构图:

在单体架构中,技术选型非常灵活,优先满足快速上线的要求,也便于快速跟进市场。

垂直架构:

在这一阶段往往会将系统分为不同的层级,每个层级有对应的职责,UI层负责和用户进行交互、业务逻辑层负责具体的业务功能、数据库层负责和上层进行数据交换和存储。

下面是垂直架构的架构图:

在这个阶段SSH(struts+spring+hibernate)是项目的关键技术,Struts负责web层逻辑控制、Spring负责业务层管理Bean、Hibernate负责数据库操作进行封装,持久化数据。

服务化架构:

面向服务的架构是将应用程序根据不同的职责划分为不同的模块,不同的模块直接通过特定的协议和接口进行交互。这样使整个系统切分成很多单个组件服务来完成请求,当流量过大时通过水平扩展相应的组件来支撑,所有的组件通过交互来满足整体的业务需求。

下面是服务化架构:

服务化架构是一套松耦合的架构,服务的拆分原则是服务内部高内聚,服务之间低耦合。

微服务的特征

  • 容易被替换和升级
  • 按功能单元组织服务
  • 架构由层次化转向扁平化
  • 微服务可以选择最适合自己的技术方案
  • 每个服务都部署在一个独立自给的环境中

微服务的核心思想

  • 服务化

集群/分布式/微服务之间的区别

  • 集群:多台服务器部署相同的应用构成一个集群。
  • 作用:通过负载均衡设备共同对外提供服务。

  • 分布式:不同模块部署在不同服务器上
  • 作用:分布式解决网站高并发带来的问题。

  • 微服务:架构设计概念,各服务间隔离、自治。
  • 作用:各服务可独立应用,组合服务也可系统应用。

分布式和微服务之间的本质区别:

  • 分布式:分散压力
  • 微服务:分散能力

为什么需要微服务架构

单体应用存在的问题

单体应用:将所有的功能模块都打包(jar、war)在一个Web容器(JBoss、Tomcat)中部署、运行。

  • 复杂度高
  • 技术债务
  • 部署频率低
  • 可靠性差
  • 扩展能力受限
  • 妨碍技术创新

微服务的特点及优势

特点:

  • 每个微服务可独立运行在自己的进程中。
  • 每个服务为独立开发,一个微服务只关注某一特定的功能。
  • 服务之间通过一些轻量的通信机制进行通信。
  • 可以使用不同的语言与数据存储技术
  • 全自动的部署机制

优势:

  • 易于开发和维护
  • 单个微服务启动较快
  • 局部修改容易部署
  • 技术栈不受限
  • 按需伸缩

微服务架构的弊端

微服务虽然有很多吸引人的地方,但它并不是免费的午餐,使用它是有代价的。

  • 运维要求较高
  • 分布式固有的复杂性
  • 接口调整成本高
  • 重复性劳动

微服务设计

设计原则

  • 单一指责原则:单一职责原则值得是一个单元(类、方法或者服务等)只应关注整个系统功能中单独、有界限的一部分。
  • 服务自治原则:服务自治是指每个服务应该具备独立的业务能力与其他服务高度解耦。
  • 轻量级通信机制:微服务之间应该通过轻量级且语言跨平台的通信机制进行交互。
  • 微服务粒度:使用合理的粒度划分微服务。

数据库设计所遵循的原则

数据库选择:一库多服还是一库一服?(大家可以带着问题去学习)

CAP理论:

  • C: 数据一致性(consistency)
  • A: 可用性(availability)
  • P: 分区容错性(partition-tolerance)

技术选型

运行平台:PC Server、阿里云、腾讯云、AWS等云计算平台。

开发框架:Spring Cloud、Dubbo、Dropwizard、Armada等。

微服务框架的基本功能:

  • 服务治理
  • 客户端负载均衡
  • 服务容错保护
  • 声明式服务调用
  • API网关服务
  • 分布式配置中心

服务治理组件

Eureka、Consul、Zookeeper

服务治理组件的作用:

服务发现

服务发现组件: 提供服务发现和注册

服务提供者: 将自身服务注册到服务发现组件中,从而使服务消费方可以找到

服务消费者: 从服务发现组件中获取注册列表,从而能够消费服务

服务发现组件应具备以下功能:

  • 服务注册与服务发现
  • 服务注册表
  • 服务检查

服务调用

声明式服务调用:Feign

Feign是什么? Feign是一个声明式Web Service客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

Feign能干什么? Feign旨在使编写Java Http客户端变得更容易。 

Feign调用过程:

客户端负载均衡

客户端负载均衡: Ribbon

Ribbon是什么? Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。 简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。

Ribbon能干什么? LB,即负载均衡(Load Balance),在微服务或分布式集群中经常用的一种应用。  负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA。

Ribbon工作流程:

服务容错保护

熔断器:Hystrix

在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应。服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者”的不可用,并将不可用逐渐放大的过程。

如下图的服务调用过程:

在这种情况下就需要整个服务机构具有故障隔离的功能,避免某一个服务挂掉影响全局。在Spring Cloud 中Hystrix组件就扮演这个角色。

Hystrix特性:

  • 断路器机制
  • Fallaback(服务降级)
  • 资源隔离

Hystrix隔离、熔断和降级的流程:


扫码加好友

(转载本站文章请注明作者和出处 major-http://www.major818.com

Show Disqus Comments

Post Directory