微服务架构设计模式

微服务入门篇 主流的互联网技术特点 分布式 、高并发、集群、负载均衡、高可用。 分布式:一件事情拆开来做。 集群:一件事情大家一起做。 负载均衡:将请求平均分

微服务入门篇

主流的互联网技术特点

分布式 、高并发、集群、负载均衡、高可用。

分布式:一件事情拆开来做。

集群:一件事情大家一起做。

负载均衡:将请求平均分配到不同的服务器中,达到均衡的目的。

高并发:同一时刻,处理同一件事情的处理能力(解决方案:分布式、集群、负载均衡)

高可用:系统都是可用的。

扩展立方体

架构演变的过程 

软件架构是什么

 计算机系统的软件架构是构建这个系统所需的一组结构,包括软件元素,它们之间的关系以及两者的属性。

    • 它促进了劳动和知识的分工。它使具有特定专业知识的人们(或多个团队)能够就应用程序高效地协同工作
    • 它定义了软件元素的交互方式

软件架构的4+1视图模型

 

 

   4+1视图模型使用四个视图描述应用程序的架构,并显示每个视图中的元素如何协作处理请求的场景。

   4+1视图模型是描述应用架构的绝佳方式。

为什么架构如此重要

应用程序有两个层面的需求:

    • 第一类是功能性需求,这些需求决定一个应用程序做什么。应用的架构其实跟这些功能需求没什么关系。功能性需求可以通过任意的架构来实现。甚至是非常糟糕的大泥球架构。
    • 第二类是非功能性需求,我们把这类需求也称之为质量属性需求,或者简称为“能力”。这些非功能性需求决定一个应用程序在运行时的质量,比如可扩展性和可靠性。它们也决定了开发阶段的质量,包括可维护性,可测试性,可扩展性和可部署性。为应用程序选择的架构将决定这些质量属性。

 什么是架构的风格

架构风格确定可以在该风格的实例中使用的组件和连接器词汇表,以及关于如何组合它们的一组约束。
应用程序通常使用多种架构风格的组合。

分层架构风格

六边形架构风格

单体架构

微服务架构

关于架构风格的六边形

 

六边形架构的一个示例
它由业务逻辑和一个或多个与外部系统通信的适配器组成。
业务逻辑具有一个或多个端口。
处理来自外部系统请求的入站适配器调用入站端口。
出站适配器实现出站端口,并调用外部系统。

单体架构

将应用程序构建为单个可执行的可部署组件。

单体架构是一种架构风格。

单体应用程序可以具有六边形架构风格的逻辑视图。

什么是单体地狱

一个单体地狱案例。大型开发团队将其更改提交到单个源代码仓库。从代码提交到生产环境的路径漫长而艰巨,并且涉及手工测试。应用程序庞大,复杂,不可靠,难以维护

过度的复杂性会吓退开发者。

开发速度缓慢

从代码提交到实际部署的周期很长,而且容易出问题

难以扩展

交付可靠的单体应用是一项挑战

需要长期依赖某个可能已经过时的技术栈

微服务架构

将应用程序构建为松耦合,可独立部署的一组服务。

微服务架构是一种粒度更细小服务来开发单个应用,每个服务运行在自己的进程中,并使用TCP或HTTP进行通信,这些服务使用不同的编程语言实现, 采用网关集中式管理和外网访问

 

 

微服务架构模式语言

 

 

模式语言可以帮助架构师通过解决各种架构和设计问题来有效的使用它。
微服务架构模式语言的概括性视图,显示模式解决的不同问题领域。左边是应用程序架构模式:单体架构和微服务架构。所有其他模式组解决了选择微服务架构模式所导致的问题

微服务架构中的进程间通信

交互方式

  一对一 一对多
同步模式 请求/响应
异步模式

请求/异步响应

单向通知

发布/订阅

发布/异步响应

 

请求/响应:客户端向服务器端发起请求,同步等待响应,等待过程可能造成线程阻塞。

请求/异步响应:客户端发送请求到服务端,服务端异步响应请求。客户端不会阻塞,而且被设计成默认响应不会立刻到达。

单向通知:客户端请求发送到服务端,服务端不返回请求响应。

发布/订阅方式:客户端发布通知消息,被零个或者多个订阅者服务消费。

发布/异步响应模式:客户端发布请求消息,然后异步或者回调服务发回响应。

基于同步远程过程调用模式的通信

 

客户端的业务逻辑调用由RPI代理适配器类实现的接口。RPI代理类向服务发出请求。RPI服务适配器类通过调用服务的业务逻辑来处理请求

REST API
gRPC

使用断路器模式处理局部故障

 

 

 

API Gateway使用API组合实现Get/orders/{orderId}端点。它会调用多个服务,汇总其响应,并向移动应用程序发送响应。实现端点的代码必须包含处理其调用的每个服务的故障的策略

网络超时:保证不会一直在无响应的请求上浪费资源。

限制客户端向服务器发出请求的数量:超过请求上限立即失败。

断路器模式:这是一个远程过程调用的代理,在连续失败次数超过指定阈值后的一段时间内,这个代理会立即拒绝其他调用。