Java后端面试题(微服务相关2)(day13)
目录
- Gateway的三大属性
- Gateway的三大案例组件
- 为什么要用服务网关
- 不同服务之间如何进行通信
- 在微服务中如何监控服务
- Openfeign如何使用
- Openfeign自定义拦截器
- Seata中2PC和3PC的区别
- 项目的几种发布方式和特点
- MongoDB和mysql区别
- 什么是分布式锁,Redisson有什么用?
- 下单请求三重防重
Gateway的三大属性
-
路由(route):由ID、目标URI、断言集合和过滤器集合组成。如果聚合断言结果为真,则转发到该路由
-
断言(Predicate): 路由的筛选条件,允许开发人员匹配 HTTP 请求中的任何内容,比如请求头、请求参数或请求路径
-
过滤器(filter):可以在返回请求之前或之后修改请求和响应的内容
- 生命周期
- PRE:前置过滤器,在请求被路由目标服务之前调用
- POST:后置过滤器,在路由到微服务以后执行
- 作用范围
- 局部过滤器: GatewayFilter,应用到单个路由或者一个分组的路由上(需要在配置文件中配置)
- 全局过滤器: GlobalFilter,应用到所有的路由上(无需配置,全局生效)
- 生命周期
Gateway的三大案例组件
LogTime
:下游接口耗时TokenGlobalFilter
:全局Token认证TraceGlobalFilter
:traceId全局链路跟踪
为什么要用服务网关
- 简化客户端的工作
- 降低函数间的耦合度
- 解放开发人员把精力专注于业务逻辑的实现
不同服务之间如何进行通信
可以使用OpenFeign来实现不同服务之间的通信。
OpenFeign是一个声明式的Web客户端,它可以简化编写Web服务客户端的代码。它是Spring Cloud的一部分,主要用于简化与RESTful服务的集成。
在微服务中如何监控服务
可使用Skywalking实现服务监控,Skywalking是一个分布式系统的应用程序性能监控工具 (Application Performance Managment),提供了完善的链路追踪能力。
- skywalking主要可以监控接口、服务、物理实例的一些状态,特别是在压测的时候可以看到众多服务中哪些服务和接口比较慢
- skywalking还可以设置告警规则,如果项目出现bug可对开发人员进行通知,以便在第一时间进行修复
Openfeign如何使用
- 引入依赖
- 编写FeignClient接口
- 在启动类中开启对OpenFeign注解的支持
- 注入FeignClient
- 发起调用,像调用本地方法一样调用远程服务
Openfeign自定义拦截器
可以通过在OpenFeign中自定义拦截器的方式,来实现服务远程调用过程中的日志输出、认证授权等应用。
自定义拦截器步骤:
- 继承
RequestInterceptor
类 - 实现apply方法,编写相应逻辑
- 将拦截器类放入Ioc容器中
Seata中2PC和3PC的区别
XA协议包括两阶段提交(2PC)和三阶段提交(3PC)两种实现
-
2PC(二阶段提交协议)
- 第一阶段:预提交阶段
由事务协调者询问通知各个事务参与者,是否准备好了执行事务 - 第二阶段:提交阶段
协调者收到各个参与者的准备消息后,根据反馈情况通知各个参与者commit
提交或者rollback
回滚
- 第一阶段:预提交阶段
-
3PC(三阶段提交协议)
- 第一阶段:准备阶段
协调者向参与者发送canCommit
请求,判断是否具备执行条件,参与者如果可以提交就返回Yes
响应,否则返回No
响应 - 第二阶段:预提交阶段
协调者根据参与者的反应情况来决定是否可以进行事务的PreCommit
操作 - 第三阶段:提交阶段
协调接收到所有参与者发送的ACK响应,根据反馈情况通知各个参与者commit
提交或者rollback
回滚
- 第一阶段:准备阶段
-
区别:与2PC相比,3PC降低了阻塞时长,加入了超时机制,并且在等待超时后,协调者或参与者会中断事务,避免了协调者单点问题,阶段三中协调者出现问题时,参与者会继续提交事务,但是数据不一致问题仍然存在。
项目的几种发布方式和特点
- jar包发布
jar包发布过于依赖于环境 - docker发布
docker发布虽然解决了环境依赖问题,但是不好管理 - k8s发布
k8s发布可以进行流量监控,针对流量规模对容器进行自动伸缩,可以热部署,可结合cicd自动发布,容器的自动化编排,还可以在yaml配置文件里设置调优参数
MongoDB和mysql区别
- MongoDB是文档型非关系型数据库,mysql是关系数据库。
- MongoDB比较灵活,相比mysql不用建表就可以直接进行存储,针对变化比较频繁的场景,MongoDB比较适合。
- 使用场景不同,MongoDB是首页,包括我们的一些活动页,快速开发,快速迭代,MongoDB后台。
什么是分布式锁,Redisson有什么用?
分布式锁 确保在同一时间只有一个节点能获得对共享资源的独占访问权限,从而解决并发访问问题。
Redisson锁,简称看门狗,通过对分布式锁进行独特的续命机制,既避免了锁的时间过长造成的效率低下,又避免了锁的时间不够,业务未执行完时资源被其他线程抢占的问题。
原理:当锁的剩余时间到某个阈值时,业务仍未执行完,就会对锁进行续命,延长锁的时间,直至业务执行完成。
下单请求三重防重
- 前端:用户点击下单后显示loading层,或者按钮置灰,防止重复发送请求
- 后端
- redis分布式锁:处理完该用户一个下单请求后会设置一个分布式锁(比如实际场景中一般5秒内不会下单两次)
- Redisson锁(看门狗):如果业务执行时间超过五秒,就会通过看门狗机制对锁进行续命,直到业务执行结束。