前言
仅记录学习笔记,如有错误欢迎指正。
一、微服务架构:
- 服务的注册和发现:Eruka(×) Nacos(*)/ Zookeeper/ Consul
- 服务负载和调用:ribben(LoadBalancer)/Feign/ openFeign
- 熔断降级:hystrix(×)/ sentienl
- 网关:zuul(×)/ gateway
- 分布式配置:springcloud config(×)/ Nacos
- 服务开发:sprigboot
- 服务总线: Nacos
Gateway网关
三大核心概念
- Route(路由) - 路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如断言为true则匹配该路由;
- Predicate(断言) - 参考的是Java8的java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由;
- Filter(过滤) - 指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。
web请求,通过一些匹配条件,定位到真正的服务节点。并在这个转发过程的前后,进行一些精细化控制。
predicate就是我们的匹配条件;而fliter,就可以理解为一个无所不能的拦截器。有了这两个元素,再加上目标uri,就可以实现一个具体的路由了.
客户端向Spring Cloud Gateway发出请求。然后在Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到GatewayWeb Handler。
Handler再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post")执行业务逻辑。
Filter在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。
核心逻辑:路由转发 + 执行过滤器链。
Nacos服务/配置中心:
- Nacos就是注册中心+配置中心的组合 -> Nacos = Eureka+Config+Bus
- 自带操作界面。(可做ap 也可做cp)
- 自带本地数据库,也可以切换到mysql数据库
- 通过DateId来读取对应的配置文件( p r e f i x − {prefix}- prefix−{spring-profile.active}.${file-extension})
- group分组来实现不同的配置文件的监听
NACOS部署架构图:
Sentinel限流降级:
对流量进行限流:
- 资源名:唯一名称,默认请求路径。
- 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)。
阈值类型/单机阈值:
- QPS(每秒钟的请求数量)︰当调用该API的QPS达到阈值的时候,进行限流。
- 线程数:当调用该API的线程数达到阈值的时候,进行限流。
是否集群:不需要集群。
流控模式:
-
直接:API达到限流条件时,直接限流。
-
关联:当关联的资源达到阈值时,就限流自己。
-
链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【API级别的针对来源】。
流控效果:
-
快速失败:直接失败,抛异常。
-
Warm up:根据Code Factor(冷加载因子,默认3)的值,从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值。
-
排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效。
降级(熔断):
慢调用比例 (平均响应时间,秒级)
- 平均响应时间 超出阈值 且 在时间窗口内通过的请求>=5, 两个条件同时满足后触发降级。
- 窗口期过后关闭断路器。
- RT最大4900(更大的需要通过-Dcsp.sentinel.statistic.max.rt=XXXX才能生效)。
异常比例(秒级)
QPS >= 5且异常比例(秒级统计)超过阈值时,触发降级;时间窗口结束后,关闭降级 。
异常数(分钟级)
常数(分钟统计)超过阈值时,触发降级;时间窗口结束后,关闭降级
针对于热点可以的限流,通过入参的index下标来确认!(也可以针对特殊值来制定不一样的规则)
@SentinelResource 用于定义资源,并提供可选的异常处理和 fallback 配置项。
sentinel持久化的需要把规则配置进nacos的数据库中!
Sentinel分布式事务:
例如:TM班主任 TC 授课老师 RM 学生
将调用多个不同接口的业务整合到一个global事务中,实现分布式事务的一致性。(联想transactional 处理单个数据库的情况)
Doker容器:
解决部署困难问题,可以和环境一起部署在doker中。
镜像:可以创建多个容器,相当于一个模版(最终服务就是运行在容器里面)(外面下载的nginx和tomcat)
容器:Doker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。基本命令(运行下载的东西)
仓库:直接利用宿主的操作系统,无需重新加载一个操作系统内核,所以很快。
docker可视化工具:Portainer
docker镜像加载原理:
联合文件系统(UnionFS):它是一种分层的,轻量级并且高性能的文件系统,它支持对文件修改作为一次提交来一层层的叠加,同时将不同 目录挂载到同一个虚拟文件系统下。Union文件系统是docker镜像的基础。
docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常说的容器层,容器下的叫镜像层。(下载的镜像都没只读,操作在镜像上一层次操作)
docker commit 提交镜像
容器数据卷:
mysql的数据可以存储在本地,数据可以持久化(和其他目录关联挂载,双向绑定)
(1)Bind mount(绑定挂载):
创建容器时,使用“-v”选项,将本地的目录挂载到容器中。采用这种方式容器的挂载类型为bind!
特点:(docker run -it -v 主机目录:容器内目录 )
-
Data Volume是目录或文件,不能是没有格式化的磁盘(块设备);
-
容器可以读写volume中的数据;
-
随源文件变化而变化;
-
volume数据可以永久保存,即使使用它的容器已经被销毁;
(2)Manager Volume(数据卷管理员)
创建容器时,使用“-v“选项,只指定容器中的目录即可!采用这种方式容器的挂载类型为volume;
特点:
-
随着源文件的变化而变化,跟Bind mount效果是一样;
-
删除容器的操作,默认不会对dockerhost主机上的原文件进行删除,如果想要在删除容器是将原文件删除,可以在删除容器时添加“-v”选项,(一般情况下不建议使用,因为文件有可能被其他容器就使用);
(3) 容器和容器关联
容器1 --volumes -from 容器2
匿名挂载和具名挂载:
匿名:不写外部挂载的目录,系统生成目录(/var/lib/docker/volumes/xxx/_data)
剧名:-v 卷名:容器内路径
指定路径挂载:-v /宿主机路径:容器内路径
docker volume ls 查看挂载的目录