使用AbstractProcessor自动生成角色权限数据

项目开发中遇到一个关于RBAC中数据入库问题。权限主要包含页面权限,接口权限及数据权限。页面权限一般来讲是需要手动添加的,而接口权限则是通过swagger导入,或者手工录入,这样存在很多问题。比如接口书写不规范,运营看不懂。每次迭代,都需要手动角色绑定权限,这样人工错误率非常高。页面权限问题是没法解决的,但是我们可以解决接口权限问题。

阅读更多

Netty自带编解码器及自定义编解码器

上一篇文章Netty应用层处理粘包以及半包记录了使用Netty处理TCP粘包及半包。包含定长补齐,特殊字符分割,变长协议三种方案,并且使用了Netty自带的FixedLengthFrameDecoder定长解码器,StringDecoder字符串解码器,DelimiterBasedFrameDecoder特殊字符解码器,LengthFieldBasedFrameDecoder变长解码器LengthFieldPrepender编码器。本篇文章我们记录除了这些编解码器之外的Netty编解码器及自定义编解码器。针对Netty自带的编解码器,我们持续更新。

阅读更多

Netty应用层处理粘包以及半包

上一篇文章Netty初探记录了使用Netty开发Java NIO的过程,但是并没有处理TCP的粘包与半包。因为TCP是面向流的传输层协议,传输层并不处理粘包半包的任务,所以应用层必须处理粘包与半包的问题。本篇文章记录Netty处理粘包与半包。

阅读更多

Netty初探

上一章记录了Java NIO简单使用,其中提到了常见的几种IO多路复用模型,本章我们初试Netty,使用Netty写一个Netty客户端与服务端连接。简单的比较一下Java NIO与Netty NIO的区别。

阅读更多

NIO简单使用

之前总结了一篇BIO简单使用,BIO在长链接场景,一个连接占用一个线程。在短连接场景,虽然可以通过线程池优化,但是CPU会在不同的CPU不停的切换。因此BIO并不适用于高并发。Oracle在JDK1.4中引入了NIO的SDK,NIO与BIO不同之处在于NIO使用Linux中的IO多路复用技术。IO多路复用技术是将多个阻塞IO复用到同一个Selector阻塞上。本篇文章主要记录NIO的学习过程。

阅读更多

Gateway开发与调试隔离解决方案

使用Spring Cloud开发微服务应用时,开发阶段一般会是开发人员启动一个服务,服务器部署一个服务,这样一个实例会有多个服务并且分布在服务器和开发人员的地址,这样前端调试的时候可能会请求到我们开发人员自己的电脑,有时候还会导致结果不一致。本篇文章主要解决这个问题。

阅读更多

AnnotationConfigApplicationContext解析

ApplicationContext接口负责实例化、配置和组装 bean,所谓Spring容器入口其实就是这个接口,代表着Spring IoC 容器的核心,ApplicationContext接口有很多实现方式,包括很早之前的ClassPathXmlApplicationContext,通过XML的方式装配bean,也包含了现在通过注解的方式AnnotationConfigApplicationContext。

阅读更多

Spring事务失效场景

工作中经常会使用事务,事务保证了操作的一致性,要嘛全部成功,有一个失败则全部失败。类似于与操作。其中事务具备ACID四个特性,包含原子性,一致性,隔离性,持久性。Spring开发了spring-tx模块封装了事务,包含有编程式事务与声明式事务。其中编程式事务使用TransactionTemplate实现,声明式事务使用Transactional注解。但是事务有时候会失效导致脏数据的产生,下面来进行实践测试。

阅读更多

Jackson枚举序列化与反序列化

本文主要记载Jackson按需求序列化枚举以及反序列化枚举的实现,踩过一些坑,所以做下笔记。Java默认序列化枚举的Name字段,比如ENUM_SEX_MAN(0),默认只会序列化ENUM_SEX_MAN。不满足实际需求。所以项目中需要做一些自定义。

阅读更多

SpringCloud网关下Springdoc聚合API配置

之前使用SpringBoot一般会使用SpringFox Swagger进行API接口管理,但是如果基于Spring Cloud开发,SpringFox 库最重要的问题是缺乏对WebFlux 构建的反应式 API的支持,并且也没有API聚合功能。通过搜索,我们发现了SpringDoc,支持WebMvc支持,WebFlux支持,Javadoc 支持等,支持非常广,可以参考SpringDoc官网。下面就来测试下

