小结-微服务项目
1.1 高可观察性
1.1.1 log4j2日志框架
1.1.1.1 log4j2的链接步骤
1.1.1.2 log4j2配置文件的编写,Trace、Span的输出
1.1.1.3 与logback架构的对比
1.1.1.4 log4j2的优点
1.1.1.4.1 高性能、异步化
1.1.1.4.2 插件化易扩展
1.1.1.4.3 Garbage free、自动降级
1.1.2 全链路追踪系统
1.1.2.1 全链路跟踪背景
1.1.2.1.1 串联调用链
1.1.2.1.2 理清服务依赖关系
1.1.2.1.3 接口性能分析
1.1.2.1.4 跟踪业务处理流程
1.1.2.2 全链路追踪解决方案
1.1.2.3 SpringCloud Sleuth
1.1.2.3.1 介绍
1.1.2.3.1.1 优点
1.1.2.3.1.1.1 spring组件集成
1.1.2.3.1.1.2 Zipkin输出
1.1.2.3.1.1.3 支持HTTP\MQ
1.1.2.3.1.2 基本概念
1.1.2.3.1.2.1 Trace
1.1.2.3.1.2.2 Span
1.1.2.3.1.2.3 Annotation
1.1.2.3.2 接入步骤
1.1.2.3.2.1 引入依赖
1.1.2.3.2.2 日志配置添加追踪变量
1.1.2.3.2.3 配置文件添加Sleuth配置及Zipkin配置
1.1.2.3.3 实验
1.1.2.3.3.1 发启调用,通过traceid来跨服务查看日志
1.1.2.3.3.2 构造调用出错情况,观察Zipkin UI的输出
1.1.2.3.4 Zipkin Server的搭建
1.1.2.3.4.1 搭建步骤
1.1.2.3.4.2 观察Zipkin ui的服务调用输出
1.1.2.3.4.3 查看服务间的依赖
1.1.2.3.5 跟踪代码,图解SpringCloud Sleuth的工作原理
1.1.3 集中式日志检索
1.1.3.1 ELK架构
1.1.3.1.1 Logstash
1.1.3.1.1.1 组成部分
1.1.3.1.1.1.1 input plugin
1.1.3.1.1.1.1.1 file
1.1.3.1.1.1.1.1.1 path
1.1.3.1.1.1.1.1.2 sincedb_path
1.1.3.1.1.1.1.1.3 codec
1.1.3.1.1.1.1.1.4 multiline支持多行输出
1.1.3.1.1.1.2 out plugin
1.1.3.1.1.1.2.1 grok,编写日志表达式
1.1.3.1.1.1.3 filter plugin
1.1.3.1.1.2 安装
1.1.3.1.2 Elasticsearch
1.1.3.1.2.1 基本概念
1.1.3.1.2.1.1 index
1.1.3.1.2.1.2 Mapping
1.1.3.1.2.1.3 Shard
1.1.3.1.2.1.4 Replicas
1.1.3.1.2.2 安装
1.1.3.1.3 Kibana
1.1.3.1.3.1 Management
1.1.3.1.3.1.1 添加index
1.1.3.1.3.2 Dev Tools
1.1.3.1.3.2.1 操作ES
1.1.3.1.3.3 Discover
1.1.3.1.3.3.1 日志检索及语法
1.1.3.1.3.4 Visualize
1.1.3.1.3.4.1 图表统计
1.2 API Gateway
1.2.1 安全
1.2.1.1 身份证的方案演进
1.2.1.1.1 基于session的身份认证
1.2.1.1.2 基于Token的身份验证
1.2.1.1.3 基于JWT的token身份认证
1.2.1.2 鉴权
1.2.1.2.1 鉴权时序图
1.2.1.3 JWT
1.2.1.3.1 优点
1.2.1.3.1.1 安全性高
1.2.1.3.1.2 自包含
1.2.1.3.1.3 跨语言
1.2.1.3.1.4 支持过期、发布者校验
1.2.1.3.2 注意事项
1.2.1.3.2.1 消息体可被base64解密成明文
1.2.1.3.2.2 JWT不适合放大量信息
1.2.1.3.2.3 无法作废未过期的JWT
1.2.2 架构
1.2.2.1 BFF
1.2.2.2 聚合服务
1.2.2.3 瓶颈
1.2.3 框架
1.2.3.1 zuul
1.2.3.2 Kong
1.2.4 职责
1.2.4.1 限流
1.2.4.2 鉴权
1.2.4.3 跨域
1.2.4.3.1 SpringBoot CORS
1.2.4.4 日志
1.2.4.5 路由
1.3 编码技巧
1.3.1 异常统一处理
1.3.1.1 异常处理器ExceptionHandler
1.3.1.2 异常到错误码的映射
1.3.2 Logbook Http日志组件
1.3.2.1 在服务提供者添加logbook filter输出日志
1.3.2.2 在服务消费者工程HttpClient添加logbook拦截器
1.3.2.3 日志输出格式http、curl、json
1.3.3 接口设计
1.3.3.1 用户服务接口设计
1.3.3.2 房产服务接口设计
1.3.3.3 评论博客服务接口设计
1.3.4 接入Spring Data Redis的步骤、安装redis
1.3.5 接入Swagger暴露API文档
1.4 服务通信
1.4.1 服务注册与发现
1.4.1.1 SpringCloud Eureka
1.4.1.1.1 Eureka简介
1.4.1.1.2 创建Eureka Server的步骤
1.4.1.1.3 Eureka配置项的含义
1.4.1.1.3.1 保护模式
1.4.1.1.3.2 自注册
1.4.1.1.3.3 续约过期时长
1.4.1.1.3.4 续约心跳间隔
1.4.1.1.3.5 监控检查上报
1.4.1.1.4 创建服务提供者步骤
1.4.1.1.5 创建服务消费者的步骤
1.4.1.1.6 Eureka DashBoard监控项含义
1.4.1.1.7 实验
1.4.1.1.7.1 一般性实验
1.4.1.1.7.1.1 观察服务启动对应注册中心Eureka的变化
1.4.1.1.7.1.2 观察服务平滑停止对应注册中心Eureka的变化
1.4.1.1.7.1.3 观察服务墙绘停止对应注册中心Eureka的变化
1.4.1.1.7.1.4 触发保护模式开启后的效果
1.4.1.1.7.1.5 开启健康上报,当服务不健康时对应注册中心Eureka的变化
1.4.1.1.7.2 高可用实验
1.4.1.1.7.2.1 关闭所有Eureka Server观察服务运行情况
1.4.1.1.7.2.2 高可用模式下关闭一个Eureka Server观察服务运行情况及注册表的变化
1.4.1.1.8 高可用集群搭建
1.4.1.1.8.1 搭建两个Eureka Server互相注册
1.4.1.1.8.2 创建两个配置文件,通过制定不同profile来启动
1.4.1.1.9 图解SpringCloud Eureka的工作原理
1.4.1.1.10 SpringCloud Eureka的核心特性
1.4.1.1.10.1 高可用
1.4.1.1.10.2 用户认证
1.4.1.1.10.3 Client对注册表缓存
1.4.1.1.10.4 保护模式(解决网络分区问题)
1.4.1.1.10.5 支持通过健康状态判断服务存活
1.4.1.1.10.6 RESTFul API(REST端点)
1.4.1.1.11 SpringCloud Eureka的缺点
1.4.1.1.11.1 不支持事件通知
1.4.1.2 服务注册与发现的概念及流程图
1.4.1.3 @EnableDiscoverClient含义
1.4.2 通信框架
1.4.2.1 RestTemplate
1.4.2.1.1 Spring RestTemplate介绍
1.4.2.1.2 创建RestTemplate Bean
1.4.2.1.2.1 创建HttpClient Bean
1.4.2.1.2.1.1 连接复用
1.4.2.1.2.1.2 最大连接数
1.4.2.1.2.1.3 单个IP最大连接数
1.4.2.1.2.1.4 读超时
1.4.2.1.2.1.5 连超时
1.4.2.1.2.1.6 添加拦截器支持Httplog输出
1.4.2.1.2.2 集成HttpClient
1.4.2.1.2.3 集成Fastjson作为序列化工具
1.4.2.1.2.4 添加@LoadBalanced注解
1.4.2.1.2.5 同时支持连接池、直连、负载均衡
1.4.2.1.3 对RestTemplate进行分装
1.4.2.1.4 约定服务接口数据协议
1.4.2.1.4.1 通信协议结果对象
1.4.2.2 SpringCloud Feign
1.4.3 负载均衡
1.4.3.1 SpringCloud Ribbon
1.4.3.1.1 Ribbon介绍
1.4.3.1.2 接入Ribbion
1.4.3.1.2.1 服务消费者接入ribbion的步骤(通过Eureka方式)
1.4.3.1.2.2 服务消费者接入ribbion的步骤(脱离Eureka方式)
1.4.3.1.3 自定义Ribbon配置
1.4.3.1.3.1 Java代码方式自定义Ribbion配置
1.4.3.1.3.1.1 创建客户端配置
1.4.3.1.3.1.1.1 IPing(发送ping)Bean
1.4.3.1.3.1.1.2 IRule(负载均衡策略)Bean
1.4.3.1.3.1.2 通过@RibbonClient指定客户端配置类
1.4.3.1.3.2 使用属性自定义Ribbion配置
1.4.3.1.3.2.1 配置属性前缀
1.4.3.1.3.2.2 配置负责均衡策略
1.4.4 Eureka、Ribbon、RestTemplate整合的工作原理(图解)
1.5 单体与微服务比较
1.5.1 单体的优势
1.5.1.1 易测试
1.5.1.2 易开发
1.5.1.3 易部署
1.5.2 单体的不足
1.5.2.1 复杂性高
1.5.2.2 交付率低
1.5.2.3 伸缩性差
1.5.2.4 可靠性差
1.5.2.5 阻碍技术创新
1.5.3 微服务定义
1.5.4 微服务的优势
1.5.4.1 易于开发维护
1.5.4.2 独立部署
1.5.4.3 伸缩性强
1.5.4.4 与组织结构相匹配
1.5.4.5 技术异构性
1.5.5 微服务的挑战
1.5.5.1 服务拆分
1.5.5.2 数据一致性
1.5.5.3 服务通信
1.5.5.4 服务网关
1.5.5.5 高可观察
1.5.5.6 可靠性
1.5.6 微服务最佳实践
1.5.6.1 代码脚手架
1.5.6.2 为每个微服务分配独立数据库
1.5.6.3 正确对待共享库
1.5.6.4 自动化部署
1.5.6.5 持续化集成
1.5.6.6 单体架构向微服务架构迁移的时机
1.5.6.7 SOA VS 微服务
1.6 微服务拆分原则和方法
1.6.1 拆分原则
1.6.1.1 单一职责
1.6.1.2 高内聚低耦合
1.6.1.3 团队结构(康威定律)
1.6.1.4 服务拆分粒度适中
1.6.1.5 演进式拆分
1.6.2 好的微服务架构具备的特征
1.6.3 微服务拆分步骤
1.6.3.1 分析业务模型
1.6.3.2 划分限定上下文
1.6.3.3 确定服务边界(分析共享模型)
1.6.4 数据库拆分
1.6.4.1 用户库
1.6.4.2 房产库
1.6.4.3 评论库
1.6.5 服务拆分
1.6.5.1 API Gateway
1.6.5.2 房产服务
1.6.5.3 用户服务
1.6.5.4 评论服务
1.7 技术选型和架构设计
1.7.1 技术选型三要素
1.7.2 SpringCloud介绍
1.7.3 SpringCloud的引入
1.7.4 架构设计原则
1.7.4.1 满足功能性需求
1.7.4.2 考虑非功能性需求(扩展性、稳定性、可维护性、伸缩性、高可用、高性能)
1.7.4.3 好的架构是演进来的
1.7.4.4 KISS原则、最小化产品
1.7.5 房产销售平台微服务架构设计
1.7.5.1 网关服务
1.7.5.2 业务服务
1.7.5.2.1 用户服务
1.7.5.2.2 评论服务
1.7.5.2.3 房产服务
1.7.5.3 监控
1.7.5.4 日志聚合
1.7.5.5 基础组件
1.7.5.6 存储
1.8 数据一致性
1.8.1 分布式事务不适用微服务
1.8.2 最终一致性
1.8.2.1 可靠事件模式
1.8.2.2 补偿模式Sagas
1.9 可靠性
1.9.1 级联故障
1.9.1.1 发生过程
1.9.1.2 解决方法
1.9.1.2.1 舱壁隔离
1.9.1.2.2 超时控制
1.9.1.2.3 服务降级
1.9.1.2.4 熔断机制
1.9.2 SpringCloud Hystrix断路器介绍
1.9.2.1 断路器工作流程
1.9.3 Spring Hystrix接入
1.9.3.1 接入步骤
1.9.3.2 Hystrix的核心配置
1.9.3.2.1 断路策略(线程池or信号量)
1.9.3.2.2 超时时间
1.9.3.2.3 断路休眠时间
1.9.3.2.4 线程数量
1.9.3.2.5 数据收集时间窗口
1.9.3.2.6 断路开关阀值
1.9.3.3 降级方法的编写与最佳实践
1.9.4 实验
1.9.4.1 模拟级联故障的场景观察线程执行情况
1.9.4.2 编写频繁发请求脚本观察线程池是否占满及日志输出
1.9.4.3 执行发请求脚本最终观察有无断路器开关打开的日志
1.9.4.4 断路器打开后等待10秒观察是否恢复
1.9.5 Hystrix Dashboard
1.9.5.1 5种状体
1.9.5.2 服务调用QPS
1.9.5.3 服务调用平均延时
1.9.5.4 错误率
1.9.5.5 服务调用线程池运行情况
1.9.6 图解SpringCloud Hystrix工作原理
1.10 源码剖析技巧
1.10.1 深度使用
1.10.2 积累疑问
1.10.3 找到源码入口
1.10.4 图形梳理强化记忆