暂时未有相关云产品技术能力~
Nick Liu,目前是某外资企业后端研发,专注于互联网金融、移动支付领域的技术人。主要负责发卡、汇款、充值、跨境支付等业务。 一句话形容我自己: 向外伸展,向内修行,向阳而生
分布式事务之本地消息表解决方案(跨地区转账实际案例)
Freemarker动态模板渲染&flyingsaucer将html转PDF(多页固定头尾)
WebSocket的那些事(2-实操篇)
WebSocket的那些事(1-概念篇)
Linux中快速搭建RabbitMQ
(三)Logback中的Appender
(一)Logback介绍及架构
如何创建合适的索引
我们都知道Spring Cloud Gateway是一个基于Spring Boot、Spring WebFlux、Project Reactor构建的高性能网关,旨在提供简单、高效的API路由。
最近刚好在做一个简单的保险代理人运营平台,主要是为了方便个人展业,由于有些客户数据比较敏感,所以在用户登录时准备对登录密码进行一波加密后再传输。
之前在 《前后端RSA互相加解密、加签验签、密钥对生成》 中提到过PKCS#1格式和PKCS#8格式密钥的区别以及如何生成密钥。实际有些场景中有可能也会涉及到前后端密钥格式不一致,这篇文章我们会讨论关于PKCS#1和PKCS#8格式密钥的互相转换。
最近有一些安全性要求比较高的场景,我们提供API给第三方商户用于收单,其中有几个功能是绑卡、ATM/POS密码变更。
内容营销中给用户推送营销消息最常见的方式就是发短信,比如三大运营商移动、联通、电信平时会发送一些诸如套餐办理、消费查询、话费充值这些短信,还有像银行、云服务厂商等等推送的各种包含查询服务的短信等等。
目录 一、序言 二、找资料 1、寻觅文档 2、寻觅代码 三、代码示例 1、简单的二维码 2、带颜色的二维码 3、带logo的二维码 四、工具类封装
目录 一、序言 二、如何自定义过期时间 三、解决方案 1、CacheManger的作用 2、CacheResolver的作用 四、代码示例 1、自定义缓存相关注解 (1) @TTLCacheable注解 (2) @TTLCachePut注解 2、自定义CacheResolver 3、自定义CacheManager 4、开启声明式缓存配置类 五、测试用例 1、 测试服务类 2、 带过期时间的缓存操作 3、 带过期时间的更新操作 六、结语
目录 一、序言 二、使用示例 1、配置 (1) application.properties (2) 基于Redis缓存的CacheManager配置 2、注解运用测试用例 (1) 指定key条件式缓存 (2) 返回值为Optional类型条件式缓存 (3) 不指定key条件式缓存 (4) 指定key删除缓存 (5) 指定key更新缓存 三、结语
目录 一、概述 二、声明式基于注解的缓存 1、@Cacheable注解 (1) 默认缓存key的生成 (2) 声明式自定义key生成 (3) 默认缓存解析 (3) 自定义缓存解析 (4) 条件式缓存 2、@CachePut注解 3、@CacheEvict注解 4、@Caching注解 5、@CacheConfig注解 三、开启声明式缓存注解 四、使用自定义注解
目录 一、序言 二、安装Node 1、安装nvm 2、使用兼容的Node版本 二、安装MongoDB 1、下载MongoDB 2、配置MongoDB 三、安装YApi 四、安装PM2管理Node服务 五、登录YApi后台
目录 一、关于解释器和编译器 1、概述 2、JIT(Just In Time)编译器 二、JIT优化之锁粗化 & 锁消除 三、JIT优化之逃逸分析 & 栈上分配 & 同步消除 & 标量替换 1、概念描述 2、逃逸分析代码示例 3、逃逸分析失效示例 四、JIT优化之方法内联(Inline Method) 1、概述 2、方法内联示例 3、方法内联的优点
目录 一、Lock类层次结构及相关API 1、Lock类层级结构 2、Lock接口相关API 3、关于Condition 二、synchronized VS Lock 1、synchronized实现的锁优缺点 2、Lock实现的锁优缺点 三、手撸一把简单的ReentrantLock 1、ReentrantLock实现简单流程 2、代码示例 3、测试用例
录 一、Java中锁的概念 二、同步关键字synchronized特性 1、锁消除示例 2、锁粗化示例 三、synchronized关键字原理 1、关于Mark Word 2、锁的状态变化 (1) 无锁 → 轻量级锁 (2) 轻量级锁 → 重量级锁 (3) 关于偏向锁(加锁之后不解锁,针对单线程) (4) 完整的锁升级过程
目录 一、Spring Cloud Alibaba依赖说明 二、代码示例 1、父工程spring-cloud-alibaba-learning版本依赖信息 2、子工程spring-cloud-alibaba-seata-consumer服务消费者 (1) 版本依赖 (2) application.yml配置 (3) Dubbo服务引用 (4) 启动类 3、子工程spring-cloud-alibaba-seata-provider服务提供者 (1) 版本依赖 (2) application.yml配置 (3) 服务实现类 (4) 启动类 三、启动服务&查看Nacos控制台 四、总结
文章目录 一、引入依赖 二、代码示例 三、测试结果 1、控制台输出 2、生成的代码
目录 一、Validation及国际化配置 1、添加依赖 2、校验失败提示消息国际化配置 3、application.properties 4、国际化资源文件 二、代码演示 1、全局异常处理 2、MessageUtils工具类 3、响应VO 2、测试Controller和请求DTO 3、多语言属性文件 4、测试用例 (1)简单对象UserReqDTO测试 (2)包含List集合对象的ChargeRuleReqDTO测试
一、问题说明 二、解决办法
目录 一、使用zkclient作为zk连接客户端问题 1、Maven依赖如下 2、服务提供者配置文件 3、启动服务提供者 4、原因分析 5、解决办法 (1)降低dubbo版本 (2)添加ZookeeperTransporter拓展实现 二、使用curator作为zk连接客户端版本问题 1、Maven依赖如下 2、服务提供者配置文件 3、启动服务提供者 4、curator作为zk连接客户端可行依赖 三、总结
目录 1、配置文件 (1) Redis主节点配置文件 (2) Redis从节点配置文件 (3) Sentinel(哨兵)配置文件 2、启动Redis服务和哨兵 (1) 启动3个Redis服务 (2) 启动3个哨兵 3、客户端连接 (1) 客户端哨兵读写分离配置 (2) 故障转移测试用例 (3) 停掉master节点模拟宕机
目录 1、配置文件 2、启动服务并创建集群 (1)启动6个Redis服务 (2)通过客户端命令创建集群 3、客户端连接 (1)客户端配置 (2)测试用例 (3)错误日志分析 4、问题解决 (1)查redis.conf配置文件 (2)修改配置文件 (3)重新启动Redis服务并创建集群 5、故障转移期间Lettuce客户端连接问题 (1)测试用例 (2)停掉其中一个master节点,模拟宕机 (3)解决办法 1)更换Redis客户端 2)Lettuce客户端配置Redis集群拓扑刷新
前面在Maven中构建SWT应用的时候发现SWT相关jar包在Maven中央仓库上找不到,后面在stackoverflow上有人提供了一个仓库地址:https://github.com/maven-eclipse/maven-eclipse.github.io。 根据上面所说,SWT相关依赖在Maven中央仓库中不可取,目前存在的Maven仓库不包括所有平台的包,也没有源码和debug包,总之就是没有提供可信赖和自动化的方式更新和仓库再生,而Redirecting...这个仓库会自动下载并打包官方的SWT发布版本。
首先,servlet3.0支持模块化,在jar包中如果有web-fragmenet.xml,则servlet容器会先加载web.xml里的listener、filter和servlet,再加载web-fragment.xml里的组件。关于模块化的介绍:
原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不能被打乱,也不可以被切割而只执行其中的一部分(不可中断性)。将整个操作视为一个整体,资源在该次操作中保持一致,这是原子性的核心特征。
线程在java中是一个对象,更是操作系统的资源,线程创建、销毁需要时间。如果创建时间 + 销毁时间大于执行时间就很不合算。
一、线程通信的方式 二、线程协作-JDK API 1、被弃用的suspend和resume (1) 正常的suspend/resume使用示例 (2) 造成死锁的suspend/resume示例 2、wait/notify机制 (1) wait/notify正确使用示例 (2) wait/notify死锁示例(notify先调用) 3、park/unpark机制 (1) 正确的park/unpark使用示例 (2) 死锁的park/unpark 三、伪唤醒
为了提高程序运行的性能,现代CPU在很多方面对程序进行了优化。 例如:CPU高速缓存。尽可能地避免处理器访问主内存的开销,处理器大多会利用缓存以提高性能。
目录 一、前言 二、Lambda表达式入门 1、Lambada表达式示例 2、Lambda表达式语法说明 3、更多示例 三、Lambda表达式与函数式接口 1、Supplier接口 2、Consumer接口 3、Predicate接口 4、Function接口 四、方法引用与构造器引用 五、方法引用和构造器引用示例 1、引用类方法 2、引用特定对象的实例方法 (1) 示例1:字符串转换 (2) 示例2:反射 3、引用某类对象的实例方法 4、构造器引用
目录 一、Logback扩展点介绍 1、为什么不能用logback.xml配置文件呢? 2、扩展点缺点 二、指定Profile配置 三、环境属性
目录 前言 一、Push模式原理 二、Sentinel控制台改造支持配置持久化至Nacos 1、拉取最新代码 2、开始搬运代码 (1) 调整点之修改NacosConfig类 (2) 调整点之新增NacosConfigProperties类 (3) 调整点之修改NacosConfigUtil类 (4) DynamicRuleProvider和DynamicRulePublisher实现优化 1) AbstractNacosProvider类 2) AbstractNacosPublisher类 3) FlowRuleNacosProvider类 4) FlowRuleNacosPublisher
目录 一、Nacos简介 二、Nacos单机模式部署 1、下载编译后压缩包 2、修改配置文件application.properties 3、执行数据库脚本 4、启动服务器 5、查看启动日志 三、登录Nacos控制台
目录 一、前言 二、html转图片 1、添加依赖 2、代码示例 (1)测试html文件 (2)代码示例 3、演示结果 三、html转pdf 1、添加依赖 2、代码示例 3、演示结果 四、注意点 1、html转图片的源url 2、部署到linux上后中文乱码 五、Linux上安装字体 1、拷贝字体 2、赋予权限 3、建立字体缓存 4、查看安装的字体
目录 一、背景 二、Gitlab上Fork仓库 三、SoureTree上新增远程仓库 1、进入仓库设置 2、新增远程仓库 四、同步原仓库代码以及gitlab提merge 1、同步原仓库最新代码 2、gitlab上提merge
文章目录 一、CPU相关概念 1、物理CPU 2、物理CPU内核 3、逻辑CPU 4、几核几线程 二、Linux中查看物理CPU、物理内核、逻辑CPU命令 1、查看物理CPU个数 2、查看每个物理CPU核心数 3、查看逻辑CPU的个数 三、CPU架构 1、多个物理CPU 2、多核CPU 3、多核超线程
文章目录 一、全局设置 1、新工程设置(New Projects Settings -> Settings for New Projects) 2、新工程结构设置(New Projects Settings -> Structure for New Projects) 二、单个工程设置(Settings) 三、其它 1、控制台乱码处理 2、消除Mybatis Mappr.xml文件中的警告
Spring中声明式事务确实给我们带来了很大的便利,在Service层方法上带上@Transactional注解即可实现事务,首先看看@Transactional的默认配置:
用过Disconf的小伙伴都知道,这两个Bean配置是必不可少的,那么这两个Bean的作用是什么呢?其实很简单,Disconf有一个Web端,第一个DisconfMgrBean的作用就是从Web端下载配置文件,然后解析配置文件将配置信息存到Disconf配置仓库中,而DisconfMgrBeanSecond的作用就是给带有@DisconfFile注解的bean或者带有@DisconfItem注解的配置项注值。
乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行中的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程。
审计和调试分布式应用是logback的设计目标之一,在多线程环境中,不同的线程会处理不同的客户端,为了区分不同客户端日志输出,一种轻量级但不可取的做法是为每个实例化一个新的、完全分离日志记录器,这种方法会产生很多的日志记录器而且难以管理。
规律型过滤器继承自Filter抽象类,该类主要由带有ILoggingEvent参数的decide()方法组成。多个过滤器会基于三进制规则进行排序,每个过滤器的decide(ILoggingEvent event)方法依次会被调用,该方法返回FilterReply的枚举值,例如:DENY、NEUTRAL、ACCEPT。如果方法返回值为DENY,那么日志对象会被终止而不会被其它过滤器访问。
ayout是logback中负责把日志事件转换成成字符串的组件
ncoder负责转换日志事件为字节数组并将字节数组输出到输出流中,编码器是在logback 0.9.19版本中引入的,以前老版本中大多数appenders依赖layout转换日志事件,然后使用java.io.Writer写入。先前版本中,用户通常会在FileAppender中嵌PatternLayout,从logback 0.9.19版本开始,FileAppender和它的子类只需配置Encoder即可,而不再需要配置Layout。
Logback会把书写日志事件的任务委托给叫做appender的组件,appenders必须实现ch.qos.logback.core.Appender接口,该接口方法如下: