zoukankan      html  css  js  c++  java
  • 系统综合实践 第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]
    

    上传成功

  • 相关阅读:
    Python基础检测:20171105
    Python中斐波那契数列的四种写法
    Python中斐波那契数列的四种写法
    学习Python3:20171031
    学习Python3:20171031
    9.3 Trains and Evaluates the MNIST network using a feed dictionary
    9.3 Trains and Evaluates the MNIST network using a feed dictionary
    学习Python3:201701030
    学习Python3:201701030
    周末微光
  • 原文地址:https://www.cnblogs.com/-yyl/p/12700254.html
Copyright © 2011-2022 走看看