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

(一)课程调查

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

上学期软工老师说过这学期是上学期课程的延续,当时以为是跟软工一样要做个软件的大作业。听到老师说要用树莓派的时候感觉挺新奇的,希望这学期也能得到很多实践方面的锻炼,大家一起秃头o( ̄▽ ̄)d


(二)了解微服务

第一次作业我们将接触一种新型的软件架构——微服务(也许部分同学已经有所了解)。大家要做的是学习并了解该技术,

微服务是什么?有什么特点?

  • 是什么?
    微服务是用一组小服务的方式来构建一个应用,服务独立运行在不同的进程中,服务之间通过轻量的通讯机制(如RESTful接口)来交互,并且服务可以通过自动化部署方式独立部署。正因为微服务架构中,服务之间是相互独立的,所以不同的服务可以使用不同的语言来开发,或者根据业务的需求使用不同类型的数据库。
  • 特点
    • 单一职责的。 一个微服务应该都是单一职责的,一个微服务解决一个业务问题。
    • 面向服务的。 将自己的业务能力封装并对外提供服务,这是继承SOA的核心思想,一个微服务本身也可能使用到其它微服务的能力

相较于传统的软件架构,它有什么优缺点?

  • 微服务架构
    微服务架构,核心是为了解决应用微服务化之后的服务治理问题
    • 服务注册中心:所有服务都注册到服务注册中心,同时也可以从服务注册中心获取当前可用的服务清单
    • 配置中心:集中式管理每一个服务的配置文件
    • 服务网关:服务网关提供统一的服务入口,客户端或外部应用通过服务网关调用服务。
  • 优点:
    • 1.服务简单,只关注一个业务功能
      传统架构:在构建部署和扩展伸缩方面有很大的局限性,其服务端应用就像是一块铁板,笨重且不可拆分,系统中任何程序的改变都需要整个应用重新构建和部署新版本。在进行水平扩展时也只能整个系统扩展,而不能针对某一个功能模块进行扩展。
      微服务架构:将系统以组件化的方式分解为多个服务,服务之间相对独立且松耦合,单一功能的改变只需要重新构建部署相应的服务即可。
    • 2.每个微服务可由不同团队开发
      传统的开发模式在分工时往往以技术为单位,比如UI团队、服务端团队和数据库团队,这样的分工可能会导致任何功能上的改变都需要跨团队沟通和协调。而微服务则倡导围绕服务来分工,不同的服务可以采用不同的技术来实现,一个团队中应该包含开发所需的所有技能,比如用户体验、数据库、项目管理。
    • 3.微服务是松散耦合的
      微服务架构抛弃了ESB复杂的业务规则编排、消息路由等功能,微服务架构中服务是高内聚的,每个服务都会处理相应的业务,所有的业务逻辑应该尽量在服务内部处理,且服务间的通信尽可能的轻量化。
    • 4.可用不同的编程语言与工具开发
      传统的软件开发中经常会使用同一个技术平台来解决所有的问题。
      而经验表明使用合适的工具做合适的事情会让开发变得事半功倍。微服务架构的引入为多样化持久保存数据提供可能,持久层可以使用传统关系数据库和NoSQL。不同于传统的应用,微服务架构中,我们可以为每个服务选择一个新的适合业务逻辑的数据库系统,比如MongoDB、PostgreSQL。这样做的好处是显而易见的,首先我们可以根据业务类型(读多还是写多等)来决定使用哪种类型的数据库,其次这样可以减小单个数据库的负载。
  • 缺点:
    • 1.运维开销大
      更多的服务也就意味着更多的运维,产品团队需要保证所有的相关服务都有完善的监控等基础设施,传统的架构开发者只需要保证一个应用正常运行,而现在却需要保证几十甚至上百道工序高效运转,这是一个艰巨的任务。
    • 2.隐式接口
      服务和服务之间通过接口来“联系”,当某一个服务更改接口格式时,可能涉及到此接口的所有服务都需要做调整。
    • 3.重复劳动
      在很多服务中可能都会使用到同一个功能,而这一功能点没有足够大到提供一个服务的程度,这个时候可能不同的服务团队都会单独开发这一功能,重复的业务逻辑,这违背了良好的软件工程中的很多原则。
    • 4.分布式系统的复杂性
      微服务通过REST API或消息来将不同的服务联系起来,这在之前可能只是一个简单的远程过程调用。分布式系统也就意味着开发者需要考虑网络延迟、容错、消息序列化、不可靠的网络、异步、版本控制、负载等,而面对如此多的微服务都需要分布式时,整个产品需要有一整套完整的机制来保证各个服务可以正常运转。
    • 5.事务、异步、测试面临挑战
      跨进程之间的事务、大量的异步处理、多个微服务之间的整体测试都需要有一整套的解决方案,而现在看起来,这些技术并没有成熟。
    • DevOps要求
      使用微服务架构后,开发团队需要保证一个Tomcat集群可用,保证一个数据库可用,这就意味着团队需要高品质的DevOps和自动化技术。而现在,这样的全栈式人才很少。

