华为OD一面

红富
2023-12-01

介绍

介绍一下你的项目,技术栈?
前端:ant-design基于react
后端:SpringCloud基于SpringBoot
中间件:Redis,Rabbitmq,Xxl-job
数据库:Oracle,MySQL,ElasticSearch
日志:elk
链路追踪:skywalking
接口文档:swagger

1. 微服务和单体服务有什么区别?

微服务单体应用
服务间调用存在网络延迟本地调用无延迟
资源利用率更高,各服务可按需分配资源统一分配资源
服务扩展方便,精准资源分配扩展麻烦
需要维护额外的注册中心,远程调用等不需要维护
服务解耦,复杂性低高耦合

2. 你们微服务是如何进行服务划分的?

拆分方式特点
功能拆分按公共性比较高,功能独立进行拆分
业务拆分按业务关联度,业务解耦进行拆分

拆分要尽量满足的要求:
服务拆分要尽量迎合业务需要
拆分后的维护成本要低于拆分前
服务拆分相应的组织结构也要做调整
服务拆分结果应当提高了系统的可扩展性
考虑软件发布频率

注:拆分要求发生冲突的时候,要有个优先级排序
拆分也要考虑团队规模,比如按业务拆分可5个可10个,人少那就选5个

3. 你们注册中心用的是什么?
我们注册中心用的是Eureka。它的作用是为服务提供注册与发现,client向server进行注册,server同步给client服务注册列表

4. 讲一下心跳检测?
客户端每隔30s向服务端发送心跳续约,没有心跳服务端则更新服务列表,同步给其他服务

5. 如果服务挂了还没来的及更新列表,请求出问题怎么办?
一段时间内,如果达到请求次数,且达到故障百分比,会进行服务熔断,后续请求直接返回失败,也可以进行降级处理

6. 服务之间如何调用的?
通过feign远程调用,通过Ribbon的负载均衡策略决定访问哪台服务器,feign原理就是动态代理,监测到@Feign注解,容器会创建代理类,创建网络连接,发起请求,解析结果

7. 怎么做熔断的?
默认每隔5s进行判断断路器的开闭,如果达到请求次数,且达到故障百分比,会进行服务熔断,后续请求直接返回失败,也可以进行降级处理

8. 熔断的原理?
采用事件机制。将每一次依赖服务调用或者降级调用转换成一次事件,建立事件监听器进行事件统计,将事件统计结果传给熔断器,熔断器来决定下一次调用的走向。

9. 大量并发熔断怎么处理?
FallbackIsolationSemaphoreMaxConcurrentRequests 用于设置 fallback 最大允许的并发请求量,默认值是 10,之后通过semaphore 信号量的机制去限流的。如果超出了这个最大值,那么直接 reject。

10. 你们网关是做什么的?
做反向代理,负载均衡,统一鉴权

11. 如何做全局鉴权的?
通过实现GlobalFilter接口,Ordered接口,在发送请求前进行登录鉴权

12. 一个列表要用到另一个服务的表怎么做?
要么单表调用,要么写一个视图维护到对应的服务下面(因为我们的所有服务共用一台数据库)

13. 配置中心是用来干什么的?
所有服务的集中配置管理,免去了每个服务单独维护的不安全性和后面变更修改的麻烦,也不利于动态更新配置

14. Spring是如何添加事务的?
在xml文件里面配置事务管理器,配置数据源

15. 容器启动监听如何做?
可以写一个监听器实现SpringApplicationRunListener接口,之后配置在META-INF下的spring-factories文件里,配置全限定名称,之后spring项目启动就会在run方法里面一层层的调用,中间就会调用我们写的监听

16. 不想注入某个bean如何实现?
比如:其他的jar中定义了 redissonConfig 这个bean。然后我自己的项目也定义了redissonConfig 这个bean。导致项目启动报错。
解决:

@ComponentScan(basePackages = {"com.xx.xx.*"}, excludeFilters =@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {RedissonConfig.class}))

可以指定扫描那个包,进行bean的注入,也可以排除一些类的注入,可以通过FilterType指定过滤方式
可以自定义扫描器扫描一些非spring定义的一些注解

17. 方法A调用方法B,B异常如何让A不回滚?
A方法上加事务注解@Transactional(propagation = Propagation.REQUIRED_NEW)

18. Spring事务的原理?
原理是使用了动态代理,容器监测到事务注解,会创建代理类,实现事务

19. 讲一下动态代理?
有两种动态代理
jdk动态代理,实现父类接口
CGLib冬天代理,继承当前类

20. 讲一下spring里面的锁?
synchronized: 无锁-》偏向锁-》轻量锁-》重量锁
特点:jdk自带的锁,使用后可以自动释放,根据线程的竞争程度进行锁的自动升级
lock: 接口可以自己实现锁,如ReentrantLock
特点:自己或第三方实现锁,需要手动进行锁的添加释放,可以跨方法

21. 你们用消息队列做什么?
异步,解耦,降流

22. 消息消费失败你们是如何处理的?
开启手动ack应答,服务可能短暂不可用,应该允许重试;
其次可以保存记录到数据库,保证最终一致性,之后手动恢复或者通过定时任务扫描进行处理

23. 几千行的SQL,如何优化,找到慢的部分?
增加必要的索引;
适当增加冗余字段减少计算交叉;
SQL拆分查看执行计划,找到慢的部分

24. 你说的执行计划成本是什么?
IO成本和CPU成本
比如按日期范围查询表,想排序,此时按日期排序,由于日期索引本就有序,减少排序计算及大数据量的IO读入排序,如果按ID排序,那么就会读取大量数据到内存再行计算,成本就会提高

25. 讲一下jvm的内存模型?
堆,栈,方法区,程序计数器

26. 讲一下方法区存什么?
它存储已被Java虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等

27. 大报表读入内存溢出怎么办?
分批处理,哪怕数据量很小,对于可扩展的数据量,也要做好分批限量处理

28. 导致内存溢出的情况列举一下?
内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
代码中存在死循环或循环产生过多重复的对象实体;
使用的第三方软件中的BUG;
Xmx设置过小

29. 树的遍历方式了解吗? 先序遍历讲一下?
先序,中序,后续
中序遍历:左子树,根节点,右子树

 类似资料: