课程调查
这门课顾名思义就知道是一次又一次的实验,关于这些实验已经从大一历练到大三了所以已经坦然面对了。对于系统综合实践一开始我以为是硬件软件方面的知识,要去实验室动手做系统什么的,直到老师在课上说需要用到树莓派才大致认识到了这门课。对于树莓派以前没有接触过,只听到同学提起,现在通过这门课能进行深入了解,非常期待。由于上学期经过软件工程残酷打击,希望这门课能轻松一点,不想再天天熬夜掉发了,毕竟还要考研。
了解微服务
什么是微服务?
微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间相互协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务和服务之间采用轻量级的通信机制相互沟通(通常是基于HTTP的Restful API).每个服务都围绕着具体的业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构。
微服务的特点
按照业务来划分服务,单个服务代码量小,业务单一,易于维护。
每个微服务都有自己独立的基本组件,例如数据库、缓存等,且运行在独立的进程中。
微服务之间的通信是通过HTTP协议或者消息组件,且具有容错能力。
微服务有一套服务治理的解决方案,服务之间不耦合,可以随时加入和剔除服务。
单个微服务能够集群化部署,并且有负载均衡的能力
整个微服务系统应该有一个完整的安全机制,包括用户验证、权限验证、资源保护等。
整个微服务系统有链路追踪的能力。
有一套完整的实时日志系统。
微服务的优点
- 易于开发和维护
由于微服务单个模块就相当于一个项目,开发这个模块我们就只需关心这个模块的逻辑即可,代码量和逻辑复杂度都会降低,从而易于开发和维护。
- 启动较快
这是相对单个微服务来讲的,相比于启动单体架构的整个项目,启动某个模块的服务速度明显是要快很多的。
- 局部修改容易部署
在开发中发现了一个问题,如果是单体架构的话,我们就需要重新发布并启动整个项目,非常耗时间,但是微服务则不同,哪个模块出现了bug我们只需要解决那个模块的bug就可以了,解决完bug之后,我们只需要重启这个模块的服务即可,部署相对简单,不必重启整个项目从而大大节约时间。
- 技术栈不受限
比如订单微服务和电影微服务原来都是用java写的,现在我们想把电影微服务改成nodeJs技术,这是完全可以的,而且由于所关注的只是电影的逻辑而已,因此技术更换的成本也就会少很多。
- 按需伸缩
我们上面说了单体架构在想扩展某个模块的性能时不得不考虑到其它模块的性能会不会受影响,对于我们微服务来讲,完全不是问题,电影模块通过什么方式来提升性能不必考虑其它模块的情况。
微服务的缺点
- 运维要求较高
对于单体架构来讲,我们只需要维护好这一个项目就可以了,但是对于微服务架构来讲,由于项目是由多个微服务构成的,每个模块出现问题都会造成整个项目运行出现异常,想要知道是哪个模块造成的问题往往是不容易的,因为我们无法一步一步通过debug的方式来跟踪,这就对运维人员提出了很高的要求。
- 分布式的复杂性
对于单体架构来讲,我们可以不使用分布式,但是对于微服务架构来说,分布式几乎是必会用的技术,由于分布式本身的复杂性,导致微服务架构也变得复杂起来。
- 接口调整成本高
比如,用户微服务是要被订单微服务和电影微服务所调用的,一旦用户微服务的接口发生大的变动,那么所有依赖它的微服务都要做相应的调整,由于微服务可能非常多,那么调整接口所造成的成本将会明显提高。
- 重复劳动
对于单体架构来讲,如果某段业务被多个模块所共同使用,我们便可以抽象成一个工具类,被所有模块直接调用,但是微服务却无法这样做,因为这个微服务的工具类是不能被其它微服务所直接调用的,从而我们便不得不在每个微服务上都建这么一个工具类,从而导致代码的重复。
学习docker技术
docker相关概念
- 镜像(Image)
镜像,从认识上简单的来说,就是面向对象中的类,相当于一个模板。从本质上来说,镜像相当于一个文件系统。Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
- 容器(Container)
容器,从认识上来说,就是类创建的实例,就是依据镜像这个模板创建出来的实体。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。
- 仓库(Repository)
仓库,从认识上来说,就好像软件包上传下载站,有各种软件的不同版本被上传供用户下载。镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
- docker
docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
- docker compose
docker compose可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具。
- Dockerfile
Dockerfile是一个Docker镜像的描述文件,其内部包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
- docker machine
docker machine是一个工具,它允许你在虚拟宿主机上安装Docker,并使用docker-machine命令管理这个宿主机,可以使用Docker Machine在本地的MAC或者windows box、公司网络,数据中心或者AWS这样的云提供商上创建docker。
- Swarm
Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。Swarm和Kubernetes比较类似,但是更加轻,具有的功能也较kubernetes更少一些。
- k8s
k8s是基于容器的集群管理平台,它的全称,是kubernetes。
搭建docker环境
-
输入命令sudo apt-get update更新apt包索引
-
安装apt依赖包,用于通过http来获取仓库
-
添加 Docker 的官方 GPG 密钥
-
设置稳定版仓库
-
安装最新版本的 Docker Engine-Community 和 containerd
-
使用hello-world来测试是否成功,出现下图即可证明成功
-
从远程仓库拉取镜像
-
再次使用hello-world测试
-
创建一个容器
-
查询所有容器
-
删除容器,容器删除后再查询已消失
镜像相关操作
-
创建docker仓库
-
使用docker尝试登录一直失败,转用阿里云
-
登录阿里云
-
将镜像push到阿里云仓库中
-
查询是否成功,成功
TIPS
在使用docker时候最好前面都加个sudo,如果没有加我自己操作起来会一直报错,不知道这是不是普遍的问题。还有由于docker原版镜像实在太慢,建议使用阿里云镜像加速,这点可以上百度查看具体操作,不再赘述。最后的最后,使用阿里云仓库也会方便一些。