Spring Cloud

前言

单体应用架构

基于SpringBoot框架,我们可以轻松的完成一个单体应用的搭建,单体应用是一个归档包包含整个系统所有功能的应用程序,它将系统的各项功能融于一体。

image-20220525104057057

单体应用容易搭建、部署和测试等,然而随着需求、功能和用户的不断增加,单体应用出现了复杂性高、技术债务、部署频率低、可靠性差、扩展能力受限、阻碍技术创新等问题,因此如今单体应用很难满足互联网时代业务快速变化的需要。

微服务

如何解决单体应用架构存在的问题,微服务是一种全新架构模式,它有助于解决这些问题。Martin Fowler在2014年提出了“微服务”架构,他对于“微服务”的描述如下:

In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.

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

因此微服务架构具备以下特点:

  • 微服务将单体应用拆分为一个个微服务,每个微服务为独立的业务开发,一个微服务只关注某个特定功能
  • 每个微服务可以在自己的进程中独立运行,一系列独立运行的微服务共同构建整个系统
  • 微服务之间通过一些轻量级的通信机制进行通信和数据交互,可以实现不同的微服务使用不同的语言和数据存储技术
  • 支持全自动的部署机制,一个微服务可以部署在多个服务器,保证微服务的高可用。

image-20220525110414340

整个应用被分解为多个微服务,各个微服务独立运行在自己的进程中,并分别有自己的数据库、微服务之间使用REST或者其他通信协议。

微服务架构的优点

相比于单体应用架构,微服务架构具有如下优点:

  • 业务模块划分清晰、易于开发和维护
  • 局部修改,易于部署
  • 技术栈不受限
  • 伸缩性强,高可用

微服务架构面临的挑战

  • 通信接口调整和运维成本提高
  • 系统复杂性提高,分布式系统需要考虑系统管理和监控、容错、网络延迟、分布式事务等问题

微服务设计原则

单一职责原则

单一职责原则是指一个单元(类、方法或服务等)只应关注整个系统功能中单独、有界限的一部分。这一原则可以帮助我们更加优雅地开发、更便捷地交付。

服务自治原则

服务自治是指每个微服务应具备独立的业务能力、依赖与运行环境。在微服务架构中,服务是独立的业务单元,与其他服务高度解耦。每个微服务从 构建、开发、测试、部署都可以独立运行,不依赖于其他服务。

轻量级通信机制

微服务之间应该通过轻量级的通信机制进行交互。轻量级的通信机制应具备体量小、跨语言跨平台的特点。常用的协议有REST、AMQP、STOMP、MQTT等。

微服务粒度

在微服务的设计阶段,使用合适的粒度划分微服务,确定其边界,保证微服务之间相对独立并保持松耦合。

领域驱动设计(Domain Driven Design)中的“界限上下文”可作为划分微服务边界、确定微服务粒度的重要依据。

总结

微服务架构的演进是一个循序渐进的过程,系统会根据需求业务的变化,对微服务进行重构,甚至重新划分,让架构更加合理,最终实现微服务的开发、部署、测试以及运维效率高的目的。

微服务架构的实现

微服务应用的实现相较于单体架构,需要开发框架的支持、一些自动化部署的工具、以及Iaas、PaaS或CaaS等的支持。

开发框架选择:Spring Cloud

Spring Cloud基于Spring框架一套分布式解决方案,具备开箱即用的生产特性,提升开发效率。

运行平台

微服务可以部署在PC Server、阿里云、AWS等云计算平台。处于轻量、灵活、应用支撑等方面考虑,本文将微服务署在Docker上。

架构图及常用组件

image-20220526215843868

image-20220527234509921

微服务常用技术栈

image-20220528041614896

SpringCloud简介

Spring Cloud的介绍

Spring Cloud是Spring提供的一套分布式解决方案,用于快速构建分布式系统的通用模式的工具集 。目的是协调任何服务简化分布式系统开发

Spring Cloud对常见的分布式系统模式提供了简单易用的编程模型,帮助开发者构建弹性、可靠、协调的应用程序。

Spring Cloud提供快速构建分布式协调架构组件,例如服务发现、配置管理、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁定、领导选举、分布式会话、集群状态等。

来自Spring官网

Spring Cloud的特点

  • 基于Spring框架,具备约定优于配置、开箱即用和快速启动等特性
  • 适用于各种环境。开发和部署在PC Server或各种云环境等
  • 隐藏组件的复杂性、提供声明式、无xml的配置方式
  • 组件丰富、功能齐全且轻量级,选型中立,灵活,各个组件解耦。

Spring Cloud组件概述

Spring Cloud Eureka

服务治理组件,包括服务端的服务注册中心和客户端的服务发现机制。

Spring Cloud Ribbon

负载均衡的服务调用组件,具有多种负载均衡调用策略。

Spring Cloud Hystrix

服务容错组件,实现了断路器模式,为依赖服务的出错和延迟提供了容错能力。

Spring Cloud Feign

基于Ribbon和Hystrix的声明式服务调用组件。

Spring Cloud Zuul

API网关组件,对请求提供路由过滤功能。

Spring Cloud Bus

用于传播集群状态变化消息总线,使用轻量级消息代理链接分布式系统中的节点,可以用来动态刷新集群中的服务配置

Spring Cloud config

集中配置管理工具,分布式系统中统一的外部配置管理,默认使用Git存储配置,支持客户端配置的刷新及加密、解密操作。

Spring Cloud Consul

基于Hashicorp Consul的服务治理组件。

Spring Cloud Security

安全工具包,对Zuul代理中的负载均衡OAuth2客户端登录认证进行支持。

Spring Cloud Bus

使用轻量级的消息代理来连接微服务架构中的各个服务,主要用于广播状态更改或其他管理指令。

Spring Cloud Sleuth

Spring Cloud应用程序的分布式请求链路跟踪,支持使用Zipkin、HTrace和基于日志(例如ELK)的跟踪。

Spring Cloud Stream

轻量级事件驱动微服务框架,可以使用简单的声明式模型发送及接收消息,主要实现为Apache Kafka及RabbitMQ。

Spring Cloud Task

用于快速构建短暂有限数据处理任务的微服务框架,用于向应用中添加功能性和非功能性的特征。

Spring Cloud Zookeeper

基于Apache Zookeeper的服务治理组件。

Spring Cloud Gateway

API网关组件对请求提供路由及过滤功能。

Spring Cloud OpenFegin

基于Ribbon和Hystrix的声明式服务调用组件,可以动态创建基于Spring MVC注解的接口实现,用于服务调用,在Spring Cloud2.0中已经取代Feign。