云
云原生
Cloud表示应用程序位于云中,而不是传统的数据中心;Native表示应用程序从设计之初即考虑到云的环境,原生为云而设计。
云原生是在云计算环境中构建、部署和管理现代应用程序的软件方法。云原生技术支持快速、频繁地更改应用程序,而不会影响服务交付,可以充分利用和发挥云平台的弹性+分布式优势。
云基础设施
公有云:通过互联网使用服务,有可扩展性和灵活性
私有云:使用本地服务器构建,处理敏感数据
混合云:公有云和私有云的组合
云架构
公认的云架构划分为IaaS、Paas、SaaS三种服务模式即基础设施层、平台层和软件服务层。
SaaS: Software-as-a-Service(软件即服务):应用层
这层的作用是将应用作为服务提供给客户。通过这种模式,用户只要接上网络,并通过浏览器,就能直接使用在云端上运行的应用,而不需要顾虑类似安装等琐事,并且免去初期高昂的软硬件投入。SaaS主要面对的是普通的用户。它消除了企业购买、构建和维护基础设施和应用程序的需要。对于许多小型企业来说,SaaS是采用先进技术的最好途径。
PaaS: Platform-as-a-Service(平台即服务):组件服务(比如数据库,操作系统,redis等等)
这层的作用是将开发平台作为服务提供给用户,主要的用户是开发人员。用户可以在一个包括SDK,文档和测试环境等在内的开发平台上非常方便地编写应用,而且不论是在部署,或者在运行的时候,用户都无需为服务器,操作系统,网络和存储等资源的管理操心,这些繁琐的工作都由PaaS供应商负责处理,而且PaaS在整合率上面非常惊人,比如一台运行 Google App Engine的服务器能够支撑成千上万的应用,也就是说,PaaS是非常经济的。
IaaS: Infrastructure-as-a-Service(基础设施即服务):硬件资源服务(cpu,内存,存储,网络等等)
这层的作用是提供虚拟机或者其他资源作为服务提供给用户。主要的用户是系统管理员。通过 Internet 可以从完善的计算机基础设施获得服务。基于 Internet 的服务(如存储和数据库)是 IaaS的一部分。
三种模式之间的关系
它们之间的关系主要可以从两个角度进行分析:
其一是用户体验角度,从这个角度而言,它们之间关系是独立的,因为它们面对不同类型的用户。
其二是技术角度,从这个角度而言,它们并不是简单的继承关系(SaaS基于PaaS,而PaaS基于IaaS),因为首先SaaS可以是基于PaaS或者直接部署于IaaS之上,其次PaaS可以构建于IaaS之上,也可以直接构建在物理资源之上。
Docker
Docker
Docker 是一个开源的应用容器引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在本地编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。
Docker主要包含:
Docker守护进程 (Docker daemon,服务器):
负责Docker容器的构建、运行和管理。它运行在主机操作系统上,处理所有的容器操作,例如启动、停止、删除容器等。
Client(客户端):
作为用户与Docker守护进程交互的界面。用户通过输入Docker命令与客户端进行交互,客户端将这些命令转化为API请求发送给守护进程。
镜像 (Image):
即容器的模版,镜像是可以继承的,镜像主要通过Dockerfile 文件定义。
镜像仓库 (Registry):
类似git仓库, 只不过镜像仓库用于存储镜像和管理镜像的版本。
容器(Container):
容器是通过镜像创建的,所以说容器是一个镜像运行的实例,类似面向对象编程中类和对象的关系。
Docker相关概念:
镜像:一个特殊的文件系统
操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
镜像不包含任何动态数据,其内容在构建之后也不会被改变。
Docker 设计时,就充分利用 Union FS 的技术,将其设计为分层存储的架构。 镜像实际是由多层文件系统联合组成。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。
比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。
在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。
因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。容器:镜像运行时的实体
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。前面讲过镜像使用的是分层存储,容器也是如此。
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据 ,容器存储层要保持无状态化。
所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, 使用数据卷后,容器可以随意删除、重新 run,数据却不会丢失。仓库:集中存放镜像文件的地方
镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其他服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
所以说,镜像仓库是 Docker 用来集中存放镜像文件的地方,类似于我们之前常用的代码仓库。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。
我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
这里补充一下 Docker Registry 公开服务和私有 Docker Registry 的概念:
Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服务。
一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
最常使用的 Registry 公开服务是官方的 Docker Hub ,这也是默认的 Registry,并拥有大量的高质量的官方镜像,网址为:hub.docker.com/ 。
在国内访问 Docker Hub 可能会比较慢,国内也有一些云服务商提供类似于 Docker Hub 的公开服务。
除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry 。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。
开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 Docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。数据卷
卷就是目录或文件,存在于一个或多个容器中,由Docker挂载到容器,但卷不属于联合文件系统(Union FileSystem),因此能够绕过联合文件系统提供一些用于持续存储或共享数据的特性
位置:数据卷可以存储在主机的任何目录上,但通常会放在Docker管理的专用目录中,例如/var/lib/docker/volumes。
持久:数据卷与容器生命周期解耦,即使容器被删除,卷中的数据也会保留。数据卷可以存储数据库、配置文件、日志等重要数据。
共享:多个容器可以共享同一个数据卷,实现数据共享和持久化。
数据管理:因为数据卷存储在主机的硬盘上,它们会消耗主机的磁盘空间。Docker引擎
在不同操作系统上提供统一的接口,使得容器运行环境一致。镜像images与容器container的关系
Image(镜像,只读层的集合)
镜像是一堆只读层的统一视角,除了最底层没有指向外,每一层都指向它的父层。统一文件系统( Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在。在用户的角度看来,只存在一个文件系统。
Container(容器,一层读写层+多层只读层)
容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。容器的定义并没有提及是否要运行容器。
Running Container(运行态容器,一层读写层+多层只读层+隔离的进程空间和包含其中的进程)
运行状态的容器「Running Container」是由一个可读写的文件系统「静态容器」+ 隔离的进程空间和其中的进程构成的。正是文件系统隔离技术使得Docker成为了一个前途无量的技术。一个容器中的进程可能会对文件进行修改、删除、创建,这些改变都将作用于可读写层(read-write layer)。
把一个Java项目放到Docker容器中
1.准备java项目和build.gradle管理依赖
2.创建Dockerfile,里面包含Docker指令
3.构建Docker镜像
4.运行Docker容器,使用刚才构建的镜像启动一个容器
Vue
Vue.js是一套构建用户界面的渐进式框架。
Vue.js 是一个提供了 MVVM 风格双向数据绑定的 Javascript 库(无依赖别的js库,直接引入一个js文件就可以使用,跟jquery差不多),专注于View 层。它的核心是 MVVM 中的 VM,也就是 ViewModel。 ViewModel负责连接 View 和 Model,保证视图和数据的一致性,这种轻量级的架构让前端开发更加高效、便捷。
Vue.js让编写页面变得更加简便,通过数据绑定、指令、组件等功能,使开发者能够更高效地构建互动性强、数据驱动的用户界面。
渐进式的意思是可以从简单的库开始使用,然后逐步引入更多的功能。比如可以先用Vue.js处理一些基本的DOM操作,然后再引入Vue Router来处理单页应用的路由,或者使用Vuex来管理复杂的状态。这个灵活性使得Vue.js适合从小型项目到大型复杂应用的各种开发需求。
例:创建一个简单的待办事项(To-Do List)应用
效果:
index.html创建页面样式
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Vue.js To-Do List</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
</head>
<body>
<div id="app">
<h1>{{ message }}</h1>
<ul>
<li v-for="item in items">{{ item }}</li>
</ul>
<!--v-for用于循环渲染列表,@click用于绑定点击事件,v-model用于绑定输入值。-->
<input type="text" v-model="newItem" placeholder="Add a new item">
<button @click="addItem">Add</button>
</div>
<script src="main.js"></script>
</body>
</html>
main.js构建一个vue实例
new Vue({
el: '#app', //绑定到#app元素
data: { //绑定data对象中的message、items和newItem元素
message: 'Vue.js To-Do List',
items: ['Learn Vue', 'Build something awesome'],
newItem: ''
},
methods: { //methods对象中的addItem方法绑定到按钮的click事件,通过v-model实现双向数据绑定。
addItem() {
if (this.newItem.trim() !== '') {
this.items.push(this.newItem);
this.newItem = '';
}
}
}
});
框架和库的区别
库(插件):是一种封装好的特定方法集合,对项目的侵入性较小,提供给开发者使用,控制权在使用者手中,如果某个库无法完成某些需求,可以很容易切换到其它库实现需求。
框架:是一套架构,会基于自身特点向用户提供一套相当完整的解决方案,而且控制权在框架本身;对项目的侵入性较大,使用者要按照框架所规定的某种特定规范进行开发,项目如果需要更换框架,则需要重新架构整个项目。
SpringBoot
Spring Boot是基于Spring框架的一款开源Java框架,它简化了Spring应用的开发,减少了配置工作,提供了一整套开发生产级别Spring应用的方法。
Spring为企业级开发提供了丰富的功能,这些功能的底层都依赖于它的两个核心特性,也就是依赖注入(dependency injection,DI)和面向切面编程(aspect-oriented programming, AOP)
依赖注入:通过依赖注入来降低组件间的耦合度,提升可测试性和可维护性。
//通过构造函数注入,将SmsService的实现注入到NotificationService中
@Autowired //声明依赖注入,Spring容器会自动提供需要的依赖
public NotificationService(SmsService smsService) {
this.smsService = smsService;
}
//不使用依赖注入
public NotificationService() {
this.smsService = new SmsServiceImpl(); // 手动创建依赖
}
面向切面编程:提供了AOP功能,方便实现横切关注点,如事务管理、日志记录、安全性等。