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

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


一、课程调查

进入大三下学期的后半段,大学阶段的理论课程应该已经修得八九不离十了,在这个时间点迎来系统综合实践这门课,作为培养计划的一门新课程,我们非常希望了解你们对于课程的希望,请写下你对这门课的认识和你理想中的这门课程是怎么样的。

  • 认识:系统综合实践,上学期选课的时候还以为是计算机系统结构的实践课,要组装电脑或者硬件实验(然而并不是😂)。后来栋哥最后几节软工课提到了微服务、微架构、docker(当时闻所未闻的东西👀),还说这学期还会有软工实践pro,没错就是这门课——综合前面几个学期所学的主要内容,通过实践与理论结合进一步拓展比较前沿的知识内容和实际操作。
  • 理想中的课程:对树莓派编程比较感兴趣,希望通过后续课程更深入学习了解一些有关树莓派的相关内容;能在学习的过程中体验到前所未有的乐趣。

二、了解微服务

第一次作业我们将接触一种新型的软件架构——微服务(也许部分同学已经有所了解)。大家要做的是学习并了解该技术,微服务是什么,有什么特点,相较于传统的软件架构,它有什么优缺点,它是怎样部署的。

(1)微服务是什么

微服务是一种软件开发技术,是面向服务的架构(SOA)结构风格的一种变体,将应用程序编排成一系列松耦合的服务。在微服务架构中,各个服务是细粒度的,协议是轻量级的。微服务架构将复杂臃肿的单体应用进行细粒度的服务化拆分,每个拆分出来的服务各自独立打包部署,并交由小团队进行开发和运维,从而极大地提高了应用交付的效率,并被各大互联网公司所普遍采用。

微服务架构就是将单一程序开发成一个微服务,每个微服务运行在自己的进程中,并使用轻量级的机制通信,如使用HTTP、REST或Thrift API来进行内部通信 。这些服务围绕业务能力来划分,并通过自动化部署机制来独立部署。这些服务可以使用不同的编程语言,不同数据库,以保证最低限度的集中式管理。

(2)微服务的特点

  • 按照业务来划分服务,单个服务代码量小,业务单一,易于维护。
  • 每个微服务都有自己独立的基本组件,例如数据库、缓存等,且运行在独立的进程中。
  • 微服务之间的通信是通过HTTP协议或者消息组件,且具有容错能力。
  • 针对特定服务发布,影响小,风险小,成本低
  • 单个微服务能够集群化部署,并且有负载均衡的能力
  • 整个微服务系统应该有一个完整的安全机制,包括用户验证、权限验证、资源保护等。
  • 整个微服务系统有链路追踪的能力。
  • 有一套完整的实时日志系统。

(3)传统软件架构

存在的问题:

  • 复杂性逐渐变高
  • 技术债务逐渐上升
  • 部署速度逐渐变慢
  • 阻碍技术创新
  • 无法按需伸缩

(4)微服务的优缺点

优点:

  • 将复杂的业务拆分成多个小的业务,每个业务拆分成一个服务,将复杂的问题简单化。利于分工,降低新人的学习成本。
  • 微服务系统是分布式系统,业务与业务之间完全解耦,随着业务的增加可以根据业务再拆分,具有极强的横向扩展能力。面对搞并发的场景可以将服务集群化部署,加强系统负载能力。
  • 服务间采用HTTP协议通信,服务与服务之间完全独立。每个服务可以根据业务场景选取合适的编程语言和数据库。
  • 微服务每个服务都是独立部署的,每个服务的修改和部署对其他服务没有影响。
  • 技术选型灵活,容错,可用性高

缺点:

  • 多服务运维难度,随着服务的增加,运维的压力也在增大
  • 服务间通信成本高
  • 数据一致性问题
  • 系统集成测试复杂
  • 性能监控
  • 开发人员要处理分布式系统的复杂性

(5)微服务怎样部署

微服务的目标就是为了能够快速响应产品迭代、快速发布运用而生的,所以微服务的部署频次会变得很高。

  • 更新代码
  • 根据源码构建项目,生成jar包
  • 上传jar包到对应的备份目录
  • 执行停止服务命令: systemctl stop service_name
  • 移动jar包到对应的启动目录
  • 执行启动服务命令: systemctl start service_name
  • 然后通过health check检查服务正确性
  • 启动成功之后,把相关代码在git上打一个tag,为了方便之后回滚

三、学习docker技术

docker作为微服务的一种十分典型的代表技术,我们要做的是:

(1)学习了解docker的相关概念(容器、镜像等),了解docker、docker compose、Dockerfile、

