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


    一、课程调查

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

    二、了解微服务

    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:

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

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

  • 相关阅读:
    GridView绑定模板格式化日期总结
    统计静态页点击量
    行业网seo诊断
    查看sql执行效率
    ItemCommandVSItemDataBound
    【转帖】我眼中的flash和silverlight
    修改SQLserver数据库中的a表的一列等于b表的一列
    过河卒
    最长公共子序列LCS
    情感日记:在中国地质大学的日子
  • 原文地址:https://www.cnblogs.com/zys99/p/12677720.html
Copyright © 2020-2023  润新知