云原生构建 微服务、容器化与容器编排
第1章 何为云原生,云原生为何而生
SOA也就是面向服务的架构
软件架构的发展主要经历了集中式架构、分布式架构以及云原生架构这几代架构的发展。
微服务架构,其实是SOA的另外一种实现方式,属于SOA的子集。

在微服务架构下,系统中每一个服务都是一个独立的可部署单元,各个服务之间相互解耦并且通过通信协议进行通信。另外需要注意的是,在微服务架构中由于分布式架构的内生复杂性,也就是服务通信与服务治理等方面的复杂性,还需要考虑服务注册与发现、统一配置中心、链路追踪等方面的问题。除了可以看到各个业务服务外,还会看到一些基础的服务组件。需要注意的是,一个由业务微服务与非业务的基础服务组件组成的微服务架构才能称为一个较为完整的微服务架构。
1.2.3 云原生架构
云原生架构,其实是一个构建和运行应用程序的方法,是一整套技术体系与方法论。
1.3.2 什么是云原生应用
当使用云原生应用时就可以充分利用云原生平台的弹性与分布式优势,以此实现快速部署、按需伸缩、不停机交付等。一般情况下,这些架构使用微服务进行构建,也就是说对于云原生应用可以将其想象为一系列独立的、小型的、松耦合的服务。
1.4.1 云原生应用设计理念
简单来说云原生应用的设计理念,就是围绕着部署在云平台的应用程序能够充分利用云平台的弹性与分布式的优势来进行的。
对于云原生应用的设计理念,主要从面向分布式设计、面向韧性设计、面向弹性设计等方面进行介绍。
在面向分布式设计中,需要关注的重点是松耦合的微服务。
松耦合的微服务是指应用在设计时应该根据具体业务需求将整体业务拆分成一系列独立的、小型的、松耦合的服务,整体业务有这些服务共同来完成。另外在拆分这些服务时,需要注意的是这些服务一定是围绕着业务功能进行构建的,同时这些服务可以通过自动化的部署机制进行独立的部署与运行。
除此之外,这些服务之间的通信采用类似于HTTP这种轻量级协议进行通信,这就要求开发流程最好是以API驱动的,也就是说应用一定要把设计阶段与开发阶段分开,在设计阶段时先定义好API规范,这些API规范应该在描述其功能的基础上尽量简洁,然后在开发阶段严格遵守API规范进行相关的开发工作。
在面向韧性设计中,需要关注的重点是高可用与故障恢复。
高可用是指应该根据具体的业务需求即业务可用性要求,将业务服务进行不同程度的冗余,比如,将同一个业务服务部署在不同的机房、不同的服务器、不同的进程等。
故障恢复是指应用处理业务时,如果业务服务中断了,应用可以快速恢复以确保业务继续正常运行。
在面向韧性设计的过程中,可以使用容器技术,也就是将业务服务都进行容器化,业务由一组容器化的服务来提供。一方面,可以通过容器快速地将服务移植到相同或不同的操作系统环境上;另一方面可以通过容器平台容器平台确保容器实例运行数量保持不变。
在面向弹性设计中,需要关注的重点是扩展。
扩展是指应用在业务处理的高峰或低谷时间,可以依赖于云平台也就是云的特性进行自动的弹性伸缩。
需要注意的是,业务服务都应该被设计成无状态的,也就是说业务服务的实例可以随时上下线,任何一个业务服务的实例都可以处理业务请求,这样才能使得应用在良好的扩展性方面与生俱来。
云原生应用的12要素为构建云原生应用提供了方法论,是在构建云原生应用的过程中需要遵循的基本原则。
1.基准代码
可以将其理解为日常工作中存放在版本控制系统中的对应的代码库。
在12要素中基准代码强调的是一份基准代码多份部署,也就是说应用对应的代码既可以在测试环境部署,也可以在生产环境部署等。应用与基准代码之间应该是一一对应的关系。
2.依赖
在日常开发工作中其实经常碰到,比如,软件项目中的一个模块如果需要完成自己的功能必须借助其他模块的能力时,该模块就需要依赖其他模块。
在12要素中依赖强调的是管理依赖关系,也就是说应用应该显式地声明自己的依赖项。一方面是有利于管理依赖项;另一方面当有新的开发人员进入项目组时,只需一个构建命令就可以安装所有的依赖项解决环境配置的问题。
3.配置
在开发编写应用代码时,通常会将项目应用中数据库的链接地址、账号、密码等信息放到一个单独的文本文件中进行保存,然后在代码中引用这个文件中的内容,这个文件一般称为配置文件,对于文件中的内容一般称为配置或者配置信息。
4.后端服务
是指在应用运行时所需的通过网络调用的各种服务,比如,我们日常开发工作中经常用到的关系型数据库MySQL、缓存系统Redis,消息中间件ActiveMQ等。
在12要素中后端服务强调的是把后端服务当作附加资源,当部署应用时就按需伸缩这些资源。不管是第三方服务还是本地服务都应视为附加资源。
5.构建、发布和运行
构建是将应用代码进行打包的过程;发布是在相应的环境中部署应用代码包;运行是在相应的环境中启动应用程序。
6.进程
可以理解为正在运行的应用程序的实例。
12要素中进程强调的是以一个或多个无状态进程运行应用,也就是说在日常开发工作中应用程序的运行一般以一个或者多个进程的形式存在。应用进程应该是无状态的。
7.端口绑定
是指可以通过IP+端口的方式来访问服务。
在12要素中端口绑定强调的是通过其来提供服务,也就是当应用程序启动后,应用程序会去监听指定端口的请求。一般情况下都是通过域名访问服务,但是在向域名发送请求时,请求都会被路由到绑定的端口的进程中。
8.并发
是指应用程序与计算单元不是一一对应的关系,一个应用程序可以有多个计算单元。
在12要素中并发强调的是通过进程模型进行扩展,也就是说应用应采用多进程的运行方式按需运行。在Java应用中一般采用多线程的运行方式,随着微服务与容器技术的使用也可以更好地实现扩展。
9.易处理
是指应用进程可以快速启动与停止。
在12要素中易处理强调的是快速启动和优雅终止,可最大化健壮性,也就是说应用可以通过快速启动与停止来确保应用的稳定性。当停止应用时应该妥善处理正在运行的任务,比如将该任务退回至后端队列服务中。
10.开发环境与线上环境等价
是指应该减少各个环境、环节之间的差异。也就是说应用依赖的基础环境、开发人员等应尽量保持一致。不论是测试、生产等环境下部署的后端服务的版本应该是一样的。
11.日志
在日常开发工作中一般使用日志来记录日期、时间、操作者及动作等相关信息。
在12要素中日志强调的是把日志当作事件流,也就是说日志应该是按照时间顺序汇总的事件流。应用一般都有多个进程存在,也就会产生多份日志,可以采用日志索引分析系统以便于对日志进行搜索、分析和展示等。
12.管理进程
可以理解为执行的一些管理与维护应用的任务。
在12要素中管理进程强调的是后台管理任务当做一次性进程运行,也就是说应该一次性运行需要执行的管理与维护应用的任务。执行管理与维护应用的任务的环境应与应用的环境保持一致。
12要素不仅仅适用于构建云原生应用,对于日常工作过程中碰到的一些软件产品或项目的开发也同样适用。
1.4.3 云原生应用的构建步骤
1.思想变革:宣传DevOps文化,增加DevOps能力
在构建云原生应用前,应改变我们以往的思维,不再是开发只负责开发,运维只负责运维,我们需要促进开发、运维等部门之间的沟通、协作与整合,以便于能够更加高效地协同工作,加快软件交付以及提高整体产出。
2.应用开发:使用微服务思想设计应用程序
在云原生应用的构造步骤中第二步的重点就是微服务,也就是说,应用程序在设计时就应根据具体业务需求将整体业务设计成松耦合的微服务,需要采用以API驱动的开发流程。需要注意的是,在应用的整体开发过程中需要遵循云原生应用的12要素,以便于应用可以满足快速扩展与添加功能的基本条件。
3.容器革命:实现不可变基础设施
在应用开发完毕后,需要为应用提供独立的部署单元与执行环境,通过容器技术可以实现该需求。同时,使用容器技术实现基础设施的实例创建后就不可进行更改,如果需要更改只能通过新的实例进行替换,以便于解决环境差异、大规模运维等问题。
4.持续交付:应用全生命周期自动化
在应用开发、部署、上线运行后,当又有新的业务需求来临时,需要考虑持续集成、持续部署与持续发布,以便于能够在应用的构建、测试与发布中变得更快、更频繁。
第2章 从0到1——单体应用
2.1.1 单体应用:不可分割的软件框架
单体应用是指一个包含所有功能的应用程序的归档包,而归档包的格式主要依赖于相关的编程语言和框架。比如,在Java中归档包的格式可以是JAR归档格式或者是WAR归档格式,也可以是EAR归档格式或者其他归档格式。但是严格意义上来说,单体应用其实是一种软件架构,该架构对软件整体结构及组件进行了抽象的描述,可以指导软件系统各个方面的设计。
从单体应用的组成上来说,一个单体应用包含了很多业务逻辑与服务,由多个部分组成,这些组成部分缺一不可。比如,负责用户鉴权的部分、负责处理业务逻辑的部分、负责数据库的数据访问部分以及处理HTTP请求并进行响应的部分,这些部分共同组成了单体应用,并且不能缺少其中的任何一部分,一旦有部分缺失将导致应用程序不可用。
从代码层面上来说,一个单体应用的所有代码都存在于同一个代码库中,并且当编译代码是也会将单体应用的所有代码编译到一起。虽然单体应用的所有代码都在一起,但是在进行单体应用的开发时,一般会遵循分层原则,比如,将业务逻辑抽象出来构建业务层,在数据库之上构建数据访问层。
时序图是展示按时间顺序排序的对象之间交互的图。
类图是一种静态的结构图,主要是描述系统的类的集合、类的属性以及类之间的关系。
2.3.1 Spring Boot:快速配置开发的脚手架
Spring Boot由Pivotal团队于2013年开始研发并于2014年4月发布全新、开源的轻量级框架,Spring Boot 基于Spring4.0设计,该框架继承了Spring框架原有的优秀特性,并且还通过简化配置进一步简化了Spring应用的整个搭建和开发过程。比如,当使用Spring Boot时可以使用特定的方式进行配置,不再需要定义一些样板化的配置,Spring Boot的设计目的是用来简化新的Spring应用的初始搭建以及开发过程。
Spring Boot的核心功能有很多,具体如下:
创建独立的Spring应用程序;
基于其Maven或Gradle插件创建可执行的jar或war;
使用内嵌的Tomcat、Jetty或Undertow;
提供如指标、健康检查和外部化配置等功能;
不需要XML配置;
通过提供的starter来简化Maven配置。
2.3.2 Spring Boot Starters:依赖关系描述符
Spring Boot Starter是在Spring Boot 中提出的一个概念,可以理解为一个依赖关系描述符,它包含一组依赖关系,通过这些依赖关系可以减少手动添加的依赖数量。
当使用Spring Boot时,可以省略很多烦琐的配置。比如,当想要构建rest webservice时,只需添加spring-boot-starter-web依赖;当想要使用Spring和JPA进行数据库访问时我们只需添加spring-boot-starter-data-jpa依赖。
Spring Boot官方提供了很多Starter,官方提供的Starter以“spring-boot- starter-*”的方式来命名,如果要创建自己的Starter,建议命名方式是“*-spring-boot- starter”
Spring Cloud:系列框架的有序集合
Spring Cloud是一系列框架的有序集合,主要提供了快速构建分布式系统中一些常见模式的工具。
联系与区别
Spring是一个一站式的轻量级的Java开发框架,Spring的核心是控制反转(IOC)和面向切面(AOP)。
Spring MVC是在Spring基础上的一个MVC框架,主要用于来处理Web开发的路径映射和视图渲染,Spring MVC属于Spring 框架中Web层开发的一部分。
Spring Boot是一个全新开源的轻量级框架,相对于Spring MVC框架来说,Spring Boot可以更专注于开发微服务后台接口,并且Spring Boot使用默认大于配置的理念,可以快速集成Spring相关插件,同时自动过滤掉不需要配置的多余插件,简化了项目的开发配置流程,并在一定程度上取消了xml配置,能够快速开发单个微服务。
Spring Cloud是一系列框架的有序集合,在Spring Cloud中大部分的功能插件都基于Spring Boot来实现,对于Spring Boot与Spring Cloud,可以理解为Spring Cloud依赖于Spring Boot开发,而Spring Boot可以用来独立开发,Spring Cloud可以将多个Spring Boot单体微服务进行整合以及管理。对于Spring Cloud来说,Spring Cloud更关注全局的微服务整合和管理。
2.3.5 Spring Initializr:项目结构创建工具
1.Spring Initializr功能
提供了快速进行框架初始化配置的能力,通过Spring Initializr可以选择即将初始化项目的发布部署方式、扩展依赖包等,全部选择完毕后,就可以自动生成对应的项目结构。
在使用Spring Boot进行单体应用开发时会采用Spring Initializr创建Spring Boot项目结构,通过前面的描述,可以将其理解为是一个工具,可以构建Spring Boot项目结构,并且当使用Spring Initializr构建时可以选择Spring Boot的版本,同时还可以选择构建的项目是基于Maven或者Gradle。
2.Spring Initializr的常用用法
主要有三种方式:通过Web界面使用、通过集成开发工具如IntelliJ IDEA使用以及通过Spring Boot CLI使用。这三种方式中的通过Web界面及集成开发工具使用都由可视化界面来操作,而通过Spring Boot CLI使用更适合与习惯命令行操作的开发人员,不过通过Web界面使用以及通过Spring Boot CLI使用还需要将生成的项目再导入集成开发工具中。
关于项目的分层设计,采用常见的符合高内聚、低耦合思想的三层架构,将项目分为控制层、业务逻辑层和持久层。
相关文章:
云原生构建 微服务、容器化与容器编排
第1章 何为云原生,云原生为何而生 SOA也就是面向服务的架构 软件架构的发展主要经历了集中式架构、分布式架构以及云原生架构这几代架构的发展。 微服务架构,其实是SOA的另外一种实现方式,属于SOA的子集。 在微服务架构下,系统…...
JavaSE——面向对象高级一(2/4)-饿汉式单例、懒汉式单例、代码块、static的注意事项
目录 static的注意事项 static相关:代码块 单例设计模式 饿汉式单例 懒汉式单例 static的注意事项 类方法中可以直接访问类的成员,不可以直接访问实例成员。 public class Student{//定义一个类变量和一个实例变量static String schoolName;int s…...
排序之冒泡排序
通过连续地比较与交换相邻元素实现排序。这个过程就像气泡从底部升到顶部一样,因此得名冒泡排序。 流程: 首先,对 n 个元素执行“冒泡”,将数组的最大元素交换至正确位置。接下来,对剩余 n−1 个元素执行“冒泡”&…...
【NR技术】 3GPP支持无人机服务的关键性能指标
1 性能指标概述 5G系统传输的数据包括安装在无人机上的硬件设备(如摄像头)收集的数据,例如图片、视频和文件。也可以传输一些软件计算或统计数据,例如无人机管理数据。5G系统传输的业务控制数据可基于应用触发,如无人机上设备的开关、旋转、升…...
Day29:安全开发-JS应用DOM树加密编码库断点调试逆向分析元素属性操作
目录 JS原生开发-DOM树-用户交互 JS导入库开发-编码加密-逆向调试 思维导图 JS知识点: 功能:登录验证,文件操作,SQL操作,云应用接入,框架开发,打包器使用等 技术:原生开发&#x…...
Python爬虫——scrapy-4
目录 免责声明 目标 过程 先修改配置文件 再修改pipelines.py 最后的结果是这样的 read.py pipelines.py items.py settings.py scrapy日志信息以及日志级别 settings.py文件设置 用百度实验一下 指定日志级别 WARNING 日志文件 注意 scrapy的post请求 简介 …...
美团春招编程第一场第三题
美团春招编程第一场第三题 题目 解答 思路-暴力解法 pair中存储从原点到包含当前元素的0,1数量,得到二维数组mat; 从头到尾遍历尺寸为i*i的矩形,计算完美矩形数量 #include <iostream> #include <vector> using namespace std;int main()…...
BulingBuling - 《金钱心理学》 [ The Psychology of Money ]
金钱心理学 摩根-豪泽尔 关于财富、贪婪和幸福的永恒课程 The Psychology of Money Morgan Housel Timeless Lessons on Wealth, Greed, and Happiness 内容简介 [ 心理学 ] [ 金钱与投资 ] Whats it about? [ Psychology ] [ Money & Investments ] 《金钱心理学》&…...
急速建立网站方法
急速建立网站方法 WordPress: 简介: WordPress是一种广泛用于建设博客、网站的免费开源内容管理系统(CMS)。它具有友好的用户界面和丰富的插件生态系统,使得用户可以轻松创建和管理网站。特点: 主题和插件支…...
Java EE之wait和notify
一.多线程的执行顺序 由于多个线程执行是抢占式执行,就会导致顺序不同,同时就会导致出现问题,就比如俩个线程同时对同一个变量进行修改,我们难以预知执行顺序。 但在实际开发中,我们希望代码按一定的逻辑顺序执行&am…...
PostgreSQL中In, Exists在SQL查询中到底有无区别
前言 SQL查询当中,In和Exists子查询到底有无区别?记得很多年以前,确实是有相关的使用戒条的,或者说存在一些使用的惯用法。试图完全抹开两者的区别,就有点过了。 两者的主要区别: 从目的上讲,…...
Netty Review - 探究Netty服务端主程序无异常退出的背后机制
文章目录 概述故障场景尝试改进问题分析铺垫: Daemon线程Netty服务端启动源码分析逻辑分析 如何避免Netty服务端意外退出最佳实践 概述 在使用Netty进行服务端程序开发时,初学者可能会遇到各种问题,其中之一就是服务端意外退出的问题。这种问…...
【兔子机器人】修改GO电机id(软件方法、硬件方法)
一、硬件方法 利用上位机直接修改GO电机的id号: 打开调试助手,点击“调试”,查询电机,修改id号,即可。 但先将四个GO电机连接线拔掉,不然会将连接的电机一并修改。 利用24V电源给GO电机供电。 二、软件方…...
Spring MVC | Spring MVC 的“核心类” 和 “注解”
目录: Spring MVC 的“核心类” 和 “注解” :1.DispatcherServlet (前端控制器)2.Controller 注解3.RequestMapping 注解3.1 RequestMapping 注解的 “使用”标注在 “方法” 上标注在 “类” 上 3.2 RequestMapping 注解的 “属性” 4.组合注解4.1 请求处理方法的…...
Python 创建PPT
本篇为如何使用Python来创建ppt文件。 创建PPT 安装必要的库 命令如下: pip install python-pptx 安装过程: 创建ppt文件 在当前目录下创建一个test的ppt文件。其中包含两页,分别使用了不同的布局。 第一页设置了标题和内容。第二页只设…...
【工具】Git的24种常用命令
相关链接 传送门:>>>【工具】Git的介绍与安装<< 1.Git配置邮箱和用户 第一次使用Git软件,需要告诉Git软件你的名称和邮箱,否则无法将文件纳入到版本库中进行版本管理。 原因:多人协作时,不同的用户可…...
rabbitmq 基本总结
rabbitmq 的基本概念 vhost、broker、producer、 consumer、 exchange、 queue、 routing key rabbitmq 常用的队列类型,工作队列(简单队列),pub/sub, routing key, topic 模式 <dependency><groupId>com.rabbitmq&l…...
7、Copmose自定义颜色和主题切换
Copmose自定义颜色和主题切换 一起颜色的设置的都是在res/values/colors里面去做颜色, 但是当使用compose的时候,抛弃了使用了ui.theme底下的Color.kt和Theme.kt 但是默认使用的是MaterialTheme主题,里面的颜色字段不能定义,因此…...
js-判断变量是否定义
if (typeof myVar undefined) {// myVar (未定义) 或 (已定义但未初始化) } else {// myVar (已定义和已初始化) } 参考 https://www.cnblogs.com/redFeather/p/17662966.html...
视频远程监控平台EasyCVR集成后播放只有一帧画面的原因排查与解决
智慧安防视频监控平台EasyCVR能在复杂的网络环境中(专网、局域网、广域网、VPN、公网等)将前端海量的设备进行统一集中接入与视频汇聚管理,平台可支持的接入协议包括:国标GB28181、RTSP/Onvif、RTMP,以及厂家的私有协议…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
js 设置3秒后执行
如何在JavaScript中延迟3秒执行操作 在JavaScript中,要设置一个操作在指定延迟后(例如3秒)执行,可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法,它接受两个参数: 要执行的函数&…...
