写在前面
🍁个人主页:HNUJSY
✨本期专栏:《史上最全经典面试题总结》欢迎订阅学习~
📌Xmind文件获取:GitHub 持续更新中,别忘了 star 喔~
目录
「Java学习+面试指南」思维导图,计算机自学指南,包括Java基础、JVM、数据库、mysql、redis、计算机网络、算法、数据结构、操作系统等,后台技术栈/架构师之路/全栈开发社区,阿里,腾讯,百度,美团,头条等春招/秋招/校招/面试
思维导图(png格式可下载放大)
谷粒商城项目
分布式
远程调用
- HTTP+JSON
- feign
服务注册/发现&注册中心
- nacos
配置中心
- nacos
服务熔断&服务降级
- 当其中一个服务不可用时,有可能会造成雪崩效应
- 服务熔断
- 设置服务的超时,当被调用的服务经常失败到达某个阈值,我们可以开启断路保护机制,后来的请求不再去调用这个服务。本地直接返回默认的数据
- 服务降级
- 在运维期间,当系统处于高峰期,系统资源紧张,我们可以让非核心业务降级运行。降级:某些服务不处理,或者处理简单【抛异常、返回NULL、调用Mock数据、调用Fallback处理逻辑】
API网关
- Nginx把请求转交给API网关
- 动态路由到指定服务
- 负载均衡到某个服务器
- 动态路由到指定服务
- 对服务进行熔断或降级
- 认证授权
- 限流(只放行部分到服务器)
- gateway
redis集群
- (分片+哨兵集群+主从架构)
持久化使用mysql
- 读写分离和分库分表
消息队列(RabbitMQ)
- 异步解耦,分布式事务的一致性
ElaticSearch
- 全文检索,检索商品信息
阿里云的对象存储服务OSS
日志
- 使用ELK对日志进行处理,使用LogStash收集业务里的各种日志,把日志存储到ES中,用Kibana可视化页面从ES中检索出相关信息
服务追踪
- 使用springcloud提供的Sleuth、Zipkin、Metrics,把每个服务的信息交给开源的Prometheus进行聚合分析,再由Grafana进行可视化展示,提供Prometheus提供的AlterManager实时得到服务的告警信息,以短信/邮件的方式告知服务开发人员
持续集成和持续部署
- 有了持续集成后开发人员可以将修改后的代码提交到github,运维人员可以通过自动化工具Jenkins Pipeline将github中获取的代码打包成docker镜像,最终是由k8s集成docker服务,将服务以docker容器的方式运行
问题
docker
docker pull nginx:1.10
随便启动一个nginx实例,只是为了复制出配置,放到docker里作为镜像的统一配置
docker run -p 80:80 --name nginx -d nginx:1.10
cd /mydata/nginx
docker container cp nginx:/etc/nginx .
然后在外部 /mydata/nginx/nginx 有了一堆文件
mv /mydata/nginx/nginx /mydata/nginx/conf
停掉nginx
docker stop nginx
docker rm nginx
创建新的nginx
docker run -p 80:80 --name nginx
-v /mydata/nginx/html:/usr/share/nginx/html
-v /mydata/nginx/logs:/var/log/nginx
-v /mydata/nginx/conf:/etc/nginx
-d nginx:1.10
注意一下这个路径映射到了/usr/share/nginx/html,我们在nginx配置文件中是写/usr/share/nginx/html,不是写/mydata/nginx/html
docker update nginx --restart=always
原文链接:https://blog.csdn.net/hancoder/article/details/106922139
逻辑删除
- mybatis-plus 的内容,会在项目中配置一些内容,告诉此项目执行delete语句时并不删除,只是标志位
跨域问题
- 指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对js施加的安全限制。
- 协议,域名,端囗都要相同,其中有一个不同都会产生跨域
- 跨域请求的实现是通过预检请求实现的,先发送一个OPSTIONS探路,收到响应允许跨域后再发送真实请求
- 跨域是要请求的、新的端口那个服务器限制的,不是浏览器限制的。
- 解决方案
- 设置nginx包含admin和gateway。都先请求nginx,这样端口就统一了
- 让服务器告诉预检请求能跨域
- 在服务端配置允许跨域
- https://blog.csdn.net/hancoder/article/details/106922139
- 在服务端配置允许跨域
JSR303校验
-
javax.validation.constraints
-
注解
- @NotNull
- 注解禁止元素为null,能够接收任何类型
- @NotEmpty
- 该注解修饰的字段不能为null或""
- @NotBlank
- 该注解不能为null,并且至少包含一个非空格字符。接收字符序列
- @NotNull
-
controller中加校验注解@Valid,开启校验
- 添加注解的时候,修改message
@NotBlank(message = “品牌名必须非空”)
- 添加注解的时候,修改message
-
给校验的Bean后,紧跟一个BindResult,就可以获取到校验的结果。
public R save(@Valid @RequestBody BrandEntity brand,
BindingResult result){ // 手动处理异常 -
统一异常处理 @ExceptionHandler
session
- 多系统单点登录
- xxl-sso
- token
- xxl-sso
消息队列
模式
- 点对点式
- 一个发布,一个接收
- 发布订阅式
- 一个发布,多个接收
实现
- jms
- java消息服务
jdbc- java
- activemq
- java
- java消息服务
- amqp
- 高级消息队列协议
- 跨语言
- rabbitmq
- 跨语言
- 高级消息队列协议
rabbitmq
-
publisher生产者
-
message头+体
route-key 路由键 -
broker消息代理
-
Consumer消费者
- connection连接
- 一个连接多个信道channel
- connection连接