谷粒商城——k8s-DevOps-CI/CD&最终部署
DevOpsDevOps: Development 和 Operations 的组合
DevOps 看作开发(软件工程)、技术运营和质量保障(QA)三者的交集。
突出重视软件开发人员和运维人员的沟通合作,通过自动化流程来使得软件构建、测试、 发布更加快捷、频繁和可靠。
DevOps 希望做到的是软件产品交付过程中 IT 工具链的打通,使得各个团队减少时间损耗,更加高效地协同工作。DevOps 能力图如下,良好的闭环可以大大增加整体的产出。
CI/CD1、持续集成(Continuous Integration)
持续集成是指软件个人研发的部分向软件整体部分交付,频繁进行集成以便更快地发现 其中的错误。“持续集成”源自于极限编程(XP),是 XP 最初的 12 种实践之一。
CI 需要具备这些:
全面的自动化测试。这是实践持续集成&持续部署的基础,同时,选择合适的自动化测试工具也极其重要
灵活的基础设施。容器,虚拟机的存在让开发人员和 QA 人员不必再大费周折
版本控制工具。如 Git,CVS,SVN 等
自动化的构建和软件发布流程的工具,如 Jenkins,flow.c ...
谷粒商城——云原生Pass-Kubesphere&集群搭建
KubesphereKubesphere官网:https://kubesphere.io/zh/
KubeSphere 是一款面向云原生设计的开源项目,在目前主流容器调度平台 Kubernetes 之上构建的分布式多租户容器管理平台,提供简单易用的操作界面以及向导式操作方式,在降低用户使用容器调度平台学习成本的同时,极大降低开发、测试、运维的日常工作的复杂度。
部署1、安装helm(master节点)
2、安装 Tiller(master 执行)
3、安装 OpenEBS(master 执行)
4、最小化、完整化安装Kubesphere
多租户管理包括集群(Cluster)、企业空间(Workspace)、项目(Project)和DevOps Project(DevOps 工程)的层级关系
架构
集群概述集群的目标
1234567+ 集群目标 + 高可用HA + 突破数据量限制 + 多节点存储 + 多节点备份 + 数据备份容灾 + 压力分担
12345678910+ 基础形式 + 主从 + 同步:主从复制 + 主从调 ...
谷粒商城——云原生核心-Kubernetes
k8s简介Docker只是解决服务下层的问题,服务上层建筑如容器编排,服务发现等问题已经超越了Docker的管辖。
Kubernetes提供的编排和管理功能,轻松完成大规模容器部署,借助k8s的编排功能,用户可以构建跨多个容器的应用服务,实现跨集群调度,扩展容器,以及长期持续管理这些容器的健康状况等,并整合网络,存储,安全性,监控及其他服务,提供全面的容器基础架构。
Kubernetes 满足了一系列产品内运行程序的普通需求,兼具平台即服务(PaaS)的简化和基础架构即服务(IaaS)的灵活,并促进了在平台服务提供商之间的迁移。
微服务微服务解决的是我们软件开发中一直追求的低耦合+高内聚,微服务可以解决这个问题,微服务的本质是把一块大饼分成若干块低耦合的小饼,比如一块小饼专门负责接收外部的数据,一块小饼专门负责响应前台的操作,小饼可以进一步拆分,比如负责接收外部数据的小饼可以继续分成多块负责接收不同类型数据的小饼,这样每个小饼出问题了,其它小饼还能正常对外提供服务。
DevOpsDevOps的意思就是开发和运维不再是分开的两个团队,而是你中有我,我中有你的一个团队。我们现在开发和运维 ...
谷粒商城——高并发(秒杀)系统&Sentinel&链路追踪
1、秒杀业务秒杀具有瞬间高并发的特点,针对这一特点,必须要做限流 + 异步 + 缓存(页面静态化)+ 独立部署。
秒杀系统设计
1234567891011121314151617181920212223242526272829303132333435363738+ 秒杀(高并发)系统关注的问题 + 独立部署 + 防止影响其他服务 + 链接加密 + 防止请求暴露,恶意攻击 + 库存预热 + redis信号量 + redis高可用 + 动静分离 + nginx + cdn + 恶意请求拦截 + 网关层 + 流量错峰 + 小米:验证码 + 验证正常请求 + 流量错峰 + 加入购物车 + 结算时间不同,流量错峰 + 限流&熔断&降级 + 限流 + 前端限流 + 点击次数、间隔限制 + 后端限流 ...
谷粒商城——支付宝支付&RSA加密&内网穿透
1、支付支付宝&蚂蚁金服开发者平台:
https://open.alipay.com/platform/home.htm
文档地址:
创建应用对应文档 https://openhome.alipay.com/docCenter/docCenter.htm
网页移动应用文档 https://opendocs.alipay.com/open/200/105304
支付宝支付流程
跳转的页面是根据AlipayTemplate定义的回调地址来进行跳转
1234567 // 服务器[异步通知]页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 // 支付宝会悄悄的给我们发送一个请求,告诉我们支付成功的信息 private String notify_url = "http://member.gulimall.com/memberOrder.html";// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 //同步通知,支付成功, ...
谷粒商城——柔性事务-可靠消息+最终一致性解决方案(异步确保型)
柔性事务-可靠消息+最终一致性解决方案(异步确保型)RabbitMQ延时队列(实现定时任务)场景:
比如未付款订单,超过一定时间后,系统自动取消订单并释放占有物品。
123456+ 常用解决方案 + spring的 schedule 定时任务轮询数据库 + 缺点 + 消耗系统内存、增加了数据库的压力、存在较大的时间误差 + 解决 + rabbitmq的消息TTL和死信Exchange结合
TTL存活时间
DLX死信交换机(Dead Letter Exchanges)
1234+ 模拟延迟场景 + 消息设置30m过期(队列不被监听) + 30m后进入死信交换机 + 消息进入另一个队列(被监听)
延时队列实现
123456+ 给队列设置消息过期时间(推荐)+ 给消息设置消息过期时间+ rabbitmq懒检查 + 只会检查第一个消息是否过期 + 若后面消息ttl小,仍无法出队列 + 所以给队列设置过期时间
基于MQ可靠消息的一致性解决
监听库存解锁:
1234567+ 解锁场景 + 未支付场景、手动取消订单 + 锁定成功,其他业务失败, ...
谷粒商城——幂等性&分布式事务&Raft原理
1、订单链路订单中心电商系统涉及到 3 流,分别时信息流,资金流,物流,而订单系统作为中枢将三者有机的集合起来。
订单模块是电商系统的枢纽,在订单这个环节上需求获取多个模块的数据和信息,同时对这些信息进行加工处理后流向下个环节,这一系列就构成了订单的信息流通。
订单流程
Feign远程异步调用丢失请求头、上下文问题Feign远程调用丢失请求头问题
feign异步情况丢失上下文问题
1234567891011121314+ Feign远程调用丢失请求头问题 + 原因 + fegin调用没带session + 创建一个新request,没有请求头 + 解决(同步老请求cookie) + 加个feign请求调用的拦截器 + ThreadLocal获取老请求请求属性——cookie + 设置新请求cookie+ feign异步情况丢失上下文问题 + 原因 + requecontexHolder底层是同一线程共享数据 + 通过ThreadLocal获取老请求,异步编排非同一线程 + 解决 + 执行异步前, ...
谷粒商城——session共享&sso&ThreadLocal
1、MD5&盐值&BCryptMD5 (Message Digest algorithm 5,信息摘要算法)
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。
5、不可逆
加盐:
1、通过生成随机数与MD5生成字符串进行组合
2、数据库同时存储MD5值与salt值。验证正确性时使用salt进行MD5
123+ Spring的加密 + 自动加盐 + match匹配(与encode匹配)
2、分布式session共享问题:
不同服务session不共享
同一服务session不同步
session原理
分布式session解决方案1、session复制
Session复制(tomcat之间同步)
123456+ 优点: + web-server(Tomcat)原生支持,只需要修改配置文件 + 缺点: + session同步需要数据传 ...
谷粒商城——缓存&分布式锁&检索&异步&线程池
1、缓存缓存失效问题1、缓存穿透:
不存在数据
缓存null、设置短的过期时间
2、缓存雪崩:
大面积同时失效
失效加随机值
3、缓存击穿
热点key失效
加锁
缓存数据一致性解决双写模式:
+ 改完数据库同时改缓存
+ 脏数据
+ 加锁
+ 是否允许暂时不一致性——缓存过期后可读正确数据
失效模式
+ 删除缓存数据
+ 等待下次查询主动更新
解决方案
+ 并发量小不考虑
+ 菜单等,用canal
+ 自动更新缓存(db从库)
+ 数据异构(访问记录表 和 商品 进行分析计算——用户推荐)
+ 过期时间保证 最终一致性
+ 加读写锁
我们系统的一致性解决方案:
1、缓存的所有数据都有过期时间,数据过期下一次查询触发主动更新
2、读写数据的时候,加上分布式的读写锁。 (经常写,经常读)
Spring Cache使用大量aop切面编程,最终都是动态代理机制
12345678910+ @Cacheable:结果缓存 + key、value + ttl + 序列化:json+ @CacheEvict:删除缓存+ @CachePut:调用方法且缓 ...
谷粒商城——性能压测
1、jvm 内存模型
12345678910111213+ 程序计数器 Program Counter Register: + 记录的是正在执行的虚拟机字节码指令的地址, + 此内存区域是唯一一个在JAVA虚拟机规范中没有规定任何OutOfMemoryError的区域 + 虚拟机:VM Stack + 描述的是 JAVA 方法执行的内存模型,每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法接口等信息 + 局部变量表存储了编译期可知的各种基本数据类型、对象引用 + 线程请求的栈深度不够会报 StackOverflowError 异常 + 栈动态扩展的容量不够会报 OutOfMemoryError 异常 + 虚拟机栈是线程隔离的,即每个线程都有自己独立的虚拟机栈 + 本地方法:Native Stack + 本地方法栈类似于虚拟机栈,只不过本地方法栈使用的是本地方法 + 堆:Heap + 几乎所有的对象实例都在堆上分配内存
2、堆所有的对象实例以及数组都要在堆上分配。堆是垃圾收集器管理的主要区域,也被称为“GC堆”;也是我 ...