凤凰架构-周志明

一.演进

服务架构演进史

架构并不是被发明出来的,而是持续演进的结果。

原始分布式时代

UNIX 的分布式设计哲学

Simplicity of both the interface and the implementation are more
important than any other attributes of the system — including
correctness, consistency, and completeness

保持接口与实现的简单性,比系统的任何其他属性,包括准确性、一致性和完整性,都来得更加重要。

—— Richard P. Gabriel,The Rise of ‘Worse is Better’,1991

原始分布式时代的教训

Just because something can be distributed doesn’t mean it should be
distributed. Trying to make a distributed call act like a local call
always ends in tears

某个功能能够进行分布式,并不意味着它就应该进行分布式,强行追求透明的分布式操作,只会自寻苦果

—— Kyle Brown,IBM Fellow,Beyond Buzzwords: A Brief History of
Microservices Patterns,2016

单体系统时代

单体架构(Monolithic)

“单体”只是表明系统中主要的过程调用都是进程内调用,不会发生进程间通信,仅此而已。

单体系统的不足,必须基于软件的性能需求超过了单机,软件的开发人员规模明显超过了“2 Pizza Team”范畴的前提下才有讨论的价值,因此,本文后续讨论中所说的单体,均应该是特指“大型的单体系统”。

图片来自 O'Reilly 的开放文档《Software Architecture Patterns》

SOA 时代

SOA 架构(Service-Oriented Architecture)

面向服务的架构是一次具体地、系统性地成功解决分布式服务主要问题的架构模式。

微内核架构

在这里插入图片描述

事件驱动架构

在这里插入图片描述

经过了三十年的技术进步,信息系统经历了巨石、烟囱、插件、事件、SOA 等的架构模式,应用受架构复杂度的牵绊却是越来越大,已经距离“透明”二字越来越远了,这是否算不自觉间忘记掉了当年的初心?接下来我们所谈论的微服务时代,似乎正是带着这样的自省式的问句而开启的。

微服务时代

微服务架构(Microservices)

微服务是一种通过多个小型服务组合来构建单个应用的架构风格,这些服务围绕业务能力而非特定的技术标准来构建。各个服务可以采用不同的编程语言,不同的数据存储技术,运行在不同的进程之中。服务采取轻量级的通信机制和自动化的部署机制实现通信与运维。

wiki:

What is microservices

Microservices is a software development technique — a variant of the
service-oriented architecture (SOA) structural style.

微服务是一种软件开发技术,是一种 SOA 的变体形式。

—— Wikipedia,Microservices

Microservices and SOA

This common manifestation of SOA has led some microservice advocates
to reject the SOA label entirely, although others consider
microservices to be one form of SOA , perhaps service orientation done
right. Either way, the fact that SOA means such different things means
it’s valuable to have a term that more crisply defines this
architectural style

由于与 SOA 具有一致的表现形式,这让微服务的支持者更加迫切地拒绝再被打上 SOA 的标签,尽管有一些人坚持认为微服务就是 SOA
的一种变体形式,也许从面向服务方面这个方面来说是对的,但无论如何,SOA
与微服务都是两种不同的东西,正因如此,使用一个别的名称来简明地定义这种架构风格就显得更有必要。

—— Martin Fowler / James Lewis,Microservices

微服务时代充满着自由的气息,微服务时代充斥着迷茫的选择。

像 Spring Cloud 这样的胶水式的全家桶工具集,通过一致的接口、声明和配置,进一步屏蔽了源自于具体工具、框架的复杂性,降低了在不同工具、框架之间切换的成本,所以,作为一个普通的服务开发者,微服务架构是友善的。

可是,微服务对架构者是满满的恶意,对架构能力要求已提升到史无前例的程度。

后微服务时代

后微服务时代(Cloud Native)

从软件层面独力应对微服务架构问题,发展到软、硬一体,合力应对架构问题的时代,此即为“后微服务时代”。

注册发现、跟踪治理、负载均衡、传输通信等这些问题一定要由软件系统自己来解决吗?

服务网格”(Service Mesh)的“边车代理模式”(Sidecar Proxy):
> 这里是引用

