一、微服务架构介绍
1.1 架构演变
单体架构: All in One,所有的功能模块都在一个工程里。
SOA架构: 这个架构当不当正不正,对于现在来说,有点老,甚至需要ESB,WebService之类的,基本不会使用了。
微服务架构: 微服务架构思想是马丁福勒提出的
https://martinfowler.com/articles/microservices.html
他的核心思想是这一段话:
In short, the microservice architectural style 1 is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and in ...
缓存和分布式锁
一、缓存
1. 什么是缓存
缓存的作用是减低对数据源的访问频率。从而提高我们系统的性能。
缓存的流程图
2.缓存的分类
2.1 本地缓存
其实就是把缓存数据存储在内存中(Map <String,Object>).在单体架构中肯定没有问题。
单体架构下的缓存处理
2.2 分布式缓存
在分布式环境下,我们原来的本地缓存就不是太使用了,原因是:
缓存数据冗余
缓存效率不高
分布式缓存的结构图
3.整合Redis
要整合Redis那么我们在SpringBoot项目中首页来添加对应的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
然后我们需要添加对应的配置信息
测试操作Redis的数据
@Autowired
Strin ...
Sentinel
一、熔断、降级、限流
1.熔断
服务熔断的作用类似于我们家用的保险丝,当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止对该服务的调用。
停止是说,当前服务一旦对下游服务进行熔断,当请求到达时,当前服务不再对下游服务进行调用,而是使用设定好的策略(如构建默认值)直接返回。
暂时是说,熔断后,并不会一直不再调用下游服务,而是以一定的策略(如每分钟调用 10 次,若均返回成功,则增大调用量)试探调用下游服务,当下游服务恢复可用时,自动停止熔断。
2.降级
降级是指当自身服务压力增大时,采取一些手段,增强自身服务的处理能力,以保障服务的持续可用。比如,下线非核心服务以保证核心服务的稳定、降低实时性、降低数据一致性。
为了预防某些功能出现负荷过载或者响应慢的情况,在其内部暂时舍弃一些非核心接口和数据的请求(如评论、积分),而直接返回一个提前准备好的 fallback(退路) 错误处理信息。释放CPU和内存资源,以保证整个系统的稳定性和可用性。
3.限流
限流是指上游服务对本服务请求 QPS 超过阙值时,通过一定的策略(如延迟处理、 ...
分布式(更新ing)
分布式项目的整合:
https://www.processon.com/view/link/6281b28c0e3e746f2b12d0ee
分布式架构会把一个项目按照特定要求(多按照模块或功能)拆分成多个项目,每个项目分别部署到不同的服务器上。
RMI
运程方法调用
API
Remote
远程调用接口
RemoteException
承了Remote接口的接口中,如果方法是允许被远程调用的,需要抛出此异常。
UnicastRemoteObject
java.rmi.server.UnicastRemoteObject
此类实现了Remote接口和Serializable接口。
自定义接口实现类除了实现自定义接口还需要继承此类。
LocateRegistry
java.rmi.registry.LocateRegistry
可以通过LocateRegistry在本机上创建Registry,通过特定的端口就可以访问这个Registry。
Naming
java.rmi.Naming
...
MySQL
未读MySQL8端口为0
今天连接数据库的时候,密码正确,配置也没毛病,但是就是连不上
于是去查了查端口
show global variables like 'port';
显示
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port | 0 |
+---------------+-------+
1 row in set (0.00 sec)
竟然不是3306
去网上查资料发现可能是之前某些操作让skip-networking打开了
mysql> SHOW VARIABLES LIKE "skip_networking";
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| skip_networking | ON |
+-----------------+-------+
1 row in set (0 ...
这次春招拖到四月才面…先已收到兴业数金、华为、平安的offer,签了平安。
总结几篇我认为有必要记录的面经:字节、华为(有时间就更新)
字节面经
第一次面字节 真的很紧张 其他面试也就经历过一两轮 面试小白真的害怕 没想到字节一面没有很刁钻也不会很难 都是简单的八股 算法也是简单dp
自我介绍
hashmap put() 工作流程 (讲了一下源码)
concurrenthashmap怎么做到并发安全(简单讲了1.7/8 的锁实现)
面试官从上面引出CAS 叫我描述一下(乐观、预值、新值、底层原理)
java的其他锁(巴拉巴拉讲了sych、AQS框架下的几个锁)
ThreadLocal什么时候使用(说了下底层、声明式事务保证同一个connection)
垃圾回收(算法、回收器都简单讲了讲)
网络http头有哪些字段、长连接短连接、状态码、https原理、hash不可逆(http请求头这里我真的弱,具体就私钥公钥,CA证书这里讲的还可以😭 然后还把hash说成可逆😭
TCP三次、四次;timewait状态只有客户端吗?(还好猜对了,timewait ...
安装hexo
1.前提准备:
安装git
brew install git
验证
git --version
安装node.js
brew install node
2.安装
npm install -g hexo-cli
3.创建博客文件夹并初始化
hexo init
npm install
4.本地启动
hexo g
hexo s
访问本地链接:http://localhost:4000/
显示如下页面,表示安装成功
安装next主题
hexo官网主题:https://hexo.io/themes/
这里以next为例
1.在创建文件夹下安装主题
git clone https://github.com/theme-next/hexo-theme-next themes/next
2.修改文件夹下的_config.yml文件
修改theme为next
# Extensions
## Plugins: https://hexo.io/plugins/
## Themes: https://hexo.io/themes/
theme: next
再次访问页面:
表 ...
网络
TCP
是一个基于字节流的一个传输层的通信协议,在发送数据之前双方是需要建立一个连接的,这个所谓的连接就是双方都保存一个对方的ip地址还有端口等信息,然后TCP其实是一个字节流,头部就保存了这些信息,进行连接的时候有三个阶段:建立连接、传输数据、关闭连接,三次握手来建立,四次挥手来关闭,其中交换的报文都是tcp的头部。
三次握手
三次握手是一个在内核发生的一个行为,基于TCP协议,,首先呢,客户端应用启动以后,服务端进入listen状态,为了未来收到数据包做准备,然后在这个状态下内核进行了三次握手,
首先第一次是客户端向服务端发送带有SYN,代表发送连接的标识,的一个报文,自己进入一个SYN-SENT状态,然后服务器接收进入SYN-RECV状态
第二次是服务器发送带有SYN+ACK的报文,ACK是确认序号有效的标识,客户端接收进入established状态;
然后就是最后一次握手 因为服务端还需要知道自己发送和对方接收是否成功,所以客户端发送带有ACK标识的报文,服务端接收到才进入establised状态,以上三次握手就进行完毕
然后在这里以后应用要进行接收,就得将连接 ...
高频题
三数之和
两数之和为基础
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
// 1 先将数组排序
// 2 从后往前遍历最后一个数 找对应的二元组:二元组 + arr[i] = 0
// 2.1 保证不重复
// 2.2 找出前面部分满足条件的二元组
// 2.3 遍历将arr[i]添加在后面
public static List<List<Integer>> threeSum(int[] nums) {
// 1
Arrays.sort(nums);
int N = nums.length;
List<List<Integer>> ans = new ArrayList<>();
// 2
for (int i = N - 1; i > 1; i--) { // 三元组最后一 ...
Redis是一个使用c语言编写的,开源的高性能非关系型数据库(NoSQL)
数据类型
回答:一共五种
(一)String
这个其实没啥好说的,最常规的set/get操作,value可以是String也可以是数字。一般做一些复杂的计数功能的缓存。
(二)hash
这里value存放的是结构化的对象,比较方便的就是操作其中的某个字段。博主在做单点登录的时候,就是用这种数据结构存储用户信息,以cookieId作为key,设置30分钟为缓存过期时间,能很好的模拟出类似session的效果。
(三)list
使用List的数据结构,可以做简单的消息队列的功能。另外还有一个就是,可以利用lrange命令,做基于redis的分页功能,性能极佳,用户体验好。本人还用一个场景,很合适—取行情信息。就也是个生产者和消费者的场景。LIST可以很好的完成排队,先进先出的原则。
(四)set
因为set堆放的是一堆不重复值的集合。所以可以做全局去重的功能。为什么不用JVM自带的Set进行去重?因为我们的系统一般都是集群部署,使用JVM自带的Set,比较麻烦,难道为了一个做一个全局去重,再起一个公共服务,太麻烦 ...