❄一、课程调查
一开始以为是有关硬件的实践课,因为课表上还有一门计算系统结构课,课名和老师都差不多,上完发现是软件实验课,第一次实验就让我接触到了不少以前没有了解过的知识,希望通过这门课我的综合实践能力能得到提高==
❄二、了解微服务
(1)微服务是什么
微服务架构(Microservice Architecture)是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。你可以将其看作是在架构层次而非获取服务的。
类上应用很多SOLID原则。微服务架构是个很有趣的概念,它的主要作用是将功能分解到离散的各个服务当中,从而降低系统的耦合性,并提供更加灵活的服务支持。
概念:把一个大型的单个应用程序和服务拆分为数个甚至数十个的支持微服务,它可扩展单个组件而不是整个的应用程序堆栈,从而满足服务等级协议。
定义:围绕业务领域组件来创建应用,这些应用可独立地进行开发、管理和迭代。在分散的组件中使用云架构和平台式部署、管理和服务功能,使产品交付变得更加简单。
本质:用一些功能比较明确、业务比较精练的服务去解决更大、更实际的问题。
(2)特点
- 服务组件化:
在微服务架构中,需要我们对服务进行组件化分解,服务是一种进程外的组件,它通过HTTP等通信协议进行协作,而不是像传统组件那样镶入式的方式协同工作,每一个服务都独立开发、部署、可以有效避免一个服务的修改引起整个系统的重新部署。 - 按业务组织团队:
在实施微服务架构时,需要采用不同的团队分割方法。由于每一个服务都是针对特定的业务的宽栈或者全栈实现的,纪要负责数据的持久化存储,又要负责用户接口定义等各种跨专业领域的职能。因此面对大型项目的时候,对于微服务团队的拆分更加建议按业务线的方法进行拆分,一方面可以有效的减少服务内部修改所产生的内耗,另一方面,团队边界可以变得更为清晰。 - 做产品的态度:
在微服务架构团队中,每个小团队都应该以做产品的方式,,对其整个生命周期负责,而不是像传统项目开发那样,交付给测试,运维为目标 - 智能端点和哑管道:
由于各个服务不在一个进程中,组件间的通信模式发生了改变,原本进程内的方法调用变成了RPC方式的调用,会导致微服务之间产生烦琐的通信,使得系统表现更为糟糕,所以我们需要更粗粒度的通信协议: - 在微服务架构中,通常会使用一下两种服务调用方法:
(1)使用HTTP的RESTful API或者轻量级的消息发送协议,实现消息传递与服务调用的处触发。
(2) 通过在轻量级消息总线上传递消息,类似RabbitMQ等一些提供可靠异步交换的中间体。
在极度强调性能的情况下,还有可能会使用二进制的消息发送协议,例如protobuf - 去中心化治理:
在整个微服务架构,通过采用轻量级的契约定义接口,使得我们队服务本身的具体技术平台不再那么敏感,这样整个微服务架构系统中的各个组件就能针对不同的业务特点选择不同的技术平台。 - 去中心化管理数据:
在实施微服务架构时,希望每一个服务自己来管理其数据库,这就是数据管理的去中心化,虽然数据管理的去中心化让数据管理更加细致化,让数据存储和性能达到最优,但是不同的数据库实例,数据一致性也成了微服务架构中亟待解决的问题之一,分布式事务本身实现的难度就非常大,所以在微服务架构中,我们更强调各服务之间进行”无事务“的调用,而对数据一致性,只要求数据在最后的处理状态是一致的即可。 - 基础设施自动化:
在微服务架构中,务必从一开始就构建起”持续交付“平台来支撑整个实施过程; - 容错设计:
在微服务架构中,快速检测出故障源并尽可能地自动恢复服务是必须被设计考虑的,通常我们都希望在每个服务中实现监控和日志记录的组件。比如:服务状态、断路器状态、吞吐量、网络延迟等关键数据的仪表盘等。 - 演进式设计:
在初期, 以单体系统的方式来设计和实施, 一方面系统体量初期并不会很大, 构建和维护成本都不高。 另一方面, 初期的核心业务在后期通常也不会发生巨大的改变。
随着系统的发展或者业务的需要, 架构师会将一些经常变动或是有一定时间效应的内容进行微服务处理, 并逐渐将原来在单体系统中多变的模块逐步拆分出来, 而稳定不太变化的模块就形成一个核心微服务存在于整个架构之中。
(3)相较于传统的软件结构
- 传统的软件架构
-
所有的功能打包在一个 WAR包里,基本没有外部依赖(除了容器),部署在一个JEE容器(Tomcat,JBoss,WebLogic)里,包含了 DO/DAO,Service,UI等所有逻辑。
-
优点
- 开发简单,集中式管理
- 基本不会重复开发
- 功能都在本地,没有分布式的管理和调用消耗
-
缺点
- 效率低:开发都在同一个项目改代码,相互等待,冲突不断
- 维护难:代码功功能耦合在一起,新人不知道何从下手
- 不灵活:构建时间长,任何小修改都要重构整个项目,耗时
- 稳定性差:一个微小的问题,都可能导致整个应用挂掉
- 扩展性不够:无法满足高并发下的业务需求
-
- 微服务架构的优缺点
- 优点
- 服务的粒度更加细致,有利于资源的重复利用,提高开发效率。
- 可以更加精确的制定每个服务的优化方案,提高性能的可维护性。
- 适用于互联网时代,产品迭代周期更短
- 缺点
- 微服务过多,服务治理成本高,不利于系统维护。
- 分布式系统开发的技术成本高(容错、分布式事物等),对团队挑战大。
- 优点
- 微服务架构的部署
在微服务架构方面,微服务的部署起着至关重要的作用,并且具有以下关键要求:- 能够独立于其他微服务进行部署/取消部署。
- 必须能够在每个微服务级别进行扩展(给定的服务可能比其他服务获得更多的流量)。
- 快速构建和部署微服务。
- 一个微服务中的故障不得影响任何其他服务。
Docker(一种开放源代码引擎,可让开发人员和系统管理员在Linux环境中部署自给自足的应用程序容器)提供了一种很好的方式来部署微服务以满足上述要求。 涉及的关键步骤如下: - 将微服务打包为(Docker)容器映像。
- 将每个服务实例部署为一个容器。
- 缩放是根据更改容器实例的数量完成的。
- 随着我们使用Docker容器,构建,部署和启动微服务的速度将大大提高(比常规VM快得多)
Kubernetes通过允许将Linux容器集群作为一个系统进行管理,跨多个主机管理和运行Docker容器,提供容器的共置,服务发现和复制控制功能,扩展了Docker的功能。 如你所见,大多数这些功能在我们的微服务环境中也是必不可少的。 因此,使用Kubernetes(在Docker之上)进行微服务部署已成为一种极其强大的方法,尤其是对于大规模微服务部署。
❄三、学习docker技术
(1)学习了解docker的相关概念
- docker:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
- docker compose:Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YML文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从YML文件配置中创建并启动所有服务。
- Dockerfile:Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
- docker machine:Docker Machine 是一种可以让您在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机。
Docker Machine 也可以集中管理所有的docker 主机,比如快速的给 100 台服务器安装上 docker。ocker Machine 管理的虚拟主机可以是机上的,也可以是云供应商,如阿里云,腾讯云,AWS,或 DigitalOcean。
使用 docker-machine 命令,您可以启动,检查,停止和重新启动托管主机,也可以升级 Docker 客户端和守护程序,以及配置 Docker 客户端与您的主机进行通信。 - Swarm:Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。Swarm和Kubernetes比较类似,但是更加轻,具有的功能也较kubernetes更少一些。
- k&s:k8s是一个编排容器的工具,其实也是管理应用的全生命周期的一个工具,从创建应用,应用的部署,应用提供服务,扩容缩容应用,应用更新,都非常的方便,而且可以做到故障自愈。
(2)搭建docker环境
1、Ubuntu Docker安装
1.1 使用Docker仓库进行安装
1.1.1 设置仓库
更新apt包索引
sudo apt-get updat
安装 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 -
设置稳定版仓库
sudo add-apt-repository
"deb [arch=amd64] https://download.docker.com/linux/ubuntu
$(lsb_release -cs)
stable"
1.1.2 安装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
2、Docker容器使用
2.1 获取镜像
使用 docker pull 命令来载入 ubuntu 镜像
sudo docker pull ubuntu
2.2 启动容器
sudo docker run -t -i ubuntu /bin/bash
参数说明:
- -i: 交互式操作。
- -t: 终端。
- ubuntu: ubuntu 镜像。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
2.3 启动/停止
查看所有的容器命令
sudo docker ps -a
启动已停止的容器
sudo docker start <容器 ID>
2.4 后台运行
创建后台运行容器
sudo docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hi; sleep 1; done"
查看容器内的标准输出
sudo docker logs <容器 ID>
2.5 停止和重启容器
停止已启动的容器
sudo docker stop <容器 ID>
停止的容器重启
sudo docker restart <容器 ID>
2.6 进入容器
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
- docker attach
- docker exec:推荐使用,因为此退出容器终端,不会导致容器的停止。
2.6.1 attach命令
sudo docker attach <容器 ID>
2.6.2 exec命令
sudo docker exec -it <容器 ID> /bin/bash
2.7 更新容器
查看可选择的更新方式
docker container update --help
2.8 删除容器
sudo docker rm -f <容器 ID>
(3)Docker镜像使用
3.1 获取阿里云镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["加速器地址"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
3.2 列出镜像列表
sudo docker images
各个选项说明:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
3.3 查找镜像
用Docker Hub
sudo docker search httpd
3.3 拖取镜像
下载镜像
sudo docker pull httpd
(4) Docker仓库管理
4.1 docker hub仓库
4.1.1 创建阿里云仓库
4.1.2 登录阿里云Docker Registry
sudo docker login --username=维他柠檬茶br registry.cn-hangzhou.aliyuncs.com
4.1.3 将镜像推送到Registry
sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/bybbr/bbrdocker:v1
sudo docker push registry.cn-hangzhou.aliyuncs.com/bybbr/bbrdocker:v1
4.1.4 删除之前的文件
sudo docker rmi registry.cn-hangzhou.aliyuncs.com/bybbr/bbrdocker:v1
4.1.5 从Registry中拉取镜像
sudo docker pull registry.cn-hangzhou.aliyuncs.com/bybbr/bbrdocker:v1