小知识积累

Swagger

通过这套规范,你只需要按照它的规范去定义接口及接口相关的信息。再通过Swagger衍生出来的一系列项目和工具,就可以做到生成各种格式的接口文档,生成多种语言的客户端和服务端的代码,以及在线接口调试页面等等。这样,如果按照新的开发模式,在开发新版本或者迭代版本的时候,只需要更新Swagger描述文件,就可以自动生成接口文档和客户端服务端代码,做到调用端代码、服务端代码以及接口文档的一致性。

 

项目开始阶段:

服务端开发可以视情况来决定是直接编写服务端调用层代码,还是写Swagger描述文件。建议是如果项目启动阶段,就已经搭好了后台框架,那可以直接编写服务端被调用层的代码(即controller及其入参出参对象),然后通过Springfox-swagger 生成swagger json描述文件。如果项目启动阶段并没有相关后台框架,而前端对接口文档追得紧,那就建议先编写swagger描述文件,通过该描述文件生成接口文档。后续后台框架搭好了,也可以生成相关的服务端代码。

 

项目迭代阶段:

无需关注Swagger描述文件和接口文档,有需求变更导致接口变化,直接写代码就好了。把调用层的代码做个修改,然后生成新的描述文件和接口文档后,给到前端即可。真正做到了一劳永逸。

 

Redis缓存穿透、缓存击穿、缓存失效

https://blog.csdn.net/LFH_121/article/details/91803084

缓存穿透:一个key的值就是null;数据库里面也为null,导致吗,每次都去查数据库了,解决办法:1.为null也要放在redis里,过期时间设置短一点,或者该key对应的数据insert了之后清理缓存。    2.或者。。。

缓存雪崩:缓存服务器重启或同一时间大量key失效,导致数据库压力过大

缓存击穿:缓存失效的时候恰好有很多的请求访问这个key,导致大量的请求同时去数据库里面去,请求这个key。解决方法对查数据库加入缓存的代码块加上锁(redis.sexnx()==1)那么只有一个请求可以去访问数据库,其他请求等待。

 

 

static ThreadLocal<User> local = new ThreadLocal<>();

local.get(); local.set()

 

布隆过滤器是一个神奇的数据结构,可以用来判断一个元素是否在一个集合中。很常用的一个功能是用来去重。https://segmentfault.com/a/1190000016721700

 

 

assert断言的使用;

1.添加jvm参数-ea(-enableassertions)

2.assert 【Boolean】;如果assert后面的是false,则程序抛出java.lang.AssertionError,输出[错误信息]。

 

 

 

mock原理及运用:

在写单元测试的过程中,我们往往会遇到要测试的类有很多依赖,这些依赖的类/对象/资源又有别的依赖,从而形成一个大的依赖树,要在单元测试的环境中完整地构建这样的依赖,是一件很困难的事情。因此需要mock数据隔离各种依赖,方便单测独立的代码逻辑   重点推荐:https://www.cnblogs.com/zishi/p/6780719.html

//https://blog.csdn.net/u012796139/article/details/102645070

常见的几个mockito注解:

@Spy

Xxx$MockitoMock$10456154 -- 为null时默认注入mock对象

Xxx$$EnhancerByCGLIB$$ab5d0f7d -- 非null时注入实际对象

@Mock

Xxx$MockitoMock$1251285143 -- (不管是否为null都)注入mock对象

@InjectMocks

InjectMocks创建这个类的对象并自动将标记@Mock、@Spy等注解的属性值注入到这个中

 

Spring @Order注解 : 定义Spring IOC容器中Bean的执行顺序的优先级,而不是定义Bean的加载顺序,Bean的加载顺序不受@Order或Ordered接口的影响

 

 ApplicationRunner

在SpringBoot中,提供了一个接口:ApplicationRunner

该接口中,只有一个run方法,他执行的时机是:spring容器启动完成之后,就会紧接着执行这个接口实现类的run方法。

这个实现类,要注入到spring容器中,这里使用了@Component注解

在同一个项目中,可以定义多个ApplicationRunner的实现类,他们的执行顺序通过注解@Order注解或者再实现Ordered接口来实现。

run方法的参数:ApplicationArguments可以获取到当前项目执行的命令参数。(比如把这个项目打成jar执行的时候,带的参数可以通过ApplicationArguments获取到);

@Component

@Order(1)

public class PublishEndpoint implements ApplicationRunner{

 

