Fork me on GitHub

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

1.课程调查

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

最初看到课程名称感觉这门课应该比较硬件,以为是要在实验箱上操作的那种...结果看到是关于微服务的,使用的又是熟悉的博客园班级,预计是一个工作量比较大的学科。希望经过这门课程的学习对docker、树莓派有较为清晰的认识,学会基本的使用吧。


2.了解微服务

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

2.1 微服务是什么

百度百科:微服务是一个新兴的软件架构,就是把一个大型的单个应用程序和服务拆分为数十个的支持微服务。一个微服务的策略可以让工作变得更为简便,它可扩展单个组件而不是整个的应用程序堆栈,从而满足服务等级协议。
Wikipedia:微服务是由单一应用程序构成的小服务,拥有自己的进程与轻量化处理,服务依业务功能设计,以全自动的方式部署,与其他服务使用HTTP API通讯。同时,服务会使用最小规模的集中管理 (例如 Docker)技术,服务可以用不同的编程语言与数据库等。

2.2 特点

  • 按照业务来划分服务,单个服务代码量小,业务单一,易于维护。
  • 每个微服务都有自己独立的基本组件,例如数据库、缓存等,且运行在独立的进程中。
  • 微服务之间的通信是通过HTTP协议或者消息组件,且具有容错能力。
  • 微服务有一套服务治理的解决方案,服务之间不耦合,可以随时加入和剔除服务。
  • 单个微服务能够集群化部署,并且有负载均衡的能力
  • 整个微服务系统应该有一个完整的安全机制,包括用户验证、权限验证、资源保护等。
  • 整个微服务系统有链路追踪的能力。
  • 有一套完整的实时日志系统。

2.3 优缺点

优点

  • 它们往往比传统的应用程序更有效地利用计算资源。
    这是因为它们通过扩展组件来处理功能瓶颈问题。这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个完整的应用程序的全新迭代。最终的结果是有更多的资源可以提供给其它任务。
  • 它们更快且更容易更新。
    当开发者对一个传统的单体应用程序进行变更时,他们必须做详细的QA测试,以确保变更不会影响其他特性或功能。但有了微服务,开发者可以更新应用程序的单个组件,而不会影响其他的部分。测试微服务应用程序仍然是必需的,但它更容易识别和隔离问题,从而加快开发速度并支持DevOps和持续应用程序开发。
  • 微服务架构有助于新兴的云服务,如事件驱动计算。
    类似AWS Lambda这样的功能让开发人员能够编写代码处于休眠状态,直到应用程序事件触发。事件处理时才需要使用计算资源,而企业只需要为每次事件,而不是固定数目的计算实例支付。
  • 每个微服务都很小,这样能聚焦一个指定的业务功能或业务需求。
  • 能够被小团队单独开发,这个小团队是2到5人的开发人员组成。
  • 微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的。
  • 能使用不同的语言开发。
  • 易于被一个开发人员理解,修改和维护,这样小团队能够更关注自己的工作成果。无需通过合作才能体现价值。
  • 允许利用融合最新技术。
  • 微服务只是业务逻辑的代码,不会和HTML,CSS 或其他界面组件混合。

缺点

  • 运维要求较高
    对于单体架构来说,我们只需要维护好这一个项目就可以了,但是对于微服务架构,由于项目是由多个微服务构成的,每个模块出现问题都会造成整个项目运行出现异常,想要知道是哪个模块造成的问题往往是不容易的,因为我们无法一步一步通过debug的方式来跟踪。
  • 分布式的复杂性
    对于单体架构,我们可以不使用分布式,但是对于微服务架构来说,分布式几乎是必会用的技术,由于分布式本身的复杂性,导致微服务架构也变得复杂起来。
  • 接口调整成本高
    比如,用户微服务是要被订单微服务和电影微服务所调用的,一旦用户微服务的接口发生大的变动,那么所有依赖它的微服务都要做相应的调整,由于微服务可能非常多,那么调整接口所造成的成本将会明显提高。
  • 重复劳动
    对于单体架构来讲,如果某段业务被多个模块所共同使用,我们便可以抽象成一个工具类,被所有模块直接调用,但是微服务却无法这样做,因为这个微服务的工具类是不能被其它微服务所直接调用的,从而我们便不得不在每个微服务上都建这么一个工具类,从而导致代码的重复。
  • 当服务数量增加,管理复杂性增加

