当前位置: 首页 > news >正文

云架构的思考3--云上开发

目录

  • 1 DevOps--简单灵活性高
  • 2 服务化(微服务)--弹性(可扩展)、按需自主服务
  • 3 无状态(Serverless)--弹性(可扩展)
  • 4 日志--安全
  • 5 配置中心--安全
  • 6 设计模式
    • 6.1 使用“适配器模式”调用SDK/API
    • 6.2 使用“断路器模式”增强容错性
    • 6.3 使用“补偿机制”实现最终一致性
    • 6.4 使用“事件源模式”化繁为简
    • 6.5 使用“管道模式”提高扩展性
    • 6.6 使用“Sidecar模式”
  • 7 总结

前面2章我们了解了云计算的特点、服务模式、部署模式以及云上架构设计的通用步骤,这一章我们来聊一下更加细的一方面,就是云上开发。有人说云上开发跟我们平时开发有什么不一样的,不就是写写代码,莫非还有语言和设计模式不一样?首先在语言上和设计模式上没有什么不一样,但是上云的开发与我们平时开发还真有一些不一样,这里并没有统一规则,只是本人在开发过程中的一些经验总结。
首先我们回顾一下之前第一章所讲的云的特点:弹性(可扩展性)、按需自主服务、经济性、简单灵活性高、安全等5个方面。那么架构都要匹配和利用好这些特点,那么在开发中也需要很好利用这些特点来实现你的开发,这样既能让你的开发效率提高,也能让你的开发能够匹配上云的设计。

1 DevOps–简单灵活性高

DevOps这个词已经出现很久了,并且在很多公司已经很好落地,真的实现快速并且可靠的交付。DevOps不仅是一种文化,解决从设计、开发、测试、上线、维护等各个环节的沟通问题,同样也需要一套工具支撑。对于DevOps的相关概念作用等内容在网上已经有很多,这里不在累述,这里主要讲的是DevOps与云上开发的关系或者说云上开发为什么需要DevOps。归纳为以下几点:

  • 自动化基础设施:云基础设施都是面向代码化(IaC),为的就是提供高可靠性屏蔽底层异构性,那么这个和DevOps的初衷之一高可靠性就很符合,因此2者一拍即合,因此你会看到很多云厂商上面已经有各种成熟的部署环境,你只需要选择你合适的,基本不需要你做任何修改,并且还经常更新和维护。
  • 快速部署:DevOps的初衷之一就是快速交付,而DevOps也有快速交付的目的,因此你在云厂商上面都能见到一整套成熟的DevOps工具,你无需做任何安装和部署,只需要几分钟就能创建出一套DevOps从设计、开发、测试、上线和维护的流程。
  • 持续集成持续交付:CI/CD这个词对于任何开发人员来说都不陌生,强调的是能够迅速并且持续测试并高质量交付。要做到这一点需要的是自动化测试、自动化部署同时也能够敏捷试错。那么这对于云来说也是天然属性之一,还记得在第二章中讲过有人就是利用云来作为其测试环境,其实就是利用云的快速且多类不同环境的特点。

我不知道一开始2者是谁推动了谁,那是我现在我觉得2者是相互相成的。因此我们在云上开发,优先会考虑使用DevOps的开发机制,这样既能利用到云的特点,也能享受其带来的效率。

2 服务化(微服务)–弹性(可扩展)、按需自主服务

你一定听过RESTful,但你不要觉得它是一个很深很复杂的东西,简单理解就是提供规范化的API。提供规范化API其实就是屏蔽你内部系统的所有细节,对外提供统一的语言,这样做的好处显而易见,就是能让不同技术栈实现的东西相互之间调用和访问,说的简单一点就是服务化。服务化对于云上开发的重要性有以下2个原因:

  • 云本身就是服务化:如你所见,所有云产品都会提供标准API供用户使用,其实就让客户能够轻松的兼容不同技术栈的内容,只需要关注服务的功能,而你自身的代码也需要做到如此,就能更好的兼容云,这样别人在使用你的服务也如同使用云上服务一样。
  • 服务化能解耦:我们知道解耦是一个非常基本的设计要求,力求的就是一个简单并且可扩展性。云特点之一就是弹性,只有当你解耦了,那么才能利用弹性伸缩。因此服务化设计能让你开发的内容很好利用云上弹性特点。