       @Override

       public void run(ApplicationArguments applicationArguments) throws Exception {

              //do something

       }

}

 

Junit单元测试不支持多线程:https://www.cnblogs.com/yanphet/p/5774291.html

 

spring的util包下的Assert方法:

Assert.hasText(String,"msg");

Assert.notNull(String,"msg");

 

单一个接口有两个实现类时候,spring注入如何区分:

方法1:

在实现类上标明唯一标识,调用时使用其标识:

@Service("userServiceImpl01")

使用时:

@Autowired

@Qualifier("userServiceImpl01") //Qualifier的意思是合格者,通过这个标示,表明了哪个实现类才是我们所需要的

UserService userService;

 

方法二:使用@resource注入时比较简单了,注解自带了“name”的val就是@Service注解的名称的实现类之一。

 

 

系统运行监控(硬件):

zabbix agent需要安装在被监视的目标服务器上,它主要完成对硬件信息或与操作系统有关的内存,CPU等信息的收集。

zabbix server可以单独监视远程服务器的服务状态;同时也可以与zabbix agent配合,可以轮询zabbix agent主动接收监视数据(agent方式),同时还可被动接收zabbix agent发送的数据(trapping方式)。

 

 

FastDFS后Storage服务端将返回的文件索引(FID),其中文件名是根据FastDFS自定义规则重新生成的,而不是原始文件名(原始文件名不会保存),例如: group2/M00/00/89/eQ6h3FKJf_PRl8p4AUz4wO8tqaA688.apk

需要使用到原文件名,时要把照片信息在上传的时候存贮起来(保存到数据库,必须要有FID来关联数据库)

具体方案参考:https://blog.csdn.net/gobravery/article/details/79353515

 

Spring的BeanUtils的copyProperties,将一个对象的值复制给另一个对象的相同属性:https://blog.csdn.net/langqiao123/article/details/72961383

BeanUtils.copyProperties无法复制集合问题解决(亲测属性里的list是可以复制的):https://blog.csdn.net/HXNLYW/article/details/88666115

 

图:带权图(地图路线)

 

拜占庭将军问题(一致性问题)

 

计数排序(分组每组是一个数,记录等于这个数的值的下标)和桶排序(分组每组是一段范围,把)适合于那种有一定范围限制的排序方式

 

开启服务熔断,达到服务降级的效果(走默认)

 

ase可通过秘钥解开

MD5和sha系列算法是不可逆的摘要算法

 

补充hashmap和currenthashmap,布隆过滤

 

AES对称加密双方使用同一秘钥进行加密和破解数据,RSA非对称加密是把自己的公钥发给对方,对方将信息用这个公钥进行加密后再发过来

 

版本号 3.7.0(3-)

 

curl使用指南:

curl是一个命令行工具,通过指定的URL来上传或下载数据,并将数据展示出来。curl中的c表示client,而URL,就是URL

短形势的命令行: curl -{model} url -----curl -v www.baidu.com //通知curl打开verbose模

长形势的命令行: curl --{model} url -----curl --verbose www.baidu.com //通知curl打开verbose模

在上面的命令中选项-v(或--verbose)以及-L(或--location)都是bool类型的标志位,来告诉curl打开或关闭某些特征

-X参数指定 HTTP 请求的方法

传递参数:

curl -d '{"name":"fool"}' http://example.com

$ curl -b 'foo1=bar;foo2=bar2' https://google.com

http://www.ruanyifeng.com/blog/2019/09/curl-reference.html

 

maven打包:mvn clean package -Dmaven.test.skip

进入打包所在位置:cd target

运行: java -jar xx.jar

 

类上面加上@Slf4j就可以不用再类中去取log对象了,直接使用即可

 

spring中可以引入actuator依赖就可以使用它的命令行或者是浏览器直接url的方式查看项目状态以及bean的管理

localhost:8080/actuator/beans

$: actuator XX

 

springboot配置多数据源:https://www.cnblogs.com/lijianda/p/11022892.html;

 

连接池性能表现对比:hikariCP>druid>tomcat-jdbc>dbcp>c3p0

 

@Conditinal类注解表示满足条件时才才执行(@Conditinal也可以加在类上,即满足条件(加在注解上的条件类的判断方法返回true)这个类中的所有注册bean才会生效)

 

JPAJava Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 [1]

 

posted @ 2020-03-02 15:30  liang_liu  阅读(160)  评论(0)    收藏  举报