课程调查
- 操作系统和计算机组成原理,对系统也有了一些了解,对这门课的最初印象就是是一门偏硬件的课程,觉得应该这门课也应该有一些实现硬件的配置,然后接触一些系统底层的实验。通过这门课也希望能学到些以后工作能用的知识吧
了解微服务
微服务
- 定义:微服务是一个新兴的软件架构,就是把一个大型的单个应用程序和服务拆分为数十个的支持微服务。一个微服务的策略可以让工作变得更为简便,它可扩展单个组件而不是整个的应用程序堆栈,从而满足服务等级协议。
微服务的特点
- 按照业务来划分服务,单个服务代码量小,业务单一,易于维护。
每个微服务都有自己独立的基本组件,例如数据库、缓存等,且运行在独立的进程中。 - 微服务之间的通信是通过HTTP协议或者消息组件,且具有容错能力。
- 微服务有一套服务治理的解决方案,服务之间不耦合,可以随时加入和剔除服务。
- 单个微服务能够集群化部署,并且有负载均衡的能力
- 整个微服务系统应该有一个完整的安全机制,包括用户验证、权限验证、资源保护等。
- 整个微服务系统有链路追踪的能力。
有一套完整的实时日志系统。
微服务优缺点
- 优点:
每个服务足够内聚,足够小,代码容易理解、开发效率提高;服务之间可以独立部署,微服务架构让持续部署成为可能;每个服务可以各自进行负载均衡扩展和数据库扩展,而且,每个服务可以根据自己的需要部署到合适的硬件服务器上;容易扩大开发团队,可以针对每个服务(service)组件开发团队;提高容错性(fault isolation),一个服务的内存泄露并不会让整个系统瘫痪;系统不会被长期限制在某个技术栈上。 - 缺点:
开发人员要处理分布式系统的复杂性;开发人员要设计服务之间的通信机制,对于需要多个后端服务的user case,要在没有分布式事务的情况下实现代码非常困难;涉及多个服务直接的自动化测试也具备相当的挑战性;服务管理的复杂性,在生产环境中要管理多个不同的服务的实例,这意味着开发团队需要全局统筹(PS:现在docker的出现适合解决这个问题);应用微服务架构的时机如何把握?对于业务还没有理清楚、业务数据和处理能力还没有开始爆发式增长之前的创业公司,不需要考虑微服务架构模式,这时候最重要的是快速开发、快速部署、快速试错。
微服务的部署
- 一、单主机单服务
在一台主机上部署一个服务。
这种方法的优点包括:
service实例互相分离
没有资源请求冲突或者依赖版本冲突的风险
一个service实例只能消耗最多一台主机的资源
很容易监控、管理、重新部署
缺点:
资源利用率可能不如单主机多服务高 - 二、单主机多个服务
在一台主机(物理机或者虚拟机)上运行多个不同服务的实例。
有几种不同的方法来把一个服务部署在一台共享的主机上,包括:
把每个service实例部署成JVM实例。
把多个service实例部署在同一个JVM里。
这种模式的优点:
比单主机单服务有更好的资源利用
这种模式的缺点:
有资源需求冲突的风险
有依赖版本冲突的风险
难以限制一个service实例的资源使用
难以监控每个服务的资源使用情况 - 三、单虚拟机单服务
把服务打包成一个虚拟机的Image,然后部署在一个单独的VM上。
这种模式的优点:
可以直接通过提高虚拟机个数的方式来做scale,Amazon Autoscaling Groups(译者注: 不了解的可以去看看AWS的一些基础知识)甚至可以根据负载做自动化的调节
VM包含了构建这个service的所有技术细节,所有的service都用同样的方法来开始和停止
每个service实例是分离的
VM会限制一个service实例所消耗的CPU和内存资源
例如AWS这样的IaaS解决方案提供了一个成熟的、有很多特性的基础设置来部署和管理虚拟机,比如说,Elastic Load Balancer、Autoscaling Groups
这种模式的缺点:
构建一个VM的Image比较花时间 - 四、每个容器一个Service
把service打包成(Docker)容器的Image, 然后把service实例部署成一个容器。现在有几个Docker集群管理的解决方案, 包括 Kubernetes(k8s)、 Marathon/Mesos、 Amazon EC2 Container Service(ECS)。
这种模式的优点:
可以直接通过改变容器实例的方式来做scale
容器包含了构建这个service的所有技术细节,所有的service都用同样的方法来开始和停止
每个service实例是分离的
容器会限制一个service实例所消耗的CPU和内存资源
Container构建和启动很快。
这种模式的缺点:
部署容器的基础设置不如部署VM的基础设置丰富。 - 五、Serverless架构的方式
使用一个隐藏了任务服务器的概念的部署的基础设施。这个基础设施拿到你的service的代码,然后运行。为了使用这种方式部署,你需要打包你的代码,把它上传到基础设施,然后描述你想要的性能指标。
这个部署的基础设施由公有云提供商来操作。它一般使用容器或者虚拟机的方式来分离服务,但是这些细节你并不需要知道。你不需要负责管理操作系统等等。现在有一些不同的serverless部署的环境: AWS Lambda、Google Cloud Functions、 Azure Functions, 他们提供了类似的功能,但是AWS有最丰富的功能。
一个AWS Lambda function是一个无状态的组件,它被调用去处理事件。 要创建一个AWS Lambda function, 你需要把你的代码打包成一个ZIP文件,然后上传到AWS Lambda。你同时还要指定这个处理事件的function的名字以及它的资源使用限制。
当事件产生的时候,AWS Lambda找到你的function的空闲实例,然后调用处理的function。
有四种方法来调用一个Lambda function。
一种选择是你配置你的Lambda function,使它对别的AWS service(比如S3, DynamoDB)所产生的事件(比如S3 bucket上创建了一个新的object、DynamoDB上有条数据被删除等等)进行响应。
另一种方法是配置AWS Lambda Gateway,把HTTP 请求路由到lambda function上。 AWS Gateway把一个HTTP请求转化成一个事件对象, 然后调用lambda function,然后根据lambda function的返回值生成HTTP响应。
你也可以通过AWS Lambda Web Service API明确调用Lambda function。你调用Lambda function的应用提供一个JSON对象,传给Lambda function, web service会把结果返回给你。
第四种方法是使用CRON的方式周期性调用。比如说,你可以告诉AWS每5分钟调用一次你的Lambda function。
这种模式的优点:
不需要关心底层架构,只要关注代码
非常有弹性,根据负载自动scale
只要为请求数付钱, 便宜
这种模式的缺点:
这种架构比VM或者容器有更多的限制。比如说,AWS只支持很少几种语言,只适用于部署响应请求的无状态应用,你不能部署一个长期运行的有状态的应用如数据库、消息代理
输入源有限制。比如说AWS Lambda不能订阅一个像RabbitMQ那样的消息代理
应用必须快速启动。Serverless 架构不适用于花很多时间启动的service
高延迟的风险。基础设施在为你的function启动一个instance、function 初始化的时间可能比较长。当突发的、大量请求进来的时候,一开始会比较缓慢。
学习docker技术
- Docker:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
- Docker Compose:Docker Compose是一个用来定义和运行复杂应用的Docker工具。一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose不再需要使用shell脚本来启动容器。
Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。 - Dockerfile:Dockerfile是docker中镜像文件的的描述文件,说的直白点就是镜像文件到底是由什么东西一步步构成的。
- Dockers Machine:Docker Machine是一个工具来使得你能够安装Docker Engine在虚拟主机上,并且通过 docker-machine 命令进行管理。你能够使用Machine在你的本地Mac或者Windows,在数据中心,在云平台创建你的Docker主机。
使用 docker-machine 命令,你能够启动,检测,停止和重启被管理的主机,升级Docker客户端和进程,也可以配置Docker客户端与主机通信。
将Machine CLI指向正在运行的托管主机,您可以直接在该主机上运行docker命令。 例如,运行docker-machine env default指向名为default的主机,按照屏幕上的说明完成env设置,然后运行docker ps,docker run hello-world等等。 - Swarm:Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。Swarm和Kubernetes比较类似,但是更加轻,具有的功能也较kubernetes更少一些。
- K8S:k8s是一个编排容器的工具,其实也是管理应用的全生命周期的一个工具,从创建应用,应用的部署,应用提供服务,扩容缩容应用,应用更新,都非常的方便,而且可以做到故障自愈,例如一个服务器挂了,可以自动将这个服务器上的服务调度到另外一个主机上进行运行,无需进行人工干涉
搭建docker环境
- 更新apt包索引
sudo apt-get update
- 安装 apt 依赖包,用于通过HTTPS来获取仓库
sudo apt-get install
apt-transport-https
ca-certificates
curl
gnupg-agent
software-properties-common
- 添加 Docker 的官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
- 通过搜索指纹的后8个字符,验证您现在是否拥有带有指纹的密钥
sudo apt-key fingerprint 0EBFCD88
pub rsa4096 2017-02-22 [SCEA]
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid [ unknown] Docker Release (CE deb) <docker@docker.com>
sub rsa4096 2017-02-22 [S]
- 使用以下指令设置稳定版仓库
sudo add-apt-repository
"deb [arch=amd64] https://download.docker.com/linux/ubuntu
$(lsb_release -cs)
stable"
- 安装最新版本的 Docker Engine-Community 和 containerd ,或者转到下一步安装特定版本
sudo apt-get install docker-ce docker-ce-cli containerd.io
- 在仓库中列出可用版本
apt-cache madison docker-ce
- 安装特定版本
sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io
- 这里执行hello-world报错,进行阿里云镜像加速配置,最后测试hello-world是否成功执行
sudo docker run hello-world
- 没有ubuntu 镜像,使用 docker pull 命令来载入 ubuntu 镜像
sudo docker pull ubuntu
- 启动容器
docker run -it ubuntu /bin/bash
- -i: 交互式操作。
- -t: 终端。
- ubuntu: ubuntu 镜像。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
- 要退出终端,直接输入 exit
- 查看所有容器:
docker ps -a
- 使用 docker start 启动一个已停止的容器
docker start b750bbbcfd88
- 在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。
docker run -itd --name ubuntu-test ubuntu /bin/bash
**注:**加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 **docker exec**
- 停止容器的命令如下
docker stop <容器 ID>
- 停止的容器可以通过 docker restart 重启
docker restart <容器 ID>
- 进入容器,在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入
docker attach 1e560fca3906
如果从这个容器退出,会导致容器的停止。
docker exec -it 243c32535da7 /bin/bash
退出容器终端,不会导致容器的停止
- 导入导出容器
docker export 1e560fca3906 > ubuntu.tar
或docker import http://example.com/exampleimage.tgz example/imagerep
cat docker/ubuntu.tar | docker import - test/ubuntu:v1
- 更新容器
- 列出镜像列表
- 查找镜像
- 拖取镜像
- 使用镜像
- 删除镜像(删除前要把正在使用的容器也删掉)
- 配置完镜像加速去重启和查看配置是否成功
- 仓库登录和登出
- 拉取镜像前查找官方仓库的镜像
- 拉取镜像到本地,并进行查看
- 上传镜像,要先登录