那么服务化选择SOAP、RESTful或者GraphQL?这个仁者见仁智者见智,没有说一定的统一规范,但是我个人觉得RESTful是一个比较好的方案,理由如下:

  • 它是一种比较简单和易理解的标准
  • 它已经被广泛结束的标准
  • 它的约束条件很符合云上的容错设计

无论你选择哪一种解决方案,但是是你开发的产品、系统、功能变成服务化,是一个云上开发的基本准则之一

3 无状态(Serverless)–弹性(可扩展)

无状态其实在多线程、多进程、微服务或者分布式系统中都会提及到,并非什么新的内容。简单来说,无状态就是只关注输入内容,不存在程序状态,也就是无论什么时候一样的输入内容会得出一样的输出结果。那么这个与云上开发有什么关系:

  • 弹性:云一大特点之一就是弹性,弹性就意味着你的程序可以伸缩,那么不能因为在A容器/机器上面执行与在B容器/机器上面执行会得出不同的内容。只有无状态程序才能很好的利用云的弹性。
  • 最终一致性:在云上这种解耦的服务化模式下,要实现ACID的事务强一致性是需要付出比较大的代价,那么在设计过程中尽量遵循BASE理论,也就是最终一致性,而最终一致性是云上解决方案中最常见的。无状态服务就是实现最终一致性的基础之一,因为它具有幂等性。
  • 云上Serverless:Serverless这个词也出现了很久,各大云厂商都有相关的Serverless产品,比如AWS的Lambda、阿里云的函数计算等,其主要目的就是你只需要实现关键业务的部分,其它的交由基础设施来实现。那么Serverless的要求之一也就是无状态。

因此总的来说,无状态的代码设计对于云上开发尤为重要,开发设计无状态程序,可以重复利用云的弹性,也保持迁移Serverless的可能性

4 日志–安全

日志在第二章中已经详细说明了为什么要做一个统一集中的日志管理,这里要强调的是开发过程中,不能像我们以前那样在本地写日志那么简单,有更多的方案选择,因为如果写入本地,在云上有可能部署的是一个伸缩容器,一旦容器回收,日志则会被删除掉,因此需要参照第二章2.7.1中的方式,同时日志格式也是需要参照架构统一规范。

5 配置中心–安全

从部署上考虑,无论开发环境和生产环境都要尽量保持一致,那么配置化(如数据库、第三方api等配置)都会影响部署代码不一致,所以最好通过环境变量来读取配置中心的配置。从安全性考虑,将一些资源地址密钥放在部署包中是非常不安全的。在云上开发,都会提供安全性的配置管理中心。因此使用一个云上配置中心是非常有必要的。

6 设计模式

是的,开头说了云上的开发设计模式跟我们平时的设计模式没有什么不一样,那么这里要讲的是利用平常的设计模式,在云上开发中某些关键点的使用。

6.1 使用“适配器模式”调用SDK/API

我们知道适配器设计模式就是将某个类的接口转换成客户端期望的另一个接口表示,那么在云开发中,我们经常使用到云的SDK或者API,但是不同云厂商之间的SDK/API的规范有些不一致,对于我们的开发来说,如果程序需要运行于不同的云厂商,那么就需要每每适配一个SDK/API,因此在调用云厂商的SDK/API时,可以使用适配器模式,这样对于原先代码不需要做任何修改,只需要增加不同适配器以达到适配不同云厂商的效果

6.2 使用“断路器模式”增强容错性

在云上的服务都是有一定的不可用性,或者说服务不可用是经常发生的事情,这个也是微服务的特点。那么为了保证我们服务不受其不可用影响或者降低其不可用对我们程序的影响,使用断路器模式在下游服务不可用时,可以做备用方案减少或者屏蔽其服务不可用带来的损失,同时还具备重试功能。

6.3 使用“补偿机制”实现最终一致性

最终一致性是以一种比较低的代价实现一致性的方式,而云上开发使用BASE理论使用最终一致性是一种常见方式。最终一致性需要一个兜底的方案,那就是补偿机制,因此在开发中设计补偿机制是云上开发的一种必须考虑的设计模式。

6.4 使用“事件源模式”化繁为简

