guide-RPC实现
核心原理
注册中心 :注册中心负责服务地址的注册与查找,相当于目录服务。服务端启动的时候将服务名称及其对应的地址(ip+port)注册到注册中心,服务消费端根据服务名称找到对应的服务地址。有了服务地址之后,服务消费端就可以通过网络请求服务端了。
网络传输 :既然要调用远程的方法就要发请求,请求中至少要包含你调用的类名、方法名以及相关参数吧!推荐基于 NIO 的 Netty 框架。
序列化 :既然涉及到网络传输就一定涉及到序列化,你不可能直接使用 JDK 自带的序列化吧!JDK 自带的序列化效率低并且有安全漏洞。 所以,你还要考虑使用哪种序列化协议,比较常用的有 hession2、kyro、protostuff。
动态代理 : 另外,动态代理也是需要的。因为 RPC 的主要目的就是让我们调用远程方法像调用本地方法一样简单,使用动态代理可以屏蔽远程方法调用的细节比如网络传输。也就是说当你调用远程方法的时候,实际会通过代理对象来传输网络请求,不然的话,怎么可能直接就调用到远程方法呢?
负载均衡 :负载均衡也是需要的。为啥?举个例子我们的系统中的某个服务的访问量特别大,我们将这个服务部署在了 ...
手写RPC框架
RPC基本原理共五个模块:
注册中心:
服务消费者Consumer:
服务提供者Provider:
Provider-common:
RPC框架:
实现流程1.Provider-common定义HelloService类,实现类在Provider模块123456package com.rc; public interface HelloService { public String sayHello(String name); }
2.Provider编写HelloServiceImpl实现HelloService1234567package com.rc; public class HelloServiceImpl implements HelloService { @Override public String sayHello(String name) { return "hello: " + name; }}
定义Hel ...
军标数据采集系统相关知识
项目描述:手绘军标数据采集系统是为中船公司定制的前后端分离应用,旨在为军事领域提供高效、标准化的图标绘制 和数据采集解决方案。该系统包含用户端和管理员端,通过提供一个具有多种绘制功能的用户友好前端界面,以 及一个强大的后端管理平台,支持图标采集的全流程管理。
使用Redis缓存热点军标数据并防范缓存穿透与击穿,提升查询效率。
利用JWT和网关过滤器实现用户登录认证,保障资源访问安全。
利用Spring Security框架实现权限认证,严格控制各种角色的使用权限。
利用RabbitMQ将耗时的图标数据处理任务异步化,提高系统响应并减轻服务器压力,提升系统的可靠性。
AOF重写过程
什么是AOF重写?在Redis中,AOF(Append-Only File)重写是为了优化AOF文件的大小和性能而进行的一项重要操作。随着时间的推移,AOF文件会不断增长,如果不进行管理,可能会变得非常大,影响Redis的启动速度和持久化性能。AOF重写的过程旨在生成一个新的、精简的AOF文件,其中包含数据的当前状态。
AOF重写详细过程1.触发AOF重写
自动触发:根据配置的auto-aof-rewrite-min-size和auto-aof-rewrite-percentage参数,当AOF文件达到一定大小,自动触发AOF重写
手动触发:命令bgrewriteaof手动触发AOF重写
2.生成新的AOF文件AOF重写的核心步骤是生成一个新的AOF文件,该文件只包含当前数据库状态的最小命令集,过程:
Fork子进程:Redis fork一个子进程执行AOF重写,避免阻塞主进程的正常请求处理。
遍历当前数据库:遍历数据库的所有键值对,将其转换为对应的Redis命令,并写入到一个新的AOF文件中
写入新AOF文件:生成的新文件比原文件小得多,只包含必要的命令,不包括冗余的历史操作。
...
Redis的线程安全问题
Redis的单线程模型Redis使用单线程处理所有的客户端请求,不需要考虑多线程并发的同步问题,如锁定、死锁等,这也是Redis能实现高性能的原因之一,避免了上下文切换的开销。
多客户端并发访问虽然Redis本身是单线程处理请求,但能够处理来自多个客户端的并发连接,通过事件循环(event loop)和非阻塞IO多路复用(epoll、kqueue等)来高效管理多个客户端的连接和请求。这使得Redis能够处理大量的并发连接而不会产生线程安全问题。
数据一致性Redis单线程处理请求保证了命令的原子性。
持久化和异步任务Redis的主线程是单线程,但在持久化和后台任务使用了额外的线程。
RDB持久化:在保存快照时,Redis会fork一个子进程来执行持久化工作,不会阻塞主线程的正常操作。
AOF重写:AOF重写也是通过子进程完成。
后台清理任务:过期键的删除。
Redis客户端的线程安全虽然 Redis 服务器是线程安全的,但在客户端应用中使用 Redis 时,仍然需要注意线程安全问题。特别是当多个线程共享一个 Redis 客户端实例时,需要确保对客户端实例的操作是线程安全的:假设两个 ...
RESTful API和普通API的区别
RESTful API:资源导向
一资源为核心,每个资源有一个唯一的URI(统一资源标识符)
资源通常使用常用名词表示:’/users’,’/orders’
使用标准HTTP方法共八种:
GET:获取资源
POST:创建资源
DELETE:删除资源
PUT:更新资源
OPTIONS
HEAD
TRACE
CONNECT
无状态
每个请求都是独立的,服务器不保存客户端的状态。每个请求必须包含所有必要的信息。
统一接口接口统一且固定,不同的资源通过相同的接口进行操作
通过URI操作资源获取用户信息:‘GET /users/{id}’
普通 API
不一定资源导向
自定义方法和路径,不一定用GET请求获取资源,或许使用POST
接口不统一
返回数据不统一:可能JSON、XML、HTML等
操作路径不规范
Spring自动装配bean的方式
基于注解的自动装配@Autowired最常用的注解
12345678910111213141516171819@Componentpublic class MyService { @Autowired private MyRepository myRepository; // 或者通过构造器注入 // @Autowired // public MyService(MyRepository myRepository) { // this.myRepository = myRepository; // } // 或者通过Setter方法注入 // @Autowired // public void setMyRepository(MyRepository myRepository) { // this.myRepository = myRepository; // }}
@Qualifier当有多个相同类型的bean时,使用@Qualifier ...
Java并发总结
多线程的作用:1.发挥多核CPU的优势,多核CPU的多线程让多段逻辑同时工作,多线程可以发挥多核CPU的优势,充分利用CPU。
2.防止阻塞:多条线程同时运行,某个线程的代码执行读取数据阻塞,但不会影响其他任务的执行。
3.便于建模:将大的任务分解成几个小任务,分别建立程序模型,通过多线程分别运行。
程序,进程,线程的概念和关系1.概念:
程序:是含有指令和数据的文件,被存储在磁盘或其他数据存储设备中,程序是静态的代码
进程:是程序的一次执行过程,是系统运行程序的基本单位,是动态的;进程之间是独立的,但线程不一定。
线程:与进程相似,但是比进程更小的执行单位,一个进程会产生多个线程。与进程不同的是,多个线程共享同一块内存和一组系统资源,所以各个线程切换上下文开销比进程小,成为轻量级进程。
一个进程中可能有多个线程,多个线程共享进程的堆和方法区(元空间),线程自己私有程序计数器、虚拟机栈、本地方法栈
堆和方法区:堆是进程最大的一块内存区域,几乎所有的对象都在这里创建并分配内存;方法区主要存放类信息,常量,静态变量
程序计数器、虚拟机栈和本地方法栈为什么是私有的?
程序计数器:字节码解 ...
Java集合总结
一、ArrayList为什么数组索引从0开始,从1开始不行吗?
根据数组索引获取元素时会用索引和寻址公式计算内存所对应的元素数据:数组的首地址+索引*存储数据的类型大小。
如果从1开始,寻址公式需要增加一次减法操作,性能不高。
ArrayList源码分析:成员变量:
构造函数:1.带初始容量的构造函数:
2.无参构造函数,默认创建空集合
3.将collection对象转换成数组,将数组的地址赋给elementData
关键方法:1.添加操作(第一次添加)
首先进行第一次add操作,会先确保内部容量
确保明确的容量
计算容量
确保明确容量方法体内执行grow
grow进行扩容操作
1.将容量扩成原来的1.5倍(第一次扩容除外)
2.第一次扩容是初始化长度为10
3.数组拷贝
2.第2至10次添加操作:
3.第11次添加操作:
不够存这次添加的数据了,扩容
★ArrayList底层原理是什么?
ArrayList底层基于动态的数组实现。
ArrayList初始化容量为0,第一次添加数据是初始化容量为10.
ArrayList每次(除第一次初始化容量为10)扩容成 ...