认识微服务

概述

这篇文章介绍了微服务的概念、微服务的优缺点以及 java 中常见的微服务架构。

什么是微服务

微服务(Microservice)是将一个大而全的服务按照一定的规则拆分成多个小的服务,每个小的服务可以独立运行并负责一部分职责,这些独立的小的服务即为微服务。每个微服务可以独立开发、部署,可以使用不同的技术、编程语言实现,提高了开发的灵活性。

微服务的起因

随着互联网技术的发展,传统的单体应用架构已经无法满足生产需求了,微服务随之产生。微服务在传统软件应用架构基础上,将系统业务按功能拆分成更加细粒度的服务,每个服务都是一个独立的应用,它们对外提供公共的 API,独立承担对外服务的职责。

微服务与传统服务

在传统单体应用架构中,通常使用模块化设计,程序编码完成后将会被打包部署为一个具体的应用。单体应用易于开发、调试和部署,非常适合一些小规模的应用。传统单体应用也存在一些问题,如:

  • 随着应用复杂度增加,更新、维护变得困难
  • 难以扩展,只能重复部署多个完整应用来扩展
  • 影响开发效率,一个大的应用启动时间会更长
  • 可靠性低,系统中某个模块出问题可能导致整个应用崩溃
  • 不利于技术更新,单体应用开发时只能选择统一的技术栈进行开发,更新时所有模块都需要同步更新

微服务的优势

微服务相对于传统单体服务,通过将整体服务划分为多个独立的小规模服务,具有如下优势:

  • 复杂度可控,划分出的微服务复杂度降低,开发和维护起来更加容易
  • 独立部署,微服务中的每一个服务都可以单独部署,当某个服务发生变化时只需要单独修改这一个服务,编译并部署它,而不需要修改整个应用
  • 技术选型更灵活,微服务架构中,每个服务可以根据需要选择合适的实现技术,更新升级时也更容易
  • 易于容错,传统单体服务中出现的故障可能会在进程内扩散,导致整个服务不可用。而微服务中的故障将会隔离在当前服务中,还能通过重试、平稳退化等机制增加容错能力
  • 易于扩展,微服务架构中可以根据业务需要对特定服务进行横向扩展
  • 功能特定,每个服务专注特定的功能,开发人员也可以完全专注于这一特定功能进行开发,对于大团队来说可以进一步提高开发效率

微服务的劣势

微服务架构也有一些问题,如:

  • 分布式系统的复杂性,微服务架构拆分系统后,开发人员需要处理分布式系统带来的复杂性,如分布式系统的测试、通信、事物、协调服务调用等
  • 部署与维护工作量,微服务应用对维护人员提出了更高的技术要求,维护多个服务也增加了维护工作量,尤其是使用不同技术栈开发的微服务

微服务架构

微服务架构适合未来有一定的扩展复杂度,且有很大用户增量预期的应用,在初期可以按需要的功能开发,后续根据需要扩展。也适合那些规模较大、业务复杂度较高,且需要长期跟进的项目。

微服务架构的组件

服务注册中心

系统中所有服务都需要在注册中心注册服务,服务提供方在注册时将自己的服务信息写入注册中心,服务调用方通过注册中心查找需要的服务信息。

常用的微服务注册中心有:Spring Cloud Eureka、Apache Zookeeper、Consul、Nacos 等

服务网关

服务网关又称 API 网关,是服务调用的唯一入口,可以在这里实现用户鉴权、动态路由、灰度发布、负载限流等功能。

常见技术:Spring Cloud Zuul、Spring Reactor 等

负载均衡

调用服务时,负载均衡负责将服务调用请求发送到合适的服务提供方。

常见技术:Spring Cloud Ribbon、Dubbo 等

配置中心

将本地化的配置信息注册到配置中心,实现程序包在开发、测试、生产环境的无差别行,方便程序迁移。

常见技术:Spring Cloud Config、Nacos

服务容错

通过断路器(或称为熔断器)等机制保证服务调用发生异常时能够快速返回结果,避免大量的同步等待。

常见技术:Hystrix

参考资料

  • 黑马程序员. 微服务架构基础

总结

我们必须认识到,微服务是互联网发展的必然产物,它的出现解决了传统单体应用的一些问题,但我们也正确的认识它,认识到微服务架构不一定适合所有场景,微服务架构适合的是复杂的大型的项目,更适合较大的开发团队。对于一些小型的项目,小型的团队,还是可以使用传统单体架构,既方便开发又方便部署,维护起来也更轻松。