事件源模式指的是系统中发生的事件会触发相应的事件处理器或监听器,从而实现特定的业务逻辑或功能。该设计模式最大好处就是解耦,并且能够化繁为简。在云上开发中经常会被使用,特别是Serverless开发基本上这是基本实现模式。

6.5 使用“管道模式”提高扩展性

管道模式是将执行复杂处理的任务分解为一系列可重用的离散元素。通过允许独立地部署和扩展执行处理的任务元素,该模式可以提高性能、可伸缩性和可重用性。这样的模式在云上设计特别是复杂任务需要利用云的弹性以提高性能最适合不过,我们可以考虑比如数据计算、机器学习等方面使用。

6.6 使用“Sidecar模式”

Sidecar模式在ServiceMesh中被用得淋漓尽致,原因就是它能够将与业务无关却是业务需要的通用功能剥离出来,以边车的模式同业务一起运行。这样能解决与业务解耦,同时它本身的升级与业务模块升级也能分开,因此在云上开发也可以考虑使用这样的模式。

这里只是简单列举一些常见的模式,当然还存在很多其它云上设计模式,这些需要大家在上云过程中慢慢积累。

7 总结

开发是一门细腻活,云上开发可以理解是一种基于不同环境不同机制下的新的开发方式,但是又不脱离原先的开发,只不过是在原先的开发基础上增加了其适配云上特点的特殊性,因此这方面还需要多加积累,这里只是阐述本人在云上开发的一些常见问题的经验。

相关文章:

云架构的思考3--云上开发

目录 1 DevOps--简单灵活性高2 服务化(微服务)--弹性(可扩展)、按需自主服务3 无状态(Serverless)--弹性(可扩展)4 日志--安全5 配置中心--安全6 设计模式6.1 使用“适配器模式”调用…...

vue3日常知识点学习归纳

1&#xff0c;父子组件传递&#xff1a; 父组件传递参数 <template><div><!-- 子组件 参数&#xff1a;num 、nums --><child :num"nums.num" :doubleNum"nums.doubleNum" increase"handleIncrease"></child>&l…...

策略模式终极解决方案之策略机

我们在开发时经常会遇到一堆的if else …, 或者switch, 比如我们常见的全局异常处理等, 像类似这种很多if else 或者多场景模式下, 策略模式是非常受欢迎的一种设计模式, 然而, 一个好的策略模式却不是那么容易写出来. 我在工作中也因为写烦了switch,if else 觉得很不优雅, 因…...

linux 常用指令目录大纲

Linux下的Signal信号处理及详解&#xff0c;test ok-CSDN博客 Linux下怎样判断一个binary是否可以debug//test ok_感知算法工程师的博客-CSDN博客 linux file命令的用法//test ok-CSDN博客 linux下生成core dump方法与gdb解析core dump文件//test ok-CSDN博客 linux readel…...

webpack该如何打包

1.我们先创建一个空的大文件夹 2.打开该文件夹的终端 输入npm init -y 2.1.打开该文件夹的终端 2.2在该终端运行 npm init -y 3.安装webpack 3.1打开webpack网址 点击“中文文档” 3.2点击“指南”在点击“起步” 3.3复制基本安装图片画线的代码 4.在一开始的文件夹下在创建一…...

【STM32】TIM定时器输入捕获

1 输入捕获 1.1 输入捕获简介 IC&#xff08;Input Capture&#xff09;输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变时&#xff08;上升沿/下降沿&#xff09;&#xff0c;当前CNT的值将被锁存到CCR中&#xff08;把CNT的值读出来&#xff0c;写入到…...

webrtc 设置不获取鼠标 启用回声消除