参考资料:微服务入门这一篇就够了
微服务,让开发过程更简单还是更复杂?


(三)学习docker技术

(1)概念了解

学习了解docker的相关概念(容器、镜像等),了解以下概念,是什么,是做什么用的

  • docker
    Docker 是一个开源的应用容器引擎。
    Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

    Docker 包括三个基本概念:

    • 镜像(Image):
      Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
    • 容器(Container):
      镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
    • 仓库(Repository):
      仓库可看作为一个代码控制中心,用来保存镜像。
  • docker compose
    Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

  • Dockerfile
    Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

  • docker machine

    • Docker Machine 是一种可以在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机。使用 docker-machine 命令,您可以启动,检查,停止和重新启动托管主机,也可以升级 Docker 客户端和守护程序,以及配置 Docker 客户端与您的主机进行通信。
    • Docker Machine 也可以集中管理所有的 docker 主机
  • Swarm
      Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。

  • k8s
    是Google开源的容器集群管理系统(谷歌内部:Borg)。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。

(2)环境搭建及基本入门操作

搭建你自己的docker环境,,完成docker的基本入门,包括但不限于:容器的创建、删除、更新和查询,创建并维护自己的镜像仓库,实现拉取和上传镜像等。

1.搭建docker环境

我是用在centos上搭建的,参考的是官网菜鸟教程

  • ①首先卸载docker旧版本及相关依赖
$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
  • ②安装Docker Engine-Community
    在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库
    $ sudo yum install -y yum-utils \
      device-mapper-persistent-data \
      lvm2

安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。

设置稳定的仓库

  $ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

这两条是官网上比菜鸟教程上多的,我是设置后才能进行后面的操作

$ sudo yum-config-manager --enable docker-ce-nightly
$ sudo yum-config-manager --enable docker-ce-test

安装最新版本的 Docker Engine-Community 和 containerd

$ sudo yum install docker-ce docker-ce-cli containerd.io
 启动Docker,通过运行 hello-world 映像来验证是否正确安装了 Docker Engine-Community 。
 $ sudo systemctl start docker
 $ sudo docker run hello-world

2.容器的创建

  • ①拉取CentOS 镜像
    建议先使用阿里爸爸的加速器,要不然后面拉取镜像已经不是慢的问题了,是根本拉取不下来啊!!!

设置完加速器要重启docker

$sudo systemctl daemon-reload
$sudo systemctl restart docker
$sudo docker pull centos 

使用images指令查看是否已经拉取成功,下图可以看到之前的hello-world和刚刚拉取的centos

$sudo docker images
  • ②启动容器
    使用 centos 镜像启动一个容器,参数为以命令行模式进入该容器(其中参数-i: 交互式操作;参数-t: 终端。):
$sudo docker run -it centos /bin/bash
  • ③exit命令退出终端

3.容器的删除、更新、查询

  • 容器的查询
    $ sudo docker ps -a
  • 容器的删除
$ docker rm -f 容器ID

再次查询可以看到删除的容器已经不见

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

  • 登录docker hub
    这里需要docker账号,可以去官网先注册
$ sudo docker login
  • 在docker hub创建仓库

5.拉取及上传镜像

  • 拉取镜像
    以上容器的创建已经包含
  • 上传镜像
    为本地image注明用户名及版本,其中username、repository都根据之前在docker hub上创建的仓库设置
docker image tag [imageName] [username]/[repository]:[tag]

发布image文件

docker image push [username]/[repository]:[tag]

上传成功

posted @ 2020-04-14 19:43  叶叶叶子  阅读(241)  评论(0编辑  收藏  举报