- 博客(101)
- 资源 (7)
- 收藏
- 关注
原创 使用Linux的openssl生成https的ssl密钥,然后自己签名
把证书的key和cert配置到nginx的443端口的ssl(nginx的https必须配置ssl_certificate)生成一个密钥,长度自定,比如2048(防止有些应用要求密钥长度不能太短)使用私钥来生成证书请求(csr证书请求是用来 发给签证公司 生成证书的)注意:国家可以填CN,其他都不要填,密码不要填,回车跳到底完成。使用csr证书请求来签名(自己签,不用发证书公司,签30年)然后会让你输入签名信息,
2024-07-03 12:01:11 433
原创 项目组日常开发可以做的事
项目组日常开发中会用到一些比较好用能够提升效率的开发工具、项目代码、脚本等,还有一些日常工作备注说明避坑的,应该建立一个git仓库,像开源项目一样,把好用的工具代码发布到分享集合里,也应该有一个共用文档集合,大家上去写一些指南或者说明,以便记录或者互相提醒,形成档案。
2023-04-07 10:34:27 422
原创 实现多个不同数据库更新语句处于同一个事务内
同个数据库连接可以直接开启事务,保证数据的一致性,要么一起提交要么全局回滚。但是同个业务逻辑中涉及对多个不同数据库的数据更新,也需要保证不同数据库连接处于同一个事务管理中,确保最终要么全部提交成功要么全部回滚。一、在系统应用层面,一般是每个数据库连接配置一个事务管理器,多个数据库就会有多个事务管理器,各个事务管理器独自保证自己数据库内的事务。如下:aDB、bDB、cDB分别更新三个数据库的数据: @Transactional("?") public void commit() {
2022-05-24 11:11:27 1892
原创 redis做接口调用频率限制
需求:同一个key在timeoutSeconds时间段内最多能够调用k次接口,超过则拒绝返回false。实现方法:把当前key每一次调用时间记录下来,判断最近时间段内是否达到了允许的最大次数,达到则拒绝。存在问题:acquire方法执行时间(可能十几毫秒)内,存在并发的情况下则会把同一时间的所有acquire调用只当成一次。解决此问题的最佳方法是对该acquire同个key做线程同步,同步方式应该是轻量锁乐观锁自旋锁,因为此方法并不会阻塞线程多久。public class RateUtil
2022-04-01 10:10:22 2042
原创 前端json+@RequestBody的参数接收,不用ViewObject模型接收如何处理
@RequestBody不想使用实体对象封装前端参数,可以通过手动解析json对象并注入到方法的参数中,整个过程对代码无侵入。
2022-02-25 17:04:14 1278
原创 队列(一):LinkedBlockingQueue
LinkedBlockingQueue主要方法归类:LinkedBlockingQueue实现了接口中的的三个特性:第一个特性:Queue接口的队列FIFO先进先出特性 /** * 添加到队尾,不成功都会抛异常 */ boolean add(E e); /** * 添加到队尾,不成功返回false,成功返回true */ boolean offer(E e); /** * 取出队头(删除),没有则抛异常
2022-01-28 17:42:17 1410
原创 MySQL查询最大(小)值所在行,查询分组后前N行
没有开窗函数over()时,纯sql查询最大值行,主要思路归纳为以下几种:·思路1、使用group by分组,因为分组后只会返回每组的第一行记录,所以分组前先排序,把需要的行记录排到分组的第一行,最后分组可得每组第一行数据。·思路2、一个表自己跟自己left join,在每个分组内,假设按age排序,则通过a.age<b.age连接后,每个a.age都会关联一组比自己大的b.age,最后统计a.age的关联数count(a.age),0表示没有b.age比自己大(a.age为最大值),1表示.
2021-06-29 14:21:12 5369
原创 归并排序原理思想
一个无序集合,用归并排序,1、拆成两半:把集合对半分成两个集合,递归不断拆分2、递归分到最后两个元素,跳出递归3、跳出递归后,把分开的两个集合合并(每个集合已经排好序,遍历一次按序比较即可)基本思想实现,并未考虑性能:import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class Test { public static void main(String[] args
2021-06-01 17:54:55 318
原创 个人感悟
能满足功能需求,没有问题的代码,是好代码的前提。写代码,必要加上注释,说明这段代码的功能是什么,最好把代码的功能需求都写上,我特别不赞同别人说注释要简洁,注释不要啰嗦就好,当然是越详细越好,说明开发时接到一个什么需求,当时自己是怎么想的,代码准备用什么方法去实现这个功能,有哪些需要注意的,等等,注释只要不啰嗦,写一大段又如何,在维护代码的时候,花最多时间就是阅读代码的意图,甚至在发现一些代码存在问题时,还不能确定这是bug还是当时要求这么实现的,代码如果不说明是为了实现什么,就无法确定这段代码写的对不对好
2021-04-10 17:52:12 113
原创 写一个发布日志实时查看功能
需求因为日志在个人电脑的某个文件,每次报错都要过来看日志文件的输出,对于其他人不方便,功能:1、管理员配置页面:动态配置日志文件的绝对路径,监控日志文件实时变化,通过订阅者发布者模式,实时推送最新日志内容2、用户查看页面,从日志列表点进去,通过websocket连接,实时查看日志输出准备:java读取日志文件前端websocket写:1、新建springboot项目2、...
2021-03-27 23:17:57 2365 4
原创 websocket使用
一、用socket写群聊功能:服务器端:import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.ServerSocket;import java.net.Socket;import java.util.ArrayList;import java.util.List;public
2021-03-22 18:33:35 867
原创 个网搭(四):完成登录注册和鉴权模块
1、创建数据库 CREATE DATABASE IF NOT EXISTS luckydb DEFAULT CHARSET utf8 COLLATE utf8_general_ci; GRANT ALL PRIVILEGES ON luckydb.* TO 'username'@'%' with grant option; FLUSH PRIVILEGES;
2020-11-24 04:29:24 212
原创 个网搭(三):1、搭建微服务project框架,加上网关模块
1、下载微服务的nacos(注册中心+配置中心)https://github.com/alibaba/nacos/releases1、创建数据库 CREATE DATABASE IF NOT EXISTS luckydb DEFAULT CHARSET utf8 COLLATE utf8_general_ci; GRANT ALL PRIVILEGES ON luckydb.* TO 'username'@'%' with grant option; FLUSH PRIVILEGES;
2020-11-24 04:26:32 246
原创 个网搭(二):开发准备
Linux服务器用Java开发,安装JDK8、maven、git、git服务器(gogs)、Jenkins(自动化部署)、MariaDB数据库、redis服务器、nginx(代理)、kafka消息队列(待用)、elasticsearch引擎(待用)、
2020-11-23 20:43:19 139 1
原创 个网搭(一):准备做个个人网站,加上喜欢的功能,用一些有意思的技术
1、网站不是全开放的,所以有登录注册鉴权功能2、想在自己网站里写博客,整合一个博客系统进来3、有时需要预览各种格式的文件,可以整合个文件预览功能接口进来3、想知道访问网站的登录或者非登录用户统计,做个用户地图,通过地图数据可视化界面展示。(后台可视化展示所有访问记录,曾经或者正在浏览哪些资源,后续可以整合大数据分析)4、监控整个网站后台的运行情况,需要整合日志系统,通过可视化手段对整个系统了如指掌。5、...
2020-11-22 12:55:49 147
原创 Jenkins
一、安装:1、wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.reporpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.keyyum install -y jenkins2、 vi /etc/sysconfig/jenkins# 修改端口号:JENKINS_PORT="8088" 3、systemctl
2020-11-21 23:47:49 369
原创 mysql数据库存储text字段报错maximum row size is 8126
[Err] 1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. You have to change some columns to TEXT or BLOBs参考:https://blog.csdn.net/lsjseu/article/details/51887991问题:text字段存储大字段也会报错原因:表的ROW_FORMAT = Com
2020-09-23 16:16:15 944
原创 写代码时是否必要遵循几大设计原则?
1、单一职责原则意思大概是一个模块、一个类、一个方法中,职责是明确的,每个功能是单一的,如果职责过于复杂就又可以继续拆分。单一职责原则 无论什么时候都应该有用,职责分离后,结构变得更加清晰,更加简单易懂,容易扩展修改,容易理解和维护。2、对扩展开放,对修改关闭意思是写好的功能模块或者类或者函数,对于内部的修改是拒绝的,对于扩展来增强功能是开放的。为什么提倡写好了一个函数后不要去改它?一个点可能是比如spring,如果每个版本都把方法名、参数、实现的内容改一下,那引入这些函数的广大项目开发者估计难受
2020-08-04 23:26:07 312
原创 需要改进的事情:
1、写一个新项目,所有东西都要重头想一遍,跟新手一样。应该要形成自己的成果积累。2、idea编辑界面太鲜艳,看不到全局,应该要一眼能知道整个代码的逻辑。
2020-07-14 21:39:48 187
原创 修改equals方法为什么同时需要修改hashCode方法
jdk注释规范说到:1、equals相等,则hashCode必须相等(equals不相等,hashCode有可能相等)所以,重写了equals,一般来说都需要重写hashCode方法来满足同等性。2、如果equals相等,hashCode不相等会发生什么?那么用到hashCode来判断相等的散列映射就会出错!!HashTable、HashMap、HashSet等基于hashCode(哈希散列)的方法来判断对象相等,就算equals相等,如果hashCode不相等,直接被判定为不相等,两个对象在哈
2020-06-10 08:57:18 736
转载 再见,Lombok,没想到你才是让我们代码处于了“亚健康”状态的真正元凶!
如果您正在阅读此文,想必您对Project Lombok已经有了一段时间的了解。您是否正准备拥抱Lombok?还是正准备将如此酷炫的项目推荐给你的团队?如果您准备那么做,不妨听听我在使用Lombok一年后的一些感受。我承认,Lombok是一个很不错的Java库,它可以让你在少写代码的同时耍耍酷,简单的几个注解,就可以干掉一大片模板代码。但是,所有的源代码很多时候是用来阅读的,只有很少的时间是用来执行的(你可以细品这句话)。一年以前,我和大多数人都认为Lombok的出现会让Java的编码体验会更好,并极力
2020-06-08 08:17:44 260 2
原创 jdk并发包下:使用java.util.concurrent.Executor线程池
多线程,线程池Executor的接口类图:其他都不重要,就ExecutorService是主要的:基本上分为单纯线程池和定时任务线程池:说白了除了ForkJoinPool所有都继承于ThreadPoolExecutor或者是对ThreadPoolExecutor的包装类://构造函数 public ThreadPoolExecutor( int corePoolSize,//从0增加,直到维持不变的线程数 int maximumPoolS
2020-06-07 15:20:01 304
转载 一些比较冷门但非常实用的java技巧
Java有很多十分有用但不太为人知道的语法只要稍微学过JavaSE便可以轻松读懂本文内容,并且在实战用派上用场1.基础写一个内部类通过生成一个和外部类的实例保持关联的实例,使得外部类的实例与内部类的实例之间,能够保持一种【类-实例】似的关系public class Outer {public class Inner {}}如上写了一个内部类的话,可以像下面一样生成实例Outer o = new Outer();Inner i = o.new Inner();在new内部类的实例之前,
2020-06-07 08:34:24 800
原创 代码加上乐观锁:CAS自旋锁
CAS compareAndSwap 比较和交换原理:比如boolean flag = false;然后多线程去修改flag = true;确保同时只有一个线程(比如A)能够修改成功,一旦修改flag = true;,其他线程判断为true后只能一直等待。当线程A执行完毕,修改flag = false;,其他等待中的线程(包括A)同时又可以竞争去修改flag = true。以此标记只有同一时间只有一个线程能够执行。其中有原子数操作可以保证这种修改的线程安全: atomicInteger.compar
2020-06-07 06:42:35 378
原创 自己学习实现线程池处理任务队列
要点:1、目前实现的线程数量不可变,且线程启动时就创建2、“线程复用”原理是线程run方法循环等待和唤醒(等待队列插入,插入后唤醒)3、通过线程退出run方法来达到关闭线程的目的。4、ConcurrentLinkedDeque是单个方法级别线程安全,如果需要代码块级别的线程安全,就需要加锁。
2020-06-06 09:59:18 631
原创 java.util.Timer定时任务原理(建议使用java.util.concurrent.Executors)
```javaimport java.util.Timer;import java.util.TimerTask;public class TimerTest {public static void main(String[] args) throws InterruptedException { //创建一个定时器 Timer timer = new Timer(); //创建任务内容 TimerTask timerTask = new TimerTask() {.
2020-06-05 15:33:15 382
原创 ThreadLocal把变量绑定到线程
import java.util.Random;public class ThreadLocalTest { static ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 123); public static void main(String[] args) { Thread thread1 = new Thread(() -> { Ra
2020-06-05 11:59:33 782
原创 @ExceptionHandler(Exception.class)和@ControllerAdvice
第一种,直接在Controller层写@ExceptionHandler注解,对于指定异常,可以处理并返回一个视图或者body:@Controllerpublic class HelloWorld { @RequestMapping("test") public String test(int flag) throws FileNotFoundException { if (1 == flag) { throw new FileNotFoundE
2020-06-05 06:40:00 2899
原创 idea中springboot热部署静态文件和代码小改动
一、必须的 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</o
2020-06-04 01:15:47 568
原创 使用spring-boot-dependencies简化依赖管理
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.3.0.RELEASE</..
2020-06-03 23:01:24 19010
原创 springboot(三):使用日志
在springframework阶段,需要的jar和配置都需要自己加,但是spring boot直接根据引用的依赖自动配置。springboot自带的日志如下图所示:根据springboot官方文档-logging的描述,spring内部全部使用Commons Logging日志门面来打印日志,而且Java Util Logging API的日志不会打印到日志文件中。从上图依赖关系可知,spring framework 内部全部使用java commons logging这个门面日志打印,但是没有具
2020-06-03 08:42:08 744
原创 springboot(二):通过jar或者war部署
一、打jar包部署确认pom.xml中是<packaging>jar</packaging>在pom.xml同级目录下,运行mvn package命令,在target目录下可查找到jar文件运行java -jar .xxx.jar启动tomcatps:如果不知道打包后jar的位置,可打印完整的pom文件查看输出位置mvn help:effective-pom > pom.bak二、打war包部署到tomcat首先springboot去掉tomcat: <d
2020-06-03 08:29:36 271
原创 Android(三)原生开发基本知识
1、目的:实现业务逻辑,生成可用apk2、打开Android Studio(环境搭建,目录结构讲解),新建一个项目,选择项目类型,一般可选的有:这里的Activity就相当于MVC中的controller,跳转到Activity后,Activity会加载布局文件layout进来并渲染,最后展示在屏幕上,所以新建项目会提供一些Activity模板供选择。其中有个Empty Activity,也就是新建一个空的Activity,但是不创建对应的layout文件,所以页面是空白的。Login Act
2020-05-29 03:58:25 12432
原创 Android(二)安卓项目结构
文章目录项目结构简单演示在安卓了IDE、SDK和安卓虚拟设备(AVD)后,new 一个安卓项目,选定SDK版本(我的是29 AndroidQ),打开新建项目的窗口后,立即修改。。\projects\项目名称\gradle\wrapper\gradle-wrapper.properties文件中的distributionUrl=file:///E:/.../本地gradle安装目录,不然它会下载一个新的。或者打开Build=》gradle,在右边页面的gradle projects配置当前项目为本地
2020-05-23 23:57:37 856
原创 freemarker视图模板使用
一、配置整合springmvc <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.6.RELEASE</version> </dependency>
2020-05-22 17:44:31 269
原创 各种签名(signature)和校验
签名的概念目的: 为了确认某个信息确实是由某个发送方发送的,或者某个发布内容确实是由发送方发布的,任何人都不可能伪造消息,并且,发送方也不能抵赖。方法: 对发布的信息内容,通过某种可靠的加工(比如进行MD5运算),生成签名标识(字符串序列或者证书之类)验证: 任何人拿到发布的信息内容后,可以通过同样的加工,得出签名标识,如果比对和发布者公布的签名一致,则验证为真。签名与加密区别: 加密是为了不让别人知道原来的信息,签名是为了保证大家获取到的原来的信息是没有经过改动的。签名算法1、MD5对字符
2020-05-22 06:00:09 8681
原创 git一个大仓库存放很多文件夹,只下载其中一部分的方法
网上说的这个,其实是全部fetch到本地仓库,然后检出其中指定目录:$ git init <project>$ cd <project>$ git remote add origin ssh://<user>@<repository's url>$ git config core.sparsecheckout true$ echo "path1/" >> .git/info/sparse-checkout$ echo "path2/"
2020-05-22 03:31:15 1457
原创 HighConcurrencySolutions(1):设备增强,性能调优
设备增强,也就选择更好的服务器CPU、存储,网络,使用更好的应用服务器和数据库,采用本身性能更强的组件等性能调优,比如jvm配置提升性能,tomcat调优接受更多并发运行更为顺畅,数据库更为合理的最大连接数。...
2020-05-22 00:44:51 183
翻译 不聊技术的技术选型
内容来至:https://insights.thoughtworks.cn/choosing-technology-guide/,请查看原文。以下是截取的部分内容:有一些技术选型策略可能会导致灾难性的失败,这些选型中存在一些共同的反模式,比如:舆论驱动选型人云亦云,盲目听信外人或者某些布道师的主观性言论,这就是舆论驱动选型。它往往会带来灾难。做任何决策时,如果要借助参考资料,请记住:最重要的不是它告诉了你什么,而是它对你隐瞒了什么,这些隐瞒的信息最终会置你于险境。特别是当该资料的作者对某项技术具
2020-05-20 01:13:45 249
原创 关于密码安全存储的实现
文章目录一、想法二、设计三、加密方法选择4、加密的简单实现4.1 技术选择4.2编码实现5、时间测试、安全测试一、想法对于密码的安全不容忽视,密码由终端用户产生,并经过网络,被服务器处理,最后存储于存储设备中。密码必须加密存储,即使数据库泄露也不会导致系统被击破。同时还要考虑到服务器也会存在源码泄露的可能,因此应该考虑到即使源码和数据均被暴露,攻击者也无法加以利用。二、设计核心:抛开具体的实现,密码传输和加密过程如果足够安全,则很大程度上可以防范密码的破解。1、对于前端提交的密码,除了
2020-05-20 00:37:17 653
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人