系统综合实践第一次作业
(1)课程调查
进入大三下学期的后半段,大学阶段的理论课程应该已经修得八九不离十了,在这个时间点迎来系统综合实践这门课,作为培养计划的一门新课程,我们非常希望了解你们对于课程的希望,请写下你对这门课的认识和你理想中的这门课程是怎么样的。
answer:刚开始上这门课时,由于这门课叫做系统综合实践,所以我觉得这门课更多的是偏向计算机硬件方面的,但是上了第一节课后发现它不仅需要硬件方面的知识,还需要涉及软件上的知识,所以是一门软硬件相结合的综合实践课,还是很有挑战性和难度的。由于这门课程还要写博客,所以我觉得老师在课程形式上还是挺创新的,希望自己在后续的学习中能够不断提高,学到更多新的知识!
(2)了解微服务
第一次作业我们将接触一种新型的软件架构——微服务(也许部分同学已经有所了解)。大家要做的是学习并了解该技术,微服务是什么,有什么特点,相较于传统的软件架构,它有什么优缺点,它是怎样部署的。
1.微服务的概念
微服务是一种新型软件架构,是把一个大型的单个应用程序和服务拆分为数十个的支持微服务。该架构的设计目标是为了肢解业务,使得服务能够独立运行。在微服务架构中,各个服务是细粒度的,协议是轻量级的。一个微服务的策略可以让工作变得更为简便,它可扩展单个组件而不是整个的应用程序堆栈,从而满足服务等级协议。
2.微服务的特点
(1)按照业务来划分服务,单个服务代码量小,业务单一,易于维护。
(2)每个微服务都有自己独立的基本组件,例如数据库、缓存等,且运行在独立的进程中。
(3)微服务之间的通信是通过HTTP协议或者消息组件,且具有容错能力。
(4)微服务有一套服务治理的解决方案,服务之间不耦合,可以随时加入和剔除服务。
(5)单个微服务能够集群化部署,并且有负载均衡的能力。
(6)整个微服务系统应该有一个完整的安全机制,包括用户验证、权限验证、资源保护等。
(7)整个微服务系统有链路追踪的能力。
(8)微服务有一套完整的实时日志系统。
3.微服务与传统服务的区别
传统的WEB应用核心分为业务逻辑、适配器以及API或通过UI访问WEB界面。其业务逻辑定义业务流程、业务规则以及各领域实体。而其适配器包括数据库访问组件、消息组件以及访问接口等,类似打车软件、叫餐软件。尽管也是遵循模块化开发,但最终它们会打包并部署为单体式应用居多。例如Java应用程序会被打包成WAR,部署在Tomcat之间存在优缺点,但是随着市场的发展,用户数、数据量、业务模式的增长,传统模式存在一些缺点:
1、部署不灵活:构建时间长,任何小修改必须重新构建整个项目;
2、稳定性不高:一个对象内存释放不及时等问题,可能会导致整个应用挂掉;
3、扩展性不够:高并发情况下的业务需求,在扩展性方面比较麻烦;
所以,现在主流的设计一般会采用微服务架构。其思路不是开发一个巨大的单体式应用,而是将应用分解为小的、互相连接的微服务,每个业务逻辑都被分解为一个微服务,微服务之间通过REST API通信。一些微服务也会向终端用户或客户端开发API接口。但通常情况下,这些客户端并不能直接访问后台微服务,而是通过API Gateway来传递请求。API Gateway一般负责服务路由、负载均衡、缓存、访问控制和鉴权等任务。
微服务优点,比传统的应用程序更有效地利用计算资源。这是因为它们通过扩展组件来处理功能瓶颈问题。
• 一种软件架构模式
• 复杂应用解耦为小而众的服务
• 各服务精而专
• 服务间通信通过API完成
• 更快且更容易更新
而为了满足如上几大优点或者说规则微服务细化带来工作维护麻烦性等,一般使用docker技术结合来提供微服务的优势和运维工作的高效性。
4.微服务的优缺点
对比传统的软件架构,微服务的具有如下优点:1.每个服务独立存在,所以可以单独部署,不用每次发布某个功能都经历一次全服务发布;2.微服务易于被一个开发人员理解、修改和维护,这样小团队能够更关注自己的工作成果。无需通过合作才能体现价值;3.开发简单,开发效率提高,一个服务可能就是专一的只干一件事情;4.微服务只是业务逻辑的代码,不会和HTML/CSS或其他界面组件混合;5.每个微服务都有自己的存储能力,可以有自己的数据库,也可以统一数据库;6.易于和第三方集成,微服务允许容易且灵活的方式集成自动部署,通过持续集成工具,如Jenkins、Hudson、bamboo等;7.微服务能使用不同的语言开发。
但微服务也存在一些缺陷,例如:1.开发人员要设计服务之间的通信机制,对于需要多个后端服务的user case,要在没有分布式事务的情况下实现代码非常困难;2.多服务运维难度,随着服务的增加,运维的压力也在增大;3.开发人员要处理分布式系统的复杂性;4.服务配置较为繁琐。
5.微服务的部署
微服务的部署主要有以下几种:
(1)单主机单服务实例模式;
(2)单主机多服务实例模式;
(3)单容器单服务实例模式;
(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教程 | 菜鸟教程
1.微服务与docker关系
Docker 是一个开源应用容器(当然目前也分为CE和EE版本,不完全开源化,也存在收费版本),让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。Docker 作为容器工具可以把:业务逻辑容器、数据库容器、储存容器、队列容器使得软件可以拆分成若干个标准化容器,然后像搭积木一样组合起来,让彼此通信,从而形成微服务。因此微服务很适合用 Docker 容器实现,每个容器承载一个服务。一台计算机同时运行多个容器,从而就能很轻松地模拟出复杂的微服务架构。
2.了解docker的相关概念
(1)docker:docker是一个开源的应用容器引擎,开发者可以打包自己的应用到容器里面,然后迁移到其他机器的docker应用中,可以实现快速部署。如果出现的故障,可以通过镜像,快速恢复服务;
(2)镜像:Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数。镜像不包含任何动态数据,其内容在构建之后也不会被改变;
(3)容器:器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
(4)docker compose:用于定义和运行多容器 Docker 应用程序的工具。
(5)Dockerfile:是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明;
(6)docker machine:是 Docker 官方提供的一个工具,它可以帮助我们在远程的机器上安装 Docker,或者在虚拟机 host 上直接安装虚拟机并在虚拟机中安装 Docker。
(7)Swarm:Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。
(8)k8s:k8s是基于容器的集群管理平台,它的全称,是kubernetes。k8s在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。
3.与docker有关的基础操作
1.搭建docker环境(开发环境为Ubuntu 16.04 LTS 64位系统)
- 由于apt官方库里的docker版本可能比较旧,所以先卸载可能存在的旧版本:
$ sudo apt-get remove docker docker-engine docker-ce docker.io
- 更新apt包索引:
$ sudo apt-get update
- 安装以下包以使apt可以通过HTTPS使用存储库(repository):
$ sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
- 添加Docker官方的GPG密钥:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
- 再更新一下apt包索引:
$ sudo apt-get update
- 安装最新版本的Docker CE:
$ sudo apt-get install -y docker-ce
2.验证docker是否安装成功
- 查看docker服务是否启动:
$ systemctl status docker
由上我们可以看出docker服务已启动。
- 若未启动,则启动docker服务:
$ sudo systemctl start docker
- 通过运行 hello-world 来验证docker是否正确安装
$ sudo docker run hello-world
有以上输出则证明docker已安装成功!
3.docker的容器操作
- 启动容器
在容器内使用ubuntu 16.04的镜像启动(也可以理解为新建,只要run一次就会生成一个不同id的容器)了一个容器实例(不同于先前安装docker时的ubuntu系统),如果镜像不存在,那么会从远程拉取(pull),启动实例后会运行/bin/bash这个交互式shell。
$ sudo docker run -it ubuntu:16.04 /bin/bash
#加上-i 和 -t之后,就会跳出root@ccb65a28df24:/#,ccb65a28df24是容器的id,那么容器内的ubuntu实例就提供了一个Terminal终端和交互式shell
以上命令使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器:
参数说明:
-i: 交互式操作
-t: 终端
ubuntu: ubuntu 镜像
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式Shell,因此用的是/bin/bash
要退出终端,直接输入exit.
- 使用如下命令查看当前操作系统版本信息
# cat /proc/version
- 查看当前正在运行的容器
$ sudo docker ps #查看当前正在运行的容器
$ sudo docker ps -a #查看所有的容器,不论其是否正在运行
- 根据容器id,启动/重启/关闭/删除指定容器
1.启动指定容器
$ sudo docker start <容器id>
2.关闭指定容器
$ sudo docker stop <容器id>
3.删除指定容器
$ sudo docker rm -f <容器id>
4.查看容器状态,返回一段JSON记录容器的状态
$ sudo docker inspect <容器id>
4.docker的镜像操作
-
配置阿里云镜像加速器
-
查看镜像
$ sudo docker images
- 从官方新增镜像
$ sudo docker pull <镜像类型>
- 删除镜像
$ sudo docker rmi <REPOSITORY:TAG>
在删除镜像之前确保没有容器正在使用此镜像,否则会出现错误,删除占用镜像的容器后即可正常删除镜像。
5.创建并维护自己的镜像仓库
-
首先在docker hub上创建一个自己的仓库:
-
列出镜像列表
$ sudo docker images
- 查找镜像
$ sudo docker search httpd
- 拉取镜像
$ sudo docker pull httpd
6.实现拉取和上传镜像
- 首先要登录docker hub
$ sudo docker login
- 拉取和上传镜像
$ sudo docker tag ubuntu cyk2430/cyk #为要上传的镜像打上标签,注意标签要和docker hub上的仓库设置一致,否则可能会报错
$ sudo docker push cyk2430/cyk
push成功后可以在docker hub仓库里看到
- 从仓库获取镜像,并查看镜像列表
$ sudo docker pull cyk2430/cyk
- 退出docker hub
$ sudo docker Logout
(4)遇到的问题和总结
在实验过程中,我主要遇到了几个比较坑的问题,第一个是在配置阿里云加速器时,特别要注意修改的json文件的格式,如果该json文件格式不正确,后面会导致docker无法正常启动(这个东西是真的坑,害我找错误找了几个小时,差点崩溃。。。)如下所示:
解决方案:最后我把阿里云官网给出的镜像加速链接复制到json文件里解决了这个问题。
第二个问题是在拉取和上传镜像时,要注意上传的镜像的标签要和docker hub上的仓库设置一致,否则可能会报错。
解决方案:将上传的镜像的标签和docker hub上的仓库设置保持一致。
第三个问题是拉取镜像时下载速度过慢,总是拉取不下来。。
解决方案:这也是我使用阿里云镜像加速器的原因,由此引发了第一个问题,哈哈哈哈哈。
第四个问题是在直接使用docker命令时遇到权限告警:WARNING: Error loading config file: /home/ubuntu/.docker/config.json: open /home/ubuntu/.docker/config.json: permission denied
解决方案:推荐在docker命令的最前面加上sudo,用sudo权限执行。
总结:通过这次实验,我更深入地认识了微服务和docker的相关概念,并学会了容器的创建、删除、更新和查询,创建并维护自己的镜像仓库,实现拉取和上传镜像等docker的基础操作,有了很大的收获!(但也踩了很多坑o(╥﹏╥)o)