数 getDisplayMedia()(属于 navigator.mediaDevices 的一部分)与 getUserMedia() 类似,用于打开显示内容(或部分内容,如窗口)。返回的 MediaStream 与使用 getUserMedia() 时相同。 显示鼠标与否 getDisplayMedia() 的约束条件与常规视频或音频输入资源的限制不同。 {…...

JVM虚拟机:如何查看JVM初始和最终的参数?

本文重点 在前面的课程中&#xff0c;我们学习了如何查看当前程序所处于的xx参数&#xff0c;本文再介绍一种如何参看JVM的xx参数&#xff1f; 查看JVM的所有初始化参数 方式一&#xff1a;java -XX:PrintFlagsInitial 方式二&#xff1a;java -XX:PrintFlagsInitial -versio…...

JVM Optimization Learning(五)

目录 一、JVM Optimization 1、G1 1、G1内存模型 2、基础概念 3、G1特点&#xff1a; 4、CMS日志分析 5、G1日志分析 2、GC参数 2.1、GC常用参数 2.2、Parallel常用参数 2.3、CMS常用参数 2.4、G1常用参数 一、JVM Optimization 1、G1 G1官网说明&#xff1a;Gar…...

Java项目学生管理系统一前后端环境搭建

在现代的软件开发中&#xff0c;学生管理系统是一个常见的应用场景。通过学生管理系统&#xff0c;学校能够方便地管理学生的信息、课程安排和成绩等数据。本文将介绍如何使用Java语言搭建一个学生管理系统的前后端环境&#xff0c;并提供一个简单的示例。 1.环境搭建 学生管…...

LeetCode:169.多数元素(哈希表)

题目 第一版 思路 直接开个哈希表&#xff0c;存储每个数组中的数字和对应出现的次数。然后排序后找出对应最大value值的key。 代码 class Solution {public int majorityElement(int[] nums) {Map<Integer,Integer>map new HashMap<Integer,Integer>();for(…...

Linux指令学习

目录 1.ls指令 2.pwd命令 3.cd 指令 4. touch指令 5.mkdir指令 6.rmdir指令 && rm 指令 7.man指令 8.cp指令 9.mv指令 10.cat指令 11.more指令 12.less指令 13.head指令 14.find指令&#xff1a; -name 15.grep指令 16.zip/unzip指令&#xff1a; 17.tar…...

vue2+datav可视化数据大屏(1)

开始 &#x1f4d3; 最近打算出一个前端可视化数据大屏的系列专栏&#xff0c;这次将很全面的教大家设计可视化大屏&#xff0c;从开始到打包结束&#xff0c;其中&#xff0c;包括如何设计框架&#xff0c;如何封装axios&#xff0c;等等&#xff0c;本次使用的数据均为mock数…...

Linux 多进程并发设计-进程对核的亲缘设置

1设计结构 2 设计优点 1 充分利用多核系统的并发处理能力2 负载均衡3 职责明确&#xff0c;管理进程仅负责管理&#xff0c;工作进程仅负责处理业务逻辑 3 演示代码: //main.cpp #define _GNU_SOURCE #include<sys/types.h> #include<sys/wait.h> #include <…...

Javascript 函数介绍

Javascript 函数介绍 很多教程书一上来就讲解一堆语法&#xff0c;例如函数定义、函数调用什么。等读者看完了函数这一章都没搞懂什么是函数。 在讲解什么叫函数之前&#xff0c;我们先看下面一段代码&#xff1a; <!DOCTYPE html> <html xmlns"http://www.w3.…...

php 粉丝关注功能实现

实现粉丝关注功能的步骤如下&#xff1a; 创建用户表&#xff08;user&#xff09;和关注表&#xff08;follow&#xff09;&#xff1a; CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,username varchar(255) NOT NULL,email varchar(255) NOT NULL,password varc…...

深入浅出理解kafka ---- 万字总结

1.Kafka简介 Kafka 本质上是一个 MQ&#xff08;Message Queue&#xff09;&#xff0c;使用消息队列的优点&#xff1a; 解耦&#xff1a;允许独立的扩展或修改队列两边的处理过程。可恢复性&#xff1a;即使一个处理消息的进程挂掉&#xff0c;加入队列中的消息仍然可以在系…...

一对一聊天

服务端 package 一对一用户;import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Vector;…...

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Mybatis查询中返回值四种情况

第一章 Mybatis查询中返回值四种情况 1.1 查询单行数据返回单个对象 /*** 通过id获取员工信息*/ public Employee selectEmpById(int empId);<select id"selectEmpById" resultType"employee">SELECTid,last_name,email,salaryFROMtbl_employeeWHE…...

华为云安全组规则

初始发布cce,快被安全组搞死了。现在把自己的研究成果综合一下,在这里给自己留痕,希望对迷惑的朋友有帮助。 先搞懂安全组是个啥东东: 安全组规则 操作场景 安全组实际是网络流量访问策略,通过访问策略可以控制流量入方向规则和出方向规则,通过这些规则可以为加入安全组…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...