服务网格将会成为微服务之间通信交互的主流模式,把“选择什么通信协议”、“怎样调度流量”、“如何认证授权”之类的技术问题隔离于程序代码之外,取代今天 Spring Cloud 全家桶中大部分组件的功能,微服务只需要考虑业务本身的逻辑,这才是最理想的Smart Endpoints解决方案

无服务时代

无服务架构(Serverless)

如果说微服务架构是分布式系统这条路的极致,那无服务架构,也许就是“不分布式”的云端系统这条路的起点。

We predict that serverless computing will grow to dominate the future of cloud computing

我们预测无服务将会发展成为未来云计算的主要形式

—— Cloud Programming Simplified: A Berkeley View on Serverless
Computing, 2019

  1. 后端设施是指数据库、消息队列、日志、存储,等等这一类用于支撑业务逻辑运行,但本身无业务含义的技术组件,这些后端设施都运行在云中,无服务中称其为“后端即服务”(Backend as a Service,BaaS)。
  2. 函数是指业务逻辑代码,这里函数的概念与粒度,都已经很接近于程序编码角度的函数了,其区别是无服务中的函数运行在云端,不必考虑算力问题,不必考虑容量规划(从技术角度可以不考虑,从计费的角度你的钱包够不够用还是要掂量一下的),无服务中称其为“函数即服务”(Function as a Service,FaaS)。

软件开发的未来不会只存在某一种“最先进的”架构风格,多种具针对性的架构风格同时并存,是软件产业更有生命力的形态。

二. 细节

访问远程服务

远程服务调用
表示数据,传递数据, 确定方法在这里插入图片描述
REST 设计风格

  1. RESTful 的系统(6大原则)
    服务端与客户端分离(Client-Server)
    无状态(Stateless)
    可缓存(Cacheability)
    分层系统(Layered System):cdn…
    统一接口(Uniform Interface)
    按需代码(Code-On-Demand)
  2. 不足与争议
    REST 缺乏对资源进行“部分”和“批量”的处理能力(GraphQL),REST 没有传输可靠性支持(POST Once Exactly)

事务处理

分布式事务
1.可靠事件队列(Best-Effort Delivery)
在这里插入图片描述
2. TCC 事务

在这里插入图片描述

SAGA 事务
SAGA 的目的是避免大事务长时间锁定数据库的资源,后来才发展成将一个分布式环境中的大事务分解为一系列本地事务的设计模式

  1. 正向恢复(Forward Recovery):如果 Ti事务提交失败,则一直对 Ti进行重试,直至成功为止(最大努力交付)。这种恢复方式不需要补偿,适用于事务最终都要成功的场景,譬如在别人的银行账号中扣了款,就一定要给别人发货。正向恢复的执行模式为:T1,T2,…,Ti(失败),Ti(重试)…,Ti+1,…,Tn。
  2. 反向恢复(Backward Recovery):如果 Ti事务提交失败,则一直执行 Ci对
    Ti进行补偿,直至成功为止(最大努力交付)。这里要求
    Ci必须(在持续重试后)执行成功。反向恢复的执行模式为:T1,T2,…,Ti(失败),Ci(补偿),…,C2,C1。

透明多级分流系统

奥卡姆剃刀原则

Entities should not be multiplied without necessity

如无必要,勿增实体

—— Occam’s Razor,William of Ockham

  1. 尽可能减少单点部件,如果某些单点是无可避免的,则应尽最大限度减少到达单点部件的流量
  2. 在能满足需求的前提下,最简单的系统就是最好的系统
  1. 客户端缓存
  2. 域名解析(DNS Lookup, 世界根域名服务器的 ZONE 文件只有 2MB )
  3. 传输链路优化(Transmission Optimization:连接数优化)
    在这里插入图片描述
  4. 传输压缩
  5. 快速 UDP 网络连接
  6. 内容分发网络(CDN)
  7. 负载均衡
    在这里插入图片描述
    8.服务端缓存
    在这里插入图片描述
    在这里插入图片描述
    缓存风险: 缓存穿透/缓存击穿/缓存雪崩/缓存污染

架构安全性

