第1次实践作业
(1)课程调查
- 对这门课的认识
- 综合实践便体现了这门课的价值所在,希望能够接触到当下常用的有关技术,打下实践的基础。
(2)了解微服务
-
微服务是什么?
- 微服务是一种用于构建应用的架构方案。微服务架构有别于更为传统的单体式方案,可将应用拆分成多个核心功能。每个功能都被称为一项服务,可以单独构建和部署,这意味着各项服务在工作(和出现故障)时不会相互影响。
-
微服务有什么特点?
- 单一职责:每个微服务都需要满足单一职责原则,微服务本身是内聚的,因此微服务通常比较小。
- 自治:一个微服务就是一个独立的实体,它可以独立部署、升级,服务与服务之间通过REST等形式的标准接口进行通信,并且一个微服务实例可以被替换成另一种实现,而对其它的微服务不产生影响。
- 低耦合性:符合面向对象设计高内聚低耦合特性。不同模块间依赖低,相互关联小(因为每个微服务设计的初衷是每个服务专注一个模块开发)。
- 去中心化治理:微服务架构倡导去中心化的服务管理和治理,尽量不设置中心化的管理服务,最差也需要在中心化的管理服务宕机时有替代方案和设计。在微服务架构下可以使用C++开发一个服务,来对接Java开发的另外一个服务,对于异构系统之间的交互标准,通常可以使用工具来补偿。
-
相较于传统的软件架构,它有什么优点?
- 易于开发和维护:一个微服务只关注一个特定的业务功能,所以它的业务清晰、代码量较少。开发和维护单个微服务相对比较简单,整个应用是由若干个微服务构建而成,所以整个应用也会维持在可控状态。
- 单个微服务启动较快:单个微服务代码量较少,所以启动会比较快。
- 局部修改容易部署:单体应用只要有修改,就要重新部署整个应用。而微服务解决了这样的问题。一般来说,对某个微服务进行修改,只需要重新部署这个服务即可。
- 技术栈不受限:在微服务中,我们可以结合项目业务及团队的特点,合理地选择技术栈。
-
相较于传统的软件架构,它有什么缺点?
- 运维成本过高:服务占用的进程数过多,要确保几十、甚至是几百个进程都处于运行状态、不能将磁盘空间耗尽、不能出现死锁,同时还要保证性能。
- 接口不匹配:服务依赖于彼此间的接口进行通信,改变一个服务的接口会对其他服务造成影响。不过当然也可以通过向后兼容的方式避免这些变化的发生,不过实际情况却是业务驱动的需求导致无法实现分阶段的发布。
- 分布式系统的复杂性:作为一种分布式系统,微服务引入了复杂性和其他若干问题,比如说“网络延迟、容错性、消息序列化、不可靠的网络、异步、版本化、应用层中的负载变化等等”。
-
微服务是怎样部署的?
-
以每个容器一个服务实例模式(Service Instance per Container)模式为例,每个服务实例都在其自己的容器中运行。容器是一个操作系统级虚拟化机制。一个容器是由一个或多个运行在沙箱中的进程组成。从进程的角度来看,它们有自己的端口命名空间和根文件系统。您可以限制容器的内存和 CPU 资源。一些容器实现也具有 I/O 速率限制。容器技术的相关例子有 Docker 和 Solaris Zones,该模式的结构如下:要使用此模式,请将您的服务打包成一个容器镜像。容器镜像是由运行服务所需的应用程序和库组成的文件系统镜像。一些容器镜像由完整的 Linux 根文件系统组成。此外它更加轻便。例如,要部署一个 Java 服务,您可以构建一个包含了 Java 运行时的容器镜像,可能是一个 Apache Tomcat 服务器和编译好的 Java 应用程序。
将服务打包成一个容器镜像后,您将启动一个或多个容器。通常在每个物理或虚拟主机上运行多个容器。您可以使用集群管理工具(如 Kubernetes 或 Marathon)来管理容器。集群管理工具将主机视为一个资源池。它根据容器所需的资源和每个主机上可用的资源来决定每个容器放置的位置。
-
(3)学习docker技术
①相关概念:
- 镜像(Image)——一个特殊的文件系统:Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。
- 容器(Container)——镜像运行时的实体:镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。前面讲过镜像使用的是分层存储,容器也是如此。
- 仓库(Repository)——集中存放镜像文件的地方:镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry就是这样的服务。
- Docker: 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
- Docker Compose: 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
- Dockerfile:是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
- Docker Machine:是一种可以让您在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机。
- Swarm 集群管理:是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。
- K8S:是基于容器的集群管理平台,全称是kubernetes,由Google创造
②搭建基本docker环境
镜像相关:
-
拉取镜像
首先可利用
docker search <IMAGENAME>
来查找Docker Hub上的相关镜像再利用
docker pull IMAGENAME
实现拉取镜像,不指定版本默认拉取最新版latest -
镜像的删除
使用如下命令查询本地的镜像
docker image ls
利用IMAGEID(前几位)来删除该镜像,删除前需要确保该镜像内没有容器
docker image rm <IMAGEID>
-
创建自己的镜像仓库并上传和拉取镜像
①在Docker Hub中注册账号,使用
docker login
即可登录自己的Docker账号②标记镜像的tag值为 username/imgname
docker tag ubuntu mmahaha/ubuntu
③使用
docker push <imgname>
上传到对应的镜像仓库完成后即可在Docker Hub上找到该镜像
之后就可使用
docker pull <username/imgname>
拉取仓库中的镜像
容器相关:
-
创建并启动一个容器
docker run -it 'imgname' 'command'
如以shell命令方式启动容器
-
查询容器信息
docker ps -a
即可查看各个容器的信息 -
容器的删除
docker rm -f <CONTAINERID>
即可删除指定容器 -
容器的更新
停止容器:
docker stop <CONTAINER>
删除容器:
docker rm <CONTAINER>
更新镜像:
docker pull <IMAGE>
启动新的容器:
docker run <ARG> ... <IMAGE>