微服务架构最佳设计

使用微服务架构有很多好处,但同时也有一些缺点

  • 微服务的粗细粒度不好把握
  • 分布式的微服务增加了服务之间相互调用及其通信的复杂性
  • 分散的数据管理难以保证数据的一致性
  • 由多个微服务组成的系统会增加集成测试的一致性
  • 单个服务的变更可能影响到多个服务
  • 部署的复杂性

合理划分微服务

一般来说有两种方法,水平划分法/垂直划分法

在水平方向上,按照业务功能不同来划分微服务,并且把这次划分所创建的微服务称为Rest API 服务,Rest Api微服务负责业务功能的行为设计,主要完成数据管理方面的工作,并且通过使用Rest协议对外提供接口服务

在垂直方向上,再以Rest Api微服务为基础为基础实现前后端分离设计,创建WEB UI 微服务,WEB UI不能直接访问数据,而是只专注人机交互界面的设计,它的数据存取将通过调用Rest Api微服务来完成

我们划分出来的Rest API和WEB UI两个微服务,再结合高性能和高并发的设计,并且通过负载均衡技术发布后,就可以构成一个能够适应任何规模访问的多维的网格结构,这个网格结构具备有伸缩性,和牢固性,我们可以根据业务的变更或者是业务规模的发展进行缩减服务或者是进行扩充服务,这样就可以非常容易地构建一个可持续扩展的系统平台

微服务的治理

在Spring Cloud中使用了基于Netflix OSS的一些基础组件来实现微服务的治理,这些组件包括了:

  • 注册管理服务组件Eureka,提供服务注册和发现功能
  • 负载均衡服务组件Ribbon,提供负载均衡调度管理的功能
  • 边缘代理服务组件Zuul,提供网管服务和动态路由的功能
  • 断路器组件Hystrix,提供容错机制,服务降级,故障转移等功能
  • 聚合服务事件流组件Turbine,可用来监控集群中服务的运行情况
  • 日志收集组件Sleuth,可以通过日志手机提供对服务之间调用进行跟踪管理的功能
  • 配置管理服务组件Config,提供统一的配置管理服务功能

微服务治理图

Rest Api服务设计

在之前的SpringBoot就经常采用RestAPI来进行前后端分离的接口开发,RestFul只是一种架构风格,在SpringCloud中,通过围绕业务功能使用水平划分方法划分出来的Rest Api微服务是一个独立的小应用,这种小应用具有独立的数据库,可以独立部署和独立运行,也就是说每个Rest Api微服务是完全独立自治的

在SpringCloud中 Rest API 的设计需要满足一下两方面的功能:

  • 对内能够实现数据管理的功能
  • 对外提供一些数据的API调用功能

有关数据管理,我们可以使用JPA,Mybatis,BeetlSQL等持久化框架来完成,为了规范代码并且满足代码的可读性,我们的接口应该满足RestFul规范

Rest Api微服务的实现所体验出来的设计容易,开发简单,访问高效的特点,非常适用敏捷开发的方法,可以根据业务需求进行快速迭代,在高效的同时保证质量

在整个微服务架构的设计中,Rest API微服务就相当于数据库调用的一个中间件,它的调用性能将对整个系统的性能起到决定性的作用,所以高性能的Rest API微服务设计,就是在整个微服务架构设计中的一个重中之重,那么保证Rest API服务的高性能可以在以下几个方面进行思虑:

  • 使用数据库集群,数据库的集群设计主要是通过主从同步的方式来扩展数据库的访问性能,通过建立多个只读的从机来缓解主机的读写压力,在这里可以理解成面向对象中父类和子类的关系,但是父类拥有写的权限,而子类只拥有读的权限
  • 读写分离设计,使用数据库集群就可以进行读写分离的设计,通过读写分离可以充分调用数据库集群和分组的资源,读写分离的设计将由数据库代理中间件来实现,数据库代理不但实现了读写分离的功能,也充当了集群分组负载均衡调度的角色,另外数据库代理也为应用访问集群数据库提供了一种完全透明的使用方法,可以这样来说,对于一个应用,他还是像以往使用单机数据库一样使用连接池,它并不清楚这种连接池里面还有一个巨大的集群体系
  • 使用缓存,这个在之前的Redis介绍和SpringBoot使用Redis已经介绍过,使用Redis实现缓存设计,Redis是一个特别高性能的NoSQL数据库,并且具有非常高效的IO性能,但需要值得注意的是:不要在缓存中存取大容量的数据,合理设置每一个缓存数据的有效期,不将缓存数据做持久化保存

WEB UI 微服务设计

WEB UI 顾名思义其实就是WEB展示端,也就是前端设计,他可以通过AngularJS,VueJS等前端设计框架来进行开发,同时在Spring中我们可以使用模版引擎来更高效的来进行定制开发,如Beetl,FreeMaker等

WEB UI 应该实现两方面的功能:

  • 一方面实现对Rest API微服务的调用,来获取数据,并且展示到前端
  • 一方面是用户界面的设计,WEB UI最终是面向用户的,所以应该能够适应规模化的访问,对用户友好

实现高并发的设计

使用FeignClient来实现负载均衡

针对Rest API微服务对外提供的RestFul的HTTP协议接口,我们可以使用Spring Cloud工具套件中的FeignClient来进行访问,这个工具比起Ajax等工具更高效,并且使用简单,通过声明式接口与就可以实现HTTP的调用,并且在调用过程中,都将自动使用Zuul的动态路由和Ribbon的负载均衡服务

合理使用Hystrix实现容错机制

断路器顾名思义,就是为了保护我们系统而设计一个工具,如生活中的漏电保护器一般,都是一个断路器的思想,在分布式环境中,当一个服务超载甚至是失效的时候,如果这个时候对其继续调用,就会进入不断的等待状态之中,这是一种连锁调用,严重的可能会引起系统的崩溃,所以这个时候我们应该合理的使用断路器,当服务不可用或者超载的时候,断路器开启,切换消费者连接这一服务,提供降级使用机制,当服务恢复正常之后,断路器关闭,让消费者正常连通服务

使用非阻塞异步编程技术实现高并发调用

Java8以后提供了CompletableFuture非阻塞的异步多线程回调,能够实现WEB UI微服务的高并发设计

使用分布式的文件系统

FastDFS由跟踪器(Tracker)和存储节点(Storage)两部分组成

跟踪器管理所有的存储节点并且对存储节点的访问起到负载均衡调度的作用,通过配置多个跟踪器,可以构建一个高可用的文件系统

为了支持大容量的文件存储,每个存储节点使用了分组的设计,每个分组可以存储在不同的服务器上面

FastDFS能够为我们提供一个高可用和高性能的海量文件系统

数据最终一致性的设计

集中式的数据管理可以在一个事务中进行完成,所以能够保证数据的高度一致性,对于微服务来说,数据都将由不同的微服务进行分散管理,所以如果要保存数据的一致性,就必须要有合理的设计

我们可以通过调用各个Rest API 来实现实时同步操作,一种就是使用消息通道以时间相应的方式进行异步处理


本作品采用知识共享署名 4.0 国际许可协议进行许可。

如果可以的话,请给我钱请给我点赞赏,小小心意即可!

Last modification:July 22, 2019
If you think my article is useful to you, please feel free to appreciate