1.认证
http在这里插入图片描述 WebAuthn在这里插入图片描述
敏感操作需双因子认证
3. 授权
在这里插入图片描述
在这里插入图片描述

授权方式:授权码模式(Authorization Code),隐式授权模式(Implicit),密码模式(Resource Owner Password Credentials),客户端模式(Client Credentials)在这里插入图片描述
开始进行授权过程以前,第三方应用先要到授权服务器上进行注册,所谓注册,是指向认证服务器提供一个域名地址,然后从授权服务器中获取 ClientID 和 ClientSecret
隐式授权(第三方应用无需服务器)
在这里插入图片描述
http://bookstore.icyfenix.cn/#/detail/1, #后面的/detail/1便是 Fragment
密码模式
在这里插入图片描述
客户端模式
在这里插入图片描述
设备码模式
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/4198.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

物联网--Zigbee协议(二):Zigbee协议架构以及数据帧结构

上一篇整理了关于Zigbee协议的一些基础知识,接下来主要讨论Zigbee协议的架构,希望通过这篇文章能够帮助小伙伴们更好地理解Zigbee协议,废话不多说,进入正题吧。 文章目录一、Zigbee协议架构二、Zigbee协议的数据帧结构总结一、Zig…

92年程序员发帖晒薪资称自己很迷茫,网友:老弟你可以了

当下,是一个“向钱看,向厚赚”的社会。快节奏的生活下,家庭、工作各方面压力很容易使年轻人陷入迷茫和焦虑。 与其他行业相比,程序员的高薪让人羡慕。那么,对于那些真正达到这么多收入的人来说,他们是怎么…

Redis缓存优化

数据库在用户数量多,系统访问量大的时候,系统性能会下降,用户体验差。1.缓存优化作用:1.降低数据库的访问压力2.提高系统的访问性能3.从而提高用户体验实现思路:1.先查询缓存2.如果缓存有数据,直接返回3.如…

【第017问 Unity Physics.OverlapSphere如何检测附近玩家?】

一、背景 如何检测一个对象范围内的玩家,这个可以直接使用距离判定,物体射线检测等相关方式;这里采用Physics.OverlapSphere的方式来实践其过程,并对Physics.OverlapSphere的使用做一下记录; 二、Physics.OverlapSph…

FFMPEG将视频切片成ts文件并对ts文件进行ASE加密,并合并成M3U8操作方法

环境:centos7 开发语言:php 框架:视频转码服务系统 生成ASE加密文件需要用到的命令: #!/bin/sh BASE_URL${1:-.} openssl rand 16 > file.key echo $BASE_URL/file.key > file.keyinfo echo file.key >> file.key…

Unity --- Transform类

1.一个很有意思的事实是Transform类不仅用来管理游戏物体的位置缩放旋转,还用来管理游戏物体的父物体与子物体之间的关系 当游戏物体A的trasnform类a是游戏物体B的transform类b的父类的话,游戏物体A就是游戏物体B的父物体 2.如何访问脚本当前挂载的游戏…

Unity IL2CPP 游戏分析入门

一、目标 很多时候App加密本身并不难,难得是他用了一套新玩意,天生自带加密光环。例如PC时代的VB,直接ida的话,汇编代码能把你看懵。 但是要是搞明白了他的玩法,VB Decompiler一上,那妥妥的就是源码。 U…

GPT-4创造者:第二次改变AI浪潮的方向

OneFlow编译 翻译|贾川、杨婷、徐佳渝 编辑|王金许 一朝成名天下知。ChatGPT/GPT-4相关的新闻接二连三刷屏朋友圈,如今,这些模型背后的公司OpenAI的知名度不亚于任何科技巨头。 不过,就在ChatGPT问世前,Ope…

昇腾AI机器人发布,12家企业、5家高校签约,昇腾AI开发者创享日全国巡展沈阳首站成功举办

“创未来,享非凡”昇腾AI开发者创享日2023年全国巡回首站活动成功举办,本次活动由辽宁省科技厅指导,由沈阳市科技局、浑南区人民政府、沈阳高新区管理委员会、华为技术有限公司共同主办,沈阳昇腾人工智能生态创新中心承办&#xf…

