java
内部类相关静态与非静态的底层待研究
静态内部类可以在除外部类以外的类中实例化,比如Builder模式
非静态的内部类只能在外部类中实例化,且只能在非静态方法中实例化,
非静态内部类可以声明静态变量,也可以在静态块中被声明,但无法同时被实例化
内部接口默认都是静态的且必须是静态的
匿名内部类和局部变量的关系lambda的实现与匿名内部类有关系,简单地说,匿名内部类可能会比它所在的方法的存活时间还长,这样的话,他想要调用的局部变量会因为方法的结束出栈而消失,则会出现问题,故如果需要使用局部变量,需要是final的(如果不是final,编译器在编译的时候会变为final,如果在匿名内部类使用之后对该变量做修改,则编译不通过),这样匿名内部类会复制一份改局部变量与自己共同存活。
内部类的访问修饰符private修饰的内部类及其中嵌套的private内部类能且只能在其所属的外部类及其包含的所有内部类中访问
12345678910111213141516@Componentpublic class TreeService { public static FileTree fil ...
OrangeFrame
系统结构parent依赖版本管理
auth进行认证
用户名密码匹配
账户失效判断
将用户角色存入redis
common
公用工具类
共用实体类
除此之外还有自动配置等
gateway网关,进行鉴权
rbac进行rbac信息的增删改查
数据结构设计RBACuser
数据库中字段
id
username
password
enabled
account_non_expired
account_non_locked
credentials_non_expired
实体类中字段
roleList 角色列表
role// 从redis中查看当前角色中有无当前api,若无,则查看有无parent,递归查找,都没有则返回false
关于角色递归
使用递归形式的角色保存可以减少后期查询次数,但如果派生角色和基础角色都为递归形式,则会出现无限递归的情况。
例如,b为a的派生角色,则a的派生列表中是有b的,但b的基础角色中又会存在a,如此便会形成递归,造成溢出. 故这两个列表中只能有一个是递归的形式。
经过考虑,将基础角色做递归处理,派生角色不做,因为基础角色也属于是 ...
gateway
StripPrefix优先级自定义的全局过滤器(实现GlobalFilter接口)优先级再高,也会在StripPrefix之后执行,所以到达全局过滤器时的路径已经是被截取之后的
网关组成路由转发接受外界请求,通过网关的路由转发,转发到后端的服务器上
过滤器容错,限流等
解决方案zuulNetflix 不更新了
gatewayspring自己推出
名词解释Route路由,gateway核心,route包含路由规则,路由校验,过滤处理,容错处理
Predicate谓词, 路由规则,简单的校验逻辑
Filter过滤器,增加自定义功能
其中,predicate 与 filter 的区别主要在于,predicate 作用为判断那些请求为当前路由要处理的请求,filter 为对当前处理的请求所做的处理
配置基础配置1234567891011121314spring: cloud: gateway: discovery: locator: # 配置处理机制 # 只要请求地址符合规则: http://gatewayIP:gatewayPort/微服务名称/微服务请 ...
SpringCloud
发现的一些问题启动闪退spring cloud client客户端需要引入web环境依赖,否则启动后会自动停止
nacos无法识别服务名服务名不能有下划线
gateway “Service Unavailable”Springcloud2020弃用了ribbon, Alibaba在2021版本nacos中删除了Ribbon的jar包。因此无法通过lb路由到指定微服务,出现了503的情况
需要引入
1234<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>
Module的复制复制一个server module,将其中冲突的地方重命名
打开项目管理, 将复制的module以maven工程的身份导入当前项目:
CAPCAP原则:C(Consistency):一致性A(Availablitity):可用 ...
SpringBoot
配置相关配置注入实体类
编写实体类
123456public class AppConfig { String appId; String apigwPublicKey; String priKey; String baseUrl;}
参数注入需要set方法,所以加上@Data注解
交由Spring管理当前对象,添加@Component注解
或在启动类添加@EnableConfigurationProperties({实体类class})
设置前缀,添加@ConfigurationProperties(prefix = “app”)注解
在配置文件进行配置
12345app: appId: 123 apigwPublicKey: 456 priKey: 789 baseUrl: 0
使用,在需要用到的类@Autowired AppConfig即可
配置提示引入依赖
123456<!--自定义配置处理器--><dependency> <groupId>org.spring ...
gdb
参考资料手把手教你拆解 CSAPP 的 炸弹实验室 BombLab - 知乎 (zhihu.com)
打开gdb中的历史记录使用命令
1echo 'set history save on' >> ~/.gdbinit && chmod 600 ~/.gdbinit
但在layout regs和layout asm下无法使用
运行
gdb bomb:使用gdb调试可执行文件bomb
r:run,运行程序,遇到断点时停止
c:continue,继续执行,到下一个断点停止
q:quit,退出gdb调试
si:单指令执行,每次只执行一条指令
n:next,单步跟踪程序,遇到函数调用时,不会进入函数体内部
s:step,单步调试,遇到函数调用时,会进入函数体内部
until:运行到退出循环体
until + 行号:运行至行号处
设置断点
b n:break n,在第n行设置断点
b func:在函数func的入口处设置断点
b *地址:在地址处设置断点如b *0xffff
i b:info b,显示当前程序的断点设置情况,会给出各个断点的断点号 ...
Swagger
在网页中展示接口信息
引入依赖
12345678910<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version></dependency><dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version></dependency>
编写配置
123456789101112131415161718192021@Configuration@EnableSwagger2public class SwaggerConfig ...
SpringSecurity
基本概念RBAC
用户(User)
userRole 多2多
角色 (Role)
userMenu 多2多
权限(Menu/API)
认证Authentication
登录,判断是否为系统合法用户
授权Authorization
分配权限,判断该合法用户的权限
默认配置SpringBootWebSecurityConfiguration会将配置包装成一个chain返回
12345678910111213@Configuration(proxyBeanMethods = false)@ConditionalOnDefaultWebSecurity@ConditionalOnWebApplication(type = Type.SERVLET)class SpringBootWebSecurityConfiguration { @Bean @Order(SecurityProperties.BASIC_AUTH_ORDER) SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) t ...
Redis
windows下载地址https://github.com/microsoftarchive/redis/releases/download/win-3.0.504/Redis-x64-3.0.504.msi
安装后redis服务默认会启动
SDSsimple dynamic string
SDS是redis底层使用的字符串结构
123456789struct sdshdr { //记录buf数组中已使用字节的数量 //等于SDS所保存字符串的长度 int len; //记录buf数组中未使用字节的数量 int free; //字节数组,用于保存字符串 char buf[];};
保留了\0字符,目的是为了复用c语言中的字符串方法
buf.length = len + 1 + free
其中free为每次分配空间进行的预分配内存,避免每次扩展字符串时都需要重新申请空间。以1M为限,1M下会分配即将用到的内存的两倍,1M以上只多分配1M,避免指数爆炸。当然如果free本身就能够支持本次操作,则不会进行内存重分配。
...
design_pattern
参考资料资料来自于《图解设计模式》
UML
Iterator模式Interator对象中引用了容器对象,最基本的实现为next和hasNext
next
获取当前对象并将指针向后移动
hasNext
判断当前指针是否越界,通常用于循环的结束条件判断
q: 为何要引入iterator模式,如果只是数组,明明直接使用for循环语句遍历
a:引入itreator模式后可以将遍历与实现分离
相关角色
Iterator
负责定义按顺序逐个遍历元素的接口,定义了next与hasNext方法
ConcreteIterator
迭代器具体的实现,实现了next和hasNext方法
Aggregate
定义容器API,定义了iterator方法用于获取迭代器
ConcerteAggregate
容器具体的实现,实现了iterator方法
Adapter模式又被称为Wrapper模式
现有程序无法使用,需要做适当的变换之后才能使用的情况,构造一个类,用于填补现有程序与目标程序之间的差异的设计模式
类适配器模式(继承)继承提供功能的类并实现目标接口,通过调用父类中的方法来实现接口中的功能。 ...