系统综合实践第一次实践作业
一、课程调查
一开始以为和这学期学的系统结构相对应,要去实验室做硬件实验。了解课程的内容后,觉得这门课应该是综合度很高的,估计需要花费不少的时间来进行学习。希望自己能够利用这门课,多掌握一些技能吧。
二、了解微服务
1.什么是微服务?
微服务,又称微服务架构,这种架构聚焦业务领域,将单一应用程序划分成一组小的服务。在微服务架构中,每一个服务都是自包含的且唯一实现某个单一业务功能。一个微服务的策略可以让工作变得更为简便,它可扩展单个组件而不是整个的应用程序堆栈,从而满足服务等级协议。
2.特点
- 微服务每个模块都可以使用不同的存储方式(比如有的用redis,有的用mysql等),数据库也是单个模块对应自己的数据库。
- 微服务每个模块都可以使用不同的开发技术,开发模式更灵活。
- 微服务本身与具体技术实现无关,扩展性强。一个微服务的系统中,可以有 Java 编写的服务,也可以有 Python编写的服务,
- 每个微服务可独立运行在自己的进程里;
- 一系列独立运行的微服务共同构建起了整个系统;
- 每个服务为独立的业务开发,一个微服务一般完成某个特定的功能,比如:订单管理,用户管理等;
- 微服务之间通过一些轻量级的通信机制进行通信,例如通过REST API或者RPC的方式进行调用。
2.3 优点
- 解决复杂问题。把单个庞大的单体服务拆解成一套微小服务,把一个复杂问题拆分成一个一个的简单问题。单个服务之间通过PRC或者http api进行调用通讯,个体服务更容易开发理解和维护。
- 每个微服务都可以由一个团队独立专注开发。开发者可以自由选择任何符合服务API契约的技术。这种自由意味着开发人员可以选择他们更熟悉/喜欢的技术。由于服务较小,使用适合的技术重新旧服务将变的更加可行。
- 每个微服务可以独立部署。系统变更已经测试即可立即部署,让持续部署成为可能。
- 每个微服务能够独立扩展。可以部署满足每个服务容量和可用性约束的实例数目。
2.4 缺点
- 运维要求较高
对于单体架构来讲,我们只需要维护好这一个项目就可以了,但是对于微服务架构来讲,由于项目是由多个微服务构成的,每个模块出现问题都会造成整个项目运行出现异常,想要知道是哪个模块造成的问题往往是不容易的,因为我们无法一步一步通过debug的方式来跟踪。 - 分布式的复杂性
对于单体架构,我们可以不使用分布式,但是对于微服务架构来说,分布式几乎是必会用的技术,由于分布式本身的复杂性,导致微服务架构也变得复杂起来。 - 接口调整成本高
比如,用户微服务是要被订单微服务和电影微服务所调用的,一旦用户微服务的接口发生大的变动,那么所有依赖它的微服务都要做相应的调整,由于微服务可能非常多,那么调整接口所造成的成本将会明显提高。 - 对于单体架构来讲,如果某段业务被多个模块所共同使用,我们便可以抽象成一个工具类,被所有模块直接调用,但是微服务却无法这样做,因为这个微服务的工具类是不能被其它微服务所直接调用的,从而我们便不得不在每个微服务上都建这么一个工具类,从而导致代码的重复。
2.5 部署
- 单主机多服务实例模式
这种部署是比较传统的方式。资源使用率相对较高。多个服务实例共享服务器及其操作系统,部署服务实例相对较快,但是服务之间很少或者没有隔离。一个行为不当的服务实例可能会占用掉主机的所有内存或CPU。部署服务的运维团队必须了解执行此操作的具体细节。这种复杂加大了部署过程中的错误风险。 - 单容器单服务实例
这种方式将每个服务打包成一个虚拟机(VM)镜像。每个服务实例都是一个使用该VM镜像启动的VM。每个服务实例是完全隔离的,可以利用成熟的云基础架构,包括负载均衡和自动扩展。部署更加简单/可靠,但资源利用率较低。 - 单虚拟机单服务实例
每个服务实例都在自己的容器中运行。每个服务打包成容器镜像,通常每个物理主机上运行多个容器。部署简单,不需要了解服务技术细节,主要掌握容器管理API即可。能够快速构建,容器是轻量级技术,可以非常快速的构建。容器启动页很快,因为没有繁琐的操作系统引导机制。
三、学习docker技术
1.docker
docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。简言之,就是可以在Linux上镜像使用的这么一个容器。
Docker技术有三大核心概念,分别是:
- 镜像(Image):相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):docker利用容器来运行应用,容器是从镜像创建的运行实例,它可以被启动,开始、停止、删除、每个容器都是互相隔离的,保证安全的平台,可以把容器看做是要给简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行再其中的应用程序)repostory仓库。
- 仓库(Repository):仓库可看成是一个代码控制中心,用来保存镜像。
2.docker compose
Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,我们可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。
3.Dockerfile
Dockerfile是一个Docker镜像的描述文件,其内部包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
4.docker machine
docker machine是一种可以在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机。
5.Swarm
提供Docker容器集群服务,是Docker官方对容器云生态镜像支持的核心方案。它是Docker公司推出的官方容器集群平台,基于Go语言实现,
6.k8s
k8s是一个编排容器的工具,其实也是管理应用的全生命周期的一个工具,从创建应用,应用的部署,应用提供服务,扩容缩容应用,应用更新,都非常的方便,而且可以做到故障自愈。
四、搭建docker环境及基本入门
1. Ubuntu Docker 安装
跟着 菜鸟教程 一步步来,整个安装过程还挺顺利的,没遇到什么问题。
测试 Docker 是否安装成功,输入指令$ sudo docker run hello-world
,打印出以下信息则安装成功。
2.容器的使用
(1)输出Hello world
$ docker run ubuntu:15.10 /bin/echo "Hello world"
各个参数解析:
- docker: Docker 的二进制执行文件。
- run: 与前面的 docker 组合来运行一个容器。
- ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
- /bin/echo "Hello world": 在启动的容器里执行的命令
- 以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。
(2)运行交互式的容器
我们通过 docker 的两个参数 -i -t,让 docker 运行的容器实现"对话"的能力:
$ docker run -i -t ubuntu:15.10 /bin/bash
各个参数解析:
- -t: 在新容器内指定一个伪终端或终端。
- -i: 允许你对容器内的标准输入 (STDIN) 进行交互。
我们尝试在容器中运行命令 cat /proc/version和ls分别查看当前系统的版本信息和当前目录下的文件列表
(3)启动容器(后台模式)
使用以下命令创建一个以进程方式运行的容器: $ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
在输出中,我们没有看到期望的 "hello world",而是一串长字符,即容器 ID,对每个容器来说容器 ID都是唯一的,我们可以通过容器 ID 来查看对应的容器发生了什么。
- 首先,我们需要确认容器有在运行,可以通过
docker ps
来查看:
- 在宿主主机内使用
docker logs
命令,查看容器内的标准输出(有两种方式,一种是容器ID,一种是容器名):
(4)停止容器
-
我们使用
docker stop
命令来停止容器:
-
通过
docker ps
查看,容器已经停止工作:
(5)进入容器
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
docker attach
或者 docker exec
。更推荐使用docker exec
命令,因为这种退出容器终端,不会导致容器的停止。
-
attach 命令
-
停止的容器可以通过
docker restart
重启:
-
以下演示了使用
docker exec
命令。
docker exec -it cf89e6309d94 /bin/bash
如果从这个容器退出,不会导致容器的停止,可通过指令docker ps
查看验证
(6)导出和导入容器
-
导出容器: 如果要导出本地某个容器,可以使用
docker export
命令。
$ docker export cf89e6309d94 > ubuntu.tar
导出容器 cf89e6309d94 快照到本地文件 ubuntu.tar。 -
导入容器快照
可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:
$ cat docker/ubuntu.tar | docker import - test/ubuntu:v1
(少了个图)
(7)删除容器:使用 docker rm
命令:
3.镜像仓库的使用
由于docker hub速度慢,我用的是阿里云的镜像仓库,按照阿其官方操作指南进行操作的。
- 获取阿里云镜像加速器。
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["加速器地址"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
-
从Docker Hub网站搜索镜像:
sudo docker search httpd
-
使用
docker pull
将上图的httpd官方版镜像下载到本地
先在阿里云里建一个私有仓库,再从docker登录阿里云
-
登录仓库:
-
从Registry中拉取镜像并查看是否成功
-
将镜像推送到Registry:
-
查看私有仓库下,当前的镜像版本:
可以看到,该镜像已经上传成功了。