编程思想
传统企业
OA、CRM、ERP。三层架构就可以满足需求。
解决四个大问题:
- 这么多服务,客户端如何访问
- API 网关:Zuul、Spring Gateway
- 这么多服务,服务之间如何通信
- 同步通信:对外REST对内RPC、HTTP、RPC Dubbo Thrift
- 异步通信: MQ,RocketMQ RabbitMQ
- 这么多服务,服务如何治理
- 注册中心:Eureka、Nacos
- 链路追踪:ZipKin、SkyWalking
- 日志收集:ELK
- 这么多服务,服务挂了怎么办
- 熔断机制:Sentinel
- 负载均衡:Nginx、Istio
Zookeeper 不是用来做注册中心的,它是分布式协调技术分布式锁实现。ztree -> znode -> 有序节点(这个可以让Dubbo注册在上面,所以可以实现注册中心,但是性能非常低)
Dubbo(内部注册中心没有开放,所以可以使用Zookeeper来做注册中心,但阿里说Zookeeper可靠性不保证) -> Zookeeper
Zookeeper 是 CP,所以不能拿来做注册中心,注册中心必须得是AP
所以应该用 Dubbo(通信框架) -> Nacos (AP,注册中心)
- Dubbo 网关、熔断、治理(Zookeeper)
- Spring Cloud 编程模型 -> 一系列的接口
- Spring Cloud Netflix 一站式微服务解决方案
- Spring Cloud Alibaba 一站式微服务解决方案
分布式锁最好用 Redisson 分布式锁 RedLock
拆分微服务的过程叫重构 -> 《重构:改善既有代码的设计》
JavaEE 单一应用,单体应用程序, 一个模块可能会影响另一个模块。
- 三层架构
- 视图层
- 账单模块 Controller
- 用户模块
- 支付模块
- 登录模块
- 注册模块
- 业务层 Service
- 账单模块
- 用户模块
- 支付模块
- 登录模块
- 注册模块
- 数据层 Controller
- 账单模块
- 用户模块
- 支付模块
- 登录模块
- 注册模块
- 视图层
三层架构:
- 服务A 192.168.0.1
- 视图层 Controller
- 账单模块
- 业务层 Service
- 账单模块
- 数据层 Dao
- 账单模块
- 视图层 Controller
- 服务B 192.168.0.2
- 视图层 Controller
- 用户模块
- 业务层 Service
- 用户模块
- 数据层 Dao
- 用户模块
- 视图层 Controller
…. 共有五个服务,这个叫分布式
为了满足互联网企业,电商(亿级、百万级并发)高并发需求,需要微服务架构。
微服务架构:是一种架构思想,结构就是为了解耦,实际的开发方式就是分布式系统开发。
Spring Boot + Spring Cloud
Spring Cloud 是一个编程模型,微服务开发的一种标准,一系列的接口。
具体实现
- Spring Cloud Netflix 网飞
- Spring Cloud Alibaba 阿里巴巴
满足三大指标
- 高可用: 服务一直可以用,N个9, 6个9 99.9999% 允许宕机的时间是(31,536,000 * 0.000001) 31.536 秒
- 高性能: 响应速度快,3s内有响应
- 高并发:系统承载能力,并发量大后 -> OOM -> 宕机 -> 重启 -> 需要时间20s
如何应对高并发
- 垂直扩展: 升级服务器配置,但会有性能瓶颈
- 水平扩展:多买服务器 -> 负载均衡(轮询、HASH 一致: 判断地区一直访问、权重: 根据电脑配置设置权重,性能高权重大多访问)
- 1 CPU 4核心 32G 192.168.0.1 200
- 注册模块
- 1 CPU 4核心 32G 192.168.0.2 200
- 订单模块
- 1 CPU 4核心 32G 192.168.0.3 200
- 注册模块
- 1 CPU 2核心 32G 192.168.0.4 150
- 注册模块
- 1 CPU 4核心 32G 192.168.0.1 200
系统
计算密集型 CPU
- 2CPU 8核 16GB
内存密集型 内存 - 1CPU 2核 128GB
用户分地区 延时 100ms
用户 -> IP(分辨) -> CDN 内容分发网络
- 广州 1CPU 172.1.0.1
- 北京 1CPU 172.2.0.1
- 上海 1CPU 172.3.0.1
- 南京 1CPU 172.4.0.1
领域驱动设计(DDD): 将一个服务拆为多个小服务,订单服务拆分为账单、商品、支付
单点故障:1.(主从,读写分离)
数据库:(B + Tree、Page 16KB,单表索引次数限制,单表数据量最大2100w条,超过后查询效率将降低)。分库分表,分布式数据库中间件
- 垂直扩展,多库单表
- 水平扩展,一个数据库存放0-9个USER表,可以存2亿条数据,那么两个数据库可以放4亿,数据库集群
中心化:2. 多个主从集群会出现主主冲突即主键冲突。(双活数据中心,就是数据库步长不为1,同步后就是连续的)。 3. 分布式主键(雪花算法)lang类型(多活数据中心)4. 数据库地区不一样(异地多活数据中心)
查询问题 -> 配置多数据源(物理查询,查询效率低)
- SELECT * FROM ‘user_0’.’user_0’;
- SELECT * FROM ‘user_1’.’user_1’;
逻辑查询
- SELECT * FROM user; -> 发送给专门处理物理查询服务 -> 分布式数据库中间件(MyCat -> 重启了Alibaba淘汰了的分库分表项目 Apache Sharding-Sphere -> 当当网 -> Apache)
Apache Sharding-Sphere
- Shariding-JDBC -> 源码里有依赖,有一定的侵入性
- Sharding-Proxy -> 分布式数据库中间件,单独部署
- Sharding-Sidecar -> k8s 里,高可用、高性能、高并发
DELETE 物理删除:
UPDATE states = 1 逻辑删除
分布式数据库中间件服务(高内聚,低耦合 确定边界): 用来解析SQL,配置多数据源,分库分表规则(分片)
CAP 定论与BASE理论
CAP 定理
- 一致性(Consistency):更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致
- 可用性(Availability): 可用性,服务一直可用,而且在正常响应时间
- 分区容错性(Partition tolerance):分区容错性,即分布式系统在遇到某节点或网络分区故障的时候,任然能够对外提供满足一致性和可用性服务
无法同时满足CAP,只能满足三个两项
C 一致性 -> 强一致性,原子性
- 强一致性
- 弱一致性
- 顺序一致性
- 最终一致性
A 可用性 -> 高可用 + 高性能
P 分区容错性 -> 一致性与容错性不兼容
CP 强一致性系统 -> 金融系统
AP 高可用性系统 -> 互联网(不涉及钱)
两地三活(两地(广州深圳)。三活,三个机房):备用机房一个月前就挂了,一个月后AB机房也挂了,这样就会导致丢失了一个月数据。
如果备用机房启用1%,一直同步而且关注则可以避免这个问题。
BASE 理论
电商
- 双十一 天猫购物街 B(商家香奈儿)2B(天猫)2C(用户)
- 无法注册
- 基本可用用 -> 重要业务,浏览大促商品,促进成交(订单,支付)
- 双十二 淘宝狂欢节 C(卖家)2C(买家)
数据最终要落盘,持久化
- 强一致性:要么一写进来,要么一起不写进来
- 弱一致性
- 顺序一致性
- a b c d
- 1 2 3 4 按照 1234来存储
- 最终一致性 (5分钟)
- a b c d
- 1 2 3 4 可用不按顺序来1324
- 顺序一致性
微服务架构设计模式
概述
微服务能在企业发挥积极作用,因此了解微服务(MSA)设计的一般目标或原则,以及一些微服务的设计模式,都是很有意义的
- 降低成本:MSA降低IT服务的设计、实现和管理的总体成本
- 提高交付速度:MSA能够提高服务的实现速度
- 增强健壮性:MSA能够增强我们服务网络的健壮性
- 提供可视化支持:MSA能够为服务和网络提供更好的可视化支持
微服务架构的构建原则
- 伸缩能力 -> 自动扩缩容K8S
- 可用性 -> 崩溃恢复 -> 自动重启 K8S
- 健壮性
- 弹性 -> K8S
- 独立的匿名服务
- 去中心化的治理 -> 服务治理 -> K8S + istio
- 故障隔离
- 自动供给 -> K8S
- 通过DevOps实现持续交付 -> GitLab Jenkins
- Kubernetes 容器编排系统(要先会Docker)
Raft 是能够实现分布式系统强一致性的算法,每个系统节点有三种状态 Follower,Candidate,Leader。实现 Raft 算法两个最重要的事是:选主和复制日志
容器化技术 Docker,一次构建到处运行
DevOps 自动化运维
AIOps 人工智能运维 2018
MQ + WebFlux Spring5 -> Netty
BIO 同步并阻塞
NIO 异步并阻塞
AIO 异步非阻塞
事务拆分模式
时间开发可能不会去使用两阶段提交,因为性能比较低。我们可能需要使用一些框架,例如 LCN, Seata
扼杀者模式
不断将接口改为微服务的接口,然后一点点替代原来的单体程序。
舱壁模式
例如使用Docker,进程级隔离,还可以定制CPU最大使用率,防止一个程序崩掉以后,影响到其他进程里的程序。
sidecar 模型
边车模式,相当于插件一样,可以直接注入到程序里,但是不会对业务产生影响,例如k8s的监控系统。
集成模式
API 网关模式
对外提供统一入口(REST),对内RPC
聚合模型
例如B站,每个频道(直播、动画、鬼畜…)都有一个接口,接口多了不好管理。搞一个服务来接收这些接口,然后对外只需要调用这个服务就可以拿到这些接口,这就是聚合模式。
- 前台 -> 访问数据中台 index拿到所有频道 :直播、动画、鬼畜…
- 数据中台 -> apis/index: 聚合模式
- 后台:直播、动画、鬼畜…
代理模式
按功能划分网关
路由网关模式
不同于API网关,它只管路由
链式微服务模式
例如A服务调用B服务,B服务调用C服务
分支模式
分支模式是链式模式与聚合模式的混合体,服务既可以是提供者也可以是消费者
客户端分解模式
前后分离截图
阿里云服务器
数据库模式
服务独占数据库
一个服务一个数据库
服务共享数据库
在扼杀者模式(转换、共享、终结)共享阶段中,让微服务与单体应用共存共享。
命令查询隔离
读写分离,读一个服务,写一个服务
事件源
每个过程都用使用事件来驱动,用队列实现。
Saga 模式
- 中心化:类似ROS的MSG消息机制
- 去中心化
观察模式
日志聚合
AOP 收集日志
性能指标
推和拉,k8s使用普罗米修斯拉取性能指标
蓝绿部署模型
两个机房或者两个服务器组,v1老版本升级到v2新版本。用负载均衡直接切到v2新版本,如果有问题可以秒切回v1版本。
拆分微服务
K8S 高级
TiDB 概述
传统的关系型数据库 MySQL
- 读写分离 -> MySQL 集群
- 数据分片 -> MyCAT Sharding-Sphere
- 数据缓存 -> Redis 集群
- 分布式主键 -> Leaf-snowflake 雪花算法
Redis
newSQL:分布式数据库 TiDB(国产)
- SSM -> MyBatis -> MySQL (TiDB) -> 关注业务本身
- TiDB -> 缓存
- TiDB -> 分布式事务
- TiDB -> 分布式主键
- TiDB -> 数据分片
- 系统要求
- 单节点 内存 64G 起
- 数据卷必须是本地卷 -> 固态硬盘 -> 单独的磁盘(用新的分区)
- 可以选择做一个专门的k8s来部署数据库
- 集群节点最少为 3
- 系统要求
1 主 5 从 TiDB 金融级(效率极高)
高可用、高性能、金融级、分布式数据库
互联网企业发展脉络
- 第一阶段:入门期,搭架子,做项目,微服务架构
- 第二阶段:发展期,大数据,精准推销
- 第三阶段:大数据 + 人工智能阶段
- 第四阶段:人工智能 + 区块链 BAT
- 区块链,大同,全球计算机做出超级计算机
微服务开始 -> 还不成熟,标准化过程,ServiceMesh 服务网格化,Istio
大数据阶段 -> 基于微服务架构BI商业智能大数据解决方案
- 计算引擎
- Hadoop
- Spark
- 数据仓库
- Hive
- ElasticSearch
- Hbase + Phoenix
- ETL
- Spoon
- kettle
- 流式计算
- Strom
- Flink
- Blink(-)
- 数据可视化
- PowerBI 微软
人工智能
- Tensorflow
- Pytoch
区块链
- Hyperledger Ethereum
一个企业发展到区块链阶段最少需要 5 - 7 年
- 本文作者: MISAKIGA
- 本文链接: https://misakiga.github.io/2021/03/17/k8s/编程思想/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!
