系统综合实践第一次实践作业

一、课程调查

一开始以为和这学期学的系统结构相对应,要去实验室做硬件实验。了解课程的内容后,觉得这门课应该是综合度很高的,估计需要花费不少的时间来进行学习。希望自己能够利用这门课,多掌握一些技能吧。

二、了解微服务

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:

  • 查看私有仓库下,当前的镜像版本:

    可以看到,该镜像已经上传成功了。

posted @ 2020-04-11 09:09  两三  阅读(295)  评论(0编辑  收藏  举报