阅读更多

Spring实现接口加密解密

本篇文章同样使用AOP注解代理,实现运行时的接口加密解密。项目开发中有一些接口数据是敏感数据,比如用户手机号,真是姓名,身份证,密码等等。但是有一些接口是不用加密的,所以我们需要一种方式,实现与业务脱离,可自定义使用场景的代理方式。

阅读更多

Spring实现注解鉴权

项目开发中经常会对用户请求进行鉴权,用户是否有调用当前接口的权限等。单体应用我们通常会使用WebSecurityConfigurerAdapter来认证用户请求,并通过Spring注解PreAuthorize等进行鉴权,如果是微服务应用,有两种方式可以实现鉴权,第一种是将所有角色和权限从数据库中查询出来缓存到redis,然后通过网关去鉴权。第二种我们可以在网关中只判断token是否合法,如果合法就将用户信息下发到子服务中自主鉴权。本篇文章使用第二种方式,通过Spring AOP注解的方式实现自动鉴权操作,本篇文章主要做一个记载,并不是关于Spring AOP的详细使用文章。

阅读更多

Spring源码结构

现在做后台开发全是Spring的一堆框架,无论是使用的Spring MVC,SpringBoot,Spring Cloud都是基于Spring作为基础进行搭建的。从本篇文章开始将开始深入研究Spring的实现方式,架构,核心的原理等等。

阅读更多

Java使用JNI调用动态链接库

项目中有个需求,需要根据用户上传的图片分析出用户的一些面部特征,血压,血氧等用户体征数据,Java层接收用户上传图片,保存,然后将图片地址传递给C++算法去处理,算法层计算出结果并返回给Java层一个对象。这里做个简单的demo模拟这个需求,大概需要的技术有C++,JNI Java等。

阅读更多

BIO简单使用

从本章开始,后面一段时间都学习网络和IO方面的知识。网络和IO都是知识盲区,慢慢整理,争取把这部分梳理清楚,首先IO是Input和Output的简写。代表输入和输出。而从位置来区分,又分为本地IO和网络IO。本地IO代表本机系统内的设备进行通信,网络代表本机系统和网络上的系统进行通信。而网络通讯模型又分为BIO(同步阻塞IO),NIO(同步非阻塞IO),AIO(异步非阻塞IO)。本章主要记录BIO的简单使用。

阅读更多

AQS分层及自定义锁

之前写了一些锁使用文章,比如ReentrantLock(独占锁),ReentrantReadWriteLock(读写锁)等,也写了一些线程通讯类Condition(条件队列),CountDownLatch(倒计时器),CyclicBarrier(循环栅栏),Semaphore(信号量)等,底层都是使用AQS实现的。本篇文章主要记录AQS内部变量方法的使用及作用,还使用AQS实现了自定义锁的实现。比较简单,如需编写复杂的自定义锁也可以参考ReentrantLock(独占锁),ReentrantReadWriteLock(读写锁)。

阅读更多

Condition原理解析

在之前介绍ReentrantLock锁使用文章中,简单的介绍了Condition在ReentrantLock中的使用,Condition主要用作线程之间的通信,等待,唤醒等功能,但是Condition是如何实现线程之间的通信的呢?本篇文章会罗列出所有Condition的API,然后介绍每个APi的功能并且描述Condition底层的实现原理。

阅读更多

ReentrantReadWriteLock原理解析

前面在介绍ReentrantLock提到过SHARED锁和EXCLUSIVE锁,我们使用ReentrantLock的时候,虽然因为自旋效率较高,但有些情况下我们不必要使用独占锁,比如读写场景,读较多,写较少,可以让多个线程同时取读,当有线程写的时候让其余的读写线程等待即可。这样提高了读的效率。ReentrantReadWriteLock从名字来看就是读写锁,读读共享,读写互斥。

阅读更多

CyclicBarrier使用

上一篇文章使用CountDownLatch模拟一家人出行旅行的计数器模型,也可以使用CyclicBarrier实现,CyclicBarrier翻译成英文为循环栅栏,CyclicBarrier的内部原理与CountDownLatch基本一样。不同地方在于CountDownLatch使用Node管理线程中断,而CyclicBarrier使用Condition队列。其实内部都一样。文章记录CyclicBarrier的使用过程以及其内部实现原理,供后续使用,复习,复盘等。

阅读更多