docker machine、Swarm、k8s是什么,是做什么用的,心中有概念即可;

  • Docker

    Docker是一个开源的应用容器引擎,基于Go语言并遵从 Apache2.0 协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

  • 镜像

    Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。

  • 容器

    镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

  • 仓库

    仓库可看着一个代码控制中心,用来保存镜像。

  • docker compose

    Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具

  • Dockerfile

    在Docker中创建镜像最常用的方式,就是使用Dockerfile。Dockerfile是一个Docker镜像的描述文件,我们可以理解成火箭发射的A、B、C、D…的步骤。Dockerfile其内部包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

  • Docker Machine

    Docker Machine是一个工具,它允许你在虚拟宿主机上安装Docker,并使用docker-machine命令管理这个宿主机,可以使用Docker Machine在本地的MAC或者windows box、公司网络,数据中心或者AWS这样的云提供商上创建docker。使用docker-machine命令,可以启动、审查、停止、重启托管的docker 也可以升级Docker客户端和守护程序并配置docker客户端和宿主机通信。Docker Machine 也可以集中管理所以得docker主机。

  • Swarm:

    Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,它是将一群Docker宿主机变成一个单一的虚拟主机,Swarm使用标准的Docker API接口作为其前端的访问入口,换言之,各种形式的Docker Client(compose,docker-py等)均可以直接与Swarm通信,甚至Docker本身都可以很容易的与Swarm集成,这大大方便了用户将原本基于单节点的系统移植到Swarm上,同时Swarm内置了对Docker网络插件的支持,用户也很容易的部署跨主机的容器集群服务。

  • k8s

    Kubernetes是Google 2014年创建管理的,是Google 10多年大规模容器管理技术Borg的开源版本。它是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。

(2)搭建你自己的docker环境,系统环境不限(主流的有Ubuntu/CentOS/Debian/Windows/MacOS

等),完成docker的基本入门,包括但不限于:容器的创建、删除、更新和查询,创建并维护自己的镜像

仓库,实现拉取和上传镜像等。

我使用的系统环境是ubuntu-16.04

卸载旧版本

Docker 的旧版本被称为 docker,docker.io 或 docker-engine 。如果已安装,请卸载它们:

$ sudo apt-get remove docker docker-engine docker.io containerd runc

使用 Docker 仓库进行安装

在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker 。

参考资料

测试 Docker 是否安装成功

$ sudo docker run hello-world

学习docker技术

容器的使用

<1>获取镜像

使用 docker pull 命令来载入 ubuntu 镜像

sudo docker pull ubuntu

<2>启动容器

使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器;

使用echo打出hello world
参数说明:
-i: 交互式操作。
-t: 终端。
ubuntu: ubuntu 镜像。
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
要退出终端,直接输入 exit:

sudo docker run -it ubuntu /bin/bash

<3>容器的查询

查看所有的容器命令如下:

sudo docker ps -a

<4>删除容器

sudo docker rm -f <容器ID>

<5>停止/启动容器

sudo docker start <容器 ID>
sudo docker stop <容器 ID>

<6>停止的容器进入交互式shell

都需要先重启容器,然后使用以下两种方式皆可

sudo docker start <容器ID>

sudo docker attach <容器ID>
或
sudo docker exec -it <容器ID> /bin/bash

<7>查看容器信息

sudo docker inspect <容器ID>

<8>容器更新信息

查看可选择的更新方式

docker container update --help

镜像的使用

<1>获取阿里云镜像加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": https://ob0p0ivk.mirror.aliyuncs.com
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

<2>列出镜像列表

查看本地镜像

sudo docker images

<3>从Docker Hub网站搜索镜像

sudo docker search httpd

<4>使用上图的httpd官方版镜像

sudo docker pull httpd

再次查看本地镜像

<5>删除镜像

删除httpd镜像,并查看镜像列表

docker rmi httpd

Docker Hub仓库管理

<1>登录

登录需要输入用户名和密码,登录成功后,就可以从Docker Hub上拉取账号下的全部镜像

docker login

<2>镜像到仓库

sudo docker tag ubuntu 1195755391/hello
sudo docker push 1195755391/hello

这时候登陆Docker Hub仓库可以发现镜像成功push到仓库

<3>从仓库获取镜像,并查看镜像列表

sudo docker pull 1195755391/hello

<4>最后注销登陆

sudo docker logout

(4)遇到的主要问题和解决方案

在实验过程中,我主要遇到了几个比较坑的问题。

①E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用) E: 无法对目录 /var/lib/apt/lists/ 加锁

解决方案

②Ubuntu中sudo apt-get update很慢解决办法,而且更新完后有部分软件无法更新

刚开始使用sudo apt-get update更新了十几分钟,换了网络还是很慢。
后来发现是软件源的问题,就把更新的服务器改成最佳服务器。
果然,速度快了很多。

解决方案1

解决方案2

③拉取镜像时下载速度过慢
更换阿里源的镜像,下载速度贼快
解决方案

(5)总结

通过这次实验,我学习了解了微服务和docker的相关概念,并学会了容器的创建、删除、更新和查询,创建并维护自己的镜像仓库,实现拉取和上传镜像等docker的基础操作,虽然过程中遇到了不少问题,但是在老师和搜索引擎的帮助下也都一一解决了。

参考资料:Docker DocumentationDocker教程 | 菜鸟教程

docker仓库链接:docker hub

posted @ 2020-04-18 00:09  Joker·D  阅读(230)  评论(0编辑  收藏  举报