使用R语言包clusterProfiler做KEGG富集分析时出现的错误及解决方法

使用enrichKEGG做通路富集分析时&#xff0c;一直报错&#xff1a;显示No gene can be mapped....k <- enrichKEGG(gene gene, organism "hsa", pvalueCutoff 1, qvalueCutoff 1)但是之前用同样的基因做分析是能够成功地富集到通路&#xff0c;即便是网上的数据…

Postman下载与安装操作步骤【超详细】

&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是超梦梦梦梦&#xff0c;很高兴认识大家~&#x1f357;关注➕点赞➕评论➕收藏 &#x1f604;&#x1f64f;博主水平有限&#xff0c;如有错误&#xff0c;欢迎各位大佬纠正 Postman下载与安装&#x1…

STM32单片机通过ESP8266WiFi模块与Android APP实现数据传输(二)---上位机搭建

事物的难度远远低于对事物的恐惧 完成对STM32单片机和ESP8266 WiFi模块的配置之后&#xff0c;接下来需要完成Android APP代码的编写以及实现。 1.添加网络权限 因为我们需要对WiFi进行操作&#xff0c;所以需要网络的权限&#xff0c;在AndroiManifest.xml文件中加入以下代码…

Liunx创建用户与授权大招以及Linux修改SSH端口

1、Liunx创建用户与授权 背景&#xff1a;大家个人建站学习的时候&#xff0c;经常会涉及到创建Linux用户&#xff0c;授权用户&#xff0c;网上一堆操作各种不好使&#xff0c;小编总结了一个最好用的写法供大家使用。 还有个人云服务遭受挖矿攻击的情况&#xff0c;建议大家也…

mac maven安装和配置本地仓库

首先我们需要下载&#xff1a;maven官网下载地址传送门 x.x.x-bin.zip(Windows系统的) 找到x.x.x-bin.tar.zip(mac系统的) 备注&#xff1a;下面的图截错了&#xff0c;抱歉 下载完成之后&#xff0c;可以在右下角的下载找到 然后双击这个 .zip 压缩包 &#xff0c;可以进行…

解决使用WinScp连接Ubantu系统失败的问题---SSH无法连接

起因 为了互通Linux系统和Windows系统的文件&#xff0c;以更好的实现文件管理和资源共享。 所以在查阅资料后&#xff0c;使用WinScp&#xff0c;WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端。它的主要功能就是在本地与远程计算机间安全的复制文件。winscp也可…

Python的23种设计模式(完整版带源码实例)

作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; Python的23种设计模式 一 什么是设计模式 设计模式是面对各种问题进行提炼和抽象而形成的解决方案。这些设计方案是前人不断试验&…

猿创征文 | re:Invent 朝圣之路:“云“行业风向标

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; AWS 亚马逊云科技re:Invent全球大会 2022年亚马逊云科技re:Invent全球大会震撼来袭&#xff0c;即将于北京时间11月30日-12月2日在美国内华达州&#xff0c;拉斯维加斯…

【七】一文带你迅速掌握设计模式中的单例模式

1. 什么是设计模式 设计模式可以理解为就是一种固定套路&#xff0c;就好比你和对手下棋得时候&#xff0c;会有一些固定套路下法&#xff1b;而设计模式就是软件开发的棋谱~ 设计模式有很多种&#xff0c;接下来就介绍一种校招阶段&#xff0c;主要考察的两种设计模式: 单例…

centos 7安装mysql

今天在centos 7上安装mysql数据库&#xff0c;遇到了些问题以及解决方法&#xff0c;记录一下。1、下载mysql安装包wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm出现跟上面界面这样子&#xff0c;说明是ok的了&#xff0c;接下来&#xf…

LAMP架构之zabbix监控(2):zabbix基础操作

目录 一、zabbix监控节点添加和删除 &#xff08;1&#xff09;手动添加 &#xff08;2&#xff09;自动添加 &#xff08;3&#xff09;按照条件批量添加 &#xff08;4&#xff09;使用api工具进行管理 二、针对应用的zabbix监控 一、zabbix监控节点添加和删除 实验说明&a…