第1次系统综合实践作业
一、课程调查
进入大三下学期的后半段,大学阶段的理论课程应该已经修得八九不离十了,在这个时间点迎来系统综合实践这门课,作为培养计划的一门新课程,我们非常希望了解你们对于课程的希望,请写下你对这门课的认识和你理想中的这门课程是怎么样的?
起初选课的时候看到这门课的课程名觉得应该是主要以硬件为主的一门课程,结合着一部分软件编码。但是接触了之后觉得好像不是这样的,不过也好,多学习一点前沿的知识,也不错。就是希望这门课可以相对轻松一点,不要再回到软工时期就好,另外这学期的实践课可谓是真的多,整个周末被安排的满满的,理想的是这门课不要占据太多的时间,毕竟才开始的第一个实验就耗费了我两天时间。
二、了解微服务
什么是微服务
微服务架构就是将单一程序开发成一个微服务,每个微服务运行在自己的进程中,并使用轻量级的机制通信,通常是HTTP RESTFUL API。这些服务围绕业务能力来划分,并通过自动化部署机制来独立部署。这些服务可以使用不同的编程语言,不同数据库,以保证最低限度的集中式管理。总的来说微服务就是将一个单体架构的应用按业务划分为一个个的独立运行的程序及服务,它们之间通过HTTP协议进行通信(也可以采用消息队列来通信,如RoocketMQ,Kafaka等),可以采用不同的编程语言,使用不同的存储技术,自动化部署减少人为控制,降低出错概率。五福数量越多,管理起来越复杂,因此采用集中化管理。
微服务的特点
微服务架构的主要特点是组件化、松耦合、自治、去中心化,体现在以下几个方面:用4个字描述就是小 独 轻 松
小:体现每个微服务力度要小,而每个服务是针对一个单一职责的业务能力的封装,专注做好一件事情。
独:独立部署运行和扩展。每个服务能够独立被部署并运行在一个进程内。这种运行
和部署方式能够赋予系统灵活的代码组织方式和发布节奏,使得快速交付和应对变化成为可能。
轻:系统相比较复杂单体应用更为简洁轻量化,每个微服务因为独立部署,可以使用不同跨语言编写,这样使得微服务架构更为灵活。
松:低耦合性,符合面向对象设计高内聚低耦合特性。不同模块间依赖低,相互关联小(因为每一个微服务设计的初衷是每个服务专注一个模块开发)。
相较于传统的软件架构,它有什么优缺点:
优点:
>每个服务足够内聚,足够小,代码容易理解、开发效率提高;
>服务之间可以独立部署,微服务架构让持续部署成为可能;
>每个服务可以各自进行负载均衡扩展和数据库扩展,而且每个服务可以根据自己的需要部署到合适的硬件服务器上
>容易扩大开发团队,可以针对每个服务组件开发团队
>提高容错性,一个服务的内存泄露并不会让整个系统瘫痪
>系统不会被长期限制在某个技术线上。
缺点:
>开发人员要处理分布式系统的复杂性
>开发人员要设计服务之间的通信机制,对于需要多个后端服务的user case,要在没有分布式事务的情况下实现代码非常困难
>涉及多个服务直接的自动化测试也具备相当的挑战性
>服务管理的复杂性,在生辰环境中要管理多个不同的的服务的实例,这意味着开发员对需要全局统筹(docker的出现适合解决这个问题)
微服务的部署
有四种模式:
-
单主机多服务实例模式
使用此模式,用户要提供一到多台物理或虚拟主机,在每个主机上运行多个服务实例。很多情况下,这是传统的应用部署方法。每个服务实例在一个或多个主机的已知端口上运行,主机通常被看做宠物。
-
单虚拟机单服务实例模式
使用单虚拟机单服务实例模式时,把每个服务大包围一个虚拟机镜像,类似 Amazon EC2 AMI。每个服务实例就是一台使用此镜像启动的虚拟机,譬如 EC2 实例。下图展示了此模式的结构。
-
单容器单服务实例模式
使用单容器单服务实例模式,每个服务实例运行在自有容器中。容器是操作系统级别的虚拟化机制。每个容器包含一个或多个运行在沙盒中的进程。从进程的角度看,它们有着自己的端口命名空间和根文件系统。用户能够限制容器的内存和 CPU 资源,有些容器还能限制 I/O 速率。容器技术的代表包括 Docker 和 Solaris Zone。
-
无服务器部署
AWS Lambda 就是无服务器部署的例子。它支持 Java、Node.js 和 Python 服务。要部署微服务,把服务打包为 ZIP 文件并上传到 AWS Lambda。用户也可以提供元数据,指定函数名称,后者被用于处理请求(即事件)。
学习docker技术
搭建docker环境
在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker 。
设置仓库
更新apt包索引
sudo apt-get update
安装 apt 依赖包,用于通过HTTPS来获取仓库:
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
设置稳定版仓库
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
安装Docker Engine Community
再次更新apt包索引
sudo apt-get update
安装最新版本的 Docker Engine-Community 和 containerd
sudo apt-get install docker-ce docker-ce-cli containerd.io
测试Docker是否安装成功
sudo docker run hello-world
容器的创建、查询、删除、更新
获取镜像
如果我们本地没有 ubuntu 镜像,我们可以使用 docker pull 命令来载入 ubuntu 镜像:
sudo docker pull ubuntu
启动容器
使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器:
sudo docker run -it ubuntu /bin/bash
参数说明:
- -i:交互式操作
- -t:终端
- ubuntu:ubuntu镜像
- /bin/bash:放在镜像名后的是命令
退出终端
exit
启动已停止运行的容器
先查看所有的容器:
sudo docker ps -a
启动一个已停止的容器
sudo docker start [容器ID]
再次查看所有容器验证是否被启动
后台运行
在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过-d
指定容器的运行模式:
sudo docker run -itd --name ubuntu-test ubuntu /bin/bash
注:加了-d
参数默认不会进入容器
停止一个容器
停止容器:
sudo docker stop [容器ID]
用docker start重启停止的容器:
sudo docker restart [容器ID]
进入容器
attach命令(从这个容器退出,会导致容器的停止):
sudo docker attach [容器ID]
exec命令(从这个容器的退出,不会导致容器的停止)
sudo docker exec [容器ID]
删除容器
使用docker rm命令删除某个容器:
sudo docker rm -f [容器ID]
更新容器配置
sudo docker update [OPTIONS] [container ID]
OPTIONS说明:
- --restart:当容器退出时重新启动的策略
- --memory-swap:交换空间,“-1”允许无限交换.
- --memory , -m:内存限制
在这里,我更新的是容器退出时重新启动的策略:
用容器输出
sudo docker run ubuntu /bin/echo "zlrong"
创建并维护镜像仓库
管理和使用本地docker主机镜像
列出镜像列表
利用docker images命令:
sudo docker images
获取一个新的镜像
当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。
sudo docker pull [镜像的仓库源名]
查找镜像
使用 docker search 命令来搜索镜像:
sudo docker search [镜像的仓库源名]
删除镜像
镜像删除使用 docker rmi 命令:
sudo docker rmi [镜像的仓库源名]
镜像仓库的创建、拉取镜像和push镜像
注册阿里云镜像仓库
登录阿里云账号
sudo docker login --username=[账户名] registry.cn-hangzhou.alilyuncs.com
push镜像
$ sudo docker login --username=浅笑zlr registry.cn-hangzhou.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/zlrong/docker:[镜像版本号]
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/zlrong/docker:[镜像版本号]
这是push成功之后的镜像仓库: