表级锁的争用状态变量:
show status like ‘table%’;

行级锁争用状态变量:
show status like ‘innodb_row_lock%’;

是否需要拆分微服务 微服务拆分选择_微服务

单体架构的优势:
1、便于开发
2、易于测试
3、易于部署

单体架构的不足:
1、复杂性高
2、交付效率低:构建和部署耗时长
3、伸缩性差:只能按整体横向扩展,无法分模块垂直扩展,IO密集型模块和CPU密集型模块无法独立升级和扩容
4、可靠性差:一个BUG可能引起整个项目的运行
5、阻碍技术创新

微服务架构的优势:
1、易于开发和维护
2、独立部署
3、伸缩性强
4、与组织结构相匹配
5、技术异构性

微服务面临的挑战:
1、服务拆分:
(1)、微服务拆分原则:领域模型、组织结构、康威定律、单一职责
(2)、微服务拥有独立数据库
(3)、微服务之间确定服务边界
2、数据一致性
(1)、可靠性事件模式
(2)、补偿模式-sagas模式
3、服务通信
(1)、通信技术方案:RPC、REST、异步消息
(2)、服务注册和发现
(3)、负载均衡
4、服务网关:
(1)、API Gateway
(2)、为前端服务的后端
(3)、身份认证、路由服务、流量控制、日志统计
5、高可观察
(1)、健康检测、集中控制
(2)、日志聚合及检索
(3)、分布式追踪
6、可靠性(客户端实现):
(1)、流量控制、超时控制
(2)、舱壁隔离(线程隔离),熔断机制
(3)、服务降级,幂等重试

微服务拆分原则:
1、单一职责、高内聚低耦合
2、微服务粒度适中
3、考虑团队结构
4、以业务模型切入
5、演进式拆分
6、避免环形依赖与双向依赖
7、DDD

微服务拆分步骤:
1、分析业务模型:
(1)、弱耦合在一起
(2)、高内聚力
2、确定服务边界:
(1)、服务应包含单一的界限上下文
3、微服务数据库拆分

微服务数据一致性:
1、分布式事务不适用微服务
(1)、2PC会有单点故障
(2)、由于锁的原因降低吞吐量
(3)、Nosql数据库并不支持
2、采用最终一致性来实现数据一致性
(1)、可靠性事件模式:消息队列(支付宝转余额宝)
(2)、补偿模式-sagas模型:一些列的有序事务(每一个事物都有补偿子事务)

技术选型的三要素:
1、技术选型的广度和深度:
2、把握和分析技术选项的优缺点
3、紧密结合项目和团队的情况

Eureka简介:
1、支持跨机房的高可用
2、数据一致性是数据最终一致性
3、Eureka Client会对服务注册表进行缓存,降低Eureka的压力,进一步增强了它的高可用

借助logbook输出HTTP日志
1、pom添加logbook依赖
2、在服务提供者工程添加logbook filter以输出日志
3、在服务消费者工程httpclient添加logbook拦截器

JWT介绍:
1、基于token的进行身份验证的方案
2、jwt设计一个字符串由header、payload、signature组成
3、具备安全、自包含、紧凑等特点

JWT优点:
1、安全性高,防止token被伪造和篡改
2、自包含,减少存储开销
3、跨语言,支持多种语言的实现
4、支持过期,发布者等校验

JWT注意事项:
1、消息体是可以被base64解密成铭文
2、jwt不适合存放大量信息
3、无法作废未过期的jwt(可以借用Redis实现)

Redis的score机制:
可以做商品或房屋的热门商品,每点击一个商品的详情,就往Redis(zset)中添加一个,并只留排名前10的;

级联故障解决方案:
1、舱壁隔离(线程隔离)
2、超时控制
3、服务降级
4、熔断机制

是否需要拆分微服务 微服务拆分选择_是否需要拆分微服务_02

Spring Cloud Sleuth原理:使用的是ThreadLocal,使用的是异步线程
1、疑问:(spring.factories)
(1)、追踪数据是如何生成的
(2)、追踪数据是如何再进程内和进程间传递的
(3)、如何解决跨线程池问题的

进程内根据ThreadLocal进行数据的传递
Hystrix是跨线程池的,业务线程和调用线程是隔离的

用户请求—》TraceFilter—》Trace拦截器—》Controller—》HystrixCallable

—》TraceRestTemplate—》TraceAspect—(可以通过MQ,也可以通过Http请求上报)—》Zipkin Server(ES、Mysql做数据存储)

日志检索方案:
1、ELK介绍
(1)、Elasticsearch(日志存储)
(2)、LogStash(负责日志收集)
(3)、Kibana(进行日志图形化展示)

查看日志信息:less info.log

本地缓存:

private final Cache<String, String> registerCache =
 CacheBuilder.newBuilder().maximumSize(100).expireAfterAccess(15, TimeUnit.MINUTES)
 .removalListener(new RemovalListener<String, String>()

{

@Override
        public void onRemoval(RemovalNotification<String, String> notification) {
          String email = notification.getValue();
          User user = new User();
          user.setEmail(email);
          List<User> targetUser = userMapper.selectUsersByQuery(user);
          if (!targetUser.isEmpty() && Objects.equal(targetUser.get(0).getEnable(), 0)) {
            userMapper.delete(email);// 代码优化: 在删除前首先判断用户是否已经被激活,对于未激活的用户进行移除操作
          }

        }
      }).build();

private final Cache<String, String> resetCache = CacheBuilder.newBuilder().maximumSize(100).expireAfterAccess(15, TimeUnit.MINUTES).build();

微服务的消费模式:
1、服务直连模式(RestTemplate)特点:简洁明了、平台语言无关性、无法保证服务的可用性、生产环境比较少用
2、客户端发现模式:
(1)、服务实例启动后,将自己的位置信息提交到服务注册表
(2)、客户端从服务注册表进行查询,来获取可用的服务实例
(3)、客户端自行使用负载均衡算法从多个服务实例中选择出一个
3、服务端发现模式

微服务的消费者:
1、HttpClient(RestTemplateBuilder)
2、Ribbon(基于客户端的负载均衡器(加权、随机、轮询算法))(RestTemplateBuilder+配置)
3、Feign:

使用API网关的意义:
1、API网关的意义:
(1)、集合多个API
(2)、统一API入口
2、常见API网关的实现方式:nginx、zuul、getaway

API网关带来的好处:
1、避免将内部信息泄露给外部
2、能给API添加额外的安全层
3、可以降低API调用的复杂度
4、微服务模拟与虚拟化

zuul简介:
1、功能:认证、压力测试、动态路由、负载削减、安全、静态响应处理、主动交换管理等

服务熔断:
1、断路器
2、断路器模式

熔断器的意义:
1、好处:
(1)、系统稳定
(2)、减少性能损耗
(3)、及时响应
(4)、阀值可定制

熔断器的功能:
1、异常处理
2、日志记录
3、测试失败的操作
4、手动复位
5、加速断路
7、重试失败请求

微服务的高级主题----自动扩展
1、什么是自动扩展
(1)、垂直扩展:就是升级(双核变四核)
(2)、水平扩展:就是数量变多(1台主机增加到4台主机)
2、自我注册和自我发现(服务注册表(Eureka)、客户端、微服务实例)
3、自动扩展的意义:
(1)、提高了高可用性和容错能力
(2)、增加了可伸缩性
(3)、具有最佳使用率,并节约成本
(4)、优先考虑某些服务或服务组

自动扩展的常见模式:
1、自动扩展的不同级别:应用程序级别、基础架构级别

如何实现微服务的自动扩展:
1、要思考的问题:
(1)、如何管理数千个容器
(2)、如何监控他们
(3)、在部署工作时如何应用规则和约束?
(4)、如何利用容器来获得资源效率?
(5)、如何确保至少有一定数量的最小实例正在运行?
(6)、如何确保依赖服务正常运行?
(7)、如何进行滚动的升级和优雅的迁移?
(8)、如何回滚错误的部署?
2、所需功能:依赖两个关键功能
(1)、一个容器抽象层,在许多物理或虚拟机上提供统一的抽象
(2)、容器编排和初始化系统在集群抽象之上只能管理部署
3、容器编排:
(1)、容器编排工具提供了一个抽象层来处理大规模的集装箱部署
(2)、具备发现、资源管理、监控和部署等功能
3、容器编排工作职能:
(1)、集群管理
(2)、自动部署
(3)、可伸缩性
(4)、运行状况监控
(5)、基础架构抽象
(6)、资源优化
(7)、资源分配
(8)、服务可用性
(9)、敏捷性
(10)、隔离

资源分配常用算法:
1、常用算法:
(1)、传播:将负载平均分配到各个主机上
(2)、装箱:负载先把第一台主机用完了,在用其它主机,按需付费
(3)、随机:负载随机选择主机

常见容器编排技术:
(1)、Docker Swarm
(2)、Kubernetes
(3)、Apache Mesos