2.4 如何部署

参考→《微服务设计》——部署


3.学习docker技术

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

学习了解docker的相关概念(容器、镜像等),了解docker、docker compose、Dockerfile、docker machine、Swarm、k8s是什么,是做什么用的,心中有概念即可;
搭建你自己的docker环境,系统环境不限(主流的有Ubuntu/CentOS/Debian/Windows/MacOS等),完成docker的基本入门,包括但不限于:容器的创建、删除、更新和查询,创建并维护自己的镜像仓库,实现拉取和上传镜像等。
docker仓库链接:docker hub
参考资料:Docker Documentation;Docker教程 | 菜鸟教程


4.博客记录

4.1 了解相关概念

  • 镜像
    Docker镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器
    镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • Docker
    Docker 是一个用于开发,交付和运行应用程序的开放平台,它使应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,可以与管理应用程序相同的方式来管理基础架构。Docker是一个开源的应用容器引擎,基于Go语言,并遵从Apache2.0 协议开源,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
  • Docker Compose
    Compose是用于定义和运行多容器Docker应用程序的工具。通过 Compose,可以使用YML文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从YML文件配置中创建并启动所有服务。
  • Dockerfile
    Dockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
  • Docker Machine
    Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker(比如VirtualBox、 Digital Ocean、Microsoft),并可以使用docker-machine命令来管理主机;也可以集中管理所有的docker主机,比如快速的给100台服务器安装上docker。
  • Swarm
    Docker Swarm是Docker的集群管理工具。它将 Docker主机池转变为单个虚拟Docker主机。它提供了标准的 Docker API,所有任何已经与 Docker守护程序通信的工具都可以使用Swarm轻松扩展到多个主机。
  • k8s
    Kubernetes是Google 2014年创建管理的,是Google 10多年大规模容器管理技术Borg的开源版本。它是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。

4.2 搭建docker环境(CentOS)

  • 设置仓库
    安装所需的软件包。um-utils提供了yum-config-manager,并且device mapper 存储驱动程序需要device-mapper-persistent-data 和lvm2。
$ sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2







  • 使用以下命令来设置稳定的仓库
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
  • 安装Docker Engine-Community
$ sudo yum install docker-ce docker-ce-cli containerd.io
  • 启动Docker
$ sudo systemctl start docker
  • 通过运行 hello-world 映像来验证是否正确安装了Docker Engine-Community
$ sudo docker run hello-world

4.3 容器的创建、删除、更新和查询

  • 获取镜像
    e.g.使用docker pull命令来载入ubuntu镜像:
$ docker pull ubuntu
  • 启动容器
    以下命令使用ubuntu镜像启动一个容器,参数为以命令行模式进入该容器:
$ docker run -it ubuntu /bin/bash
参数说明:
-i: 交互式操作
-t: 终端
ubuntu: ubuntu 镜像
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式Shell,因此用的是/bin/bash
要退出终端,直接输入exit
  • 查询所有的容器
$ docker ps -a
  • 使用docker start启动一个已停止的容器
$ docker start 容器ID
  • 停止容器
$ docker stop 容器ID
  • 更新容器
$ docker container update --help
  • 删除容器
$ docker rm -f 容器ID
  • 列出镜像列表

4.4 创建并维护自己的镜像仓库

  • 登录和退出docker hub
    登录需要输入用户名和密码,登录成功后就可以从docker hub上拉取自己账号下的全部镜像。
$ docker login
$ docker logout

4.5 拉取和上传镜像

  • 拉取和上传
  • 上传成功
posted @ 2020-04-11 20:50  xbrucken  阅读(242)  评论(0编辑  收藏  举报