Spring Retry
Spring Retry重试
重试是指当一个程序运行过程中,遇到网络延迟、中断等情况时,为了保证程序容错性、可用性、一致性等一个措施。
简介
Spring Retry 是一套 Spring 实现的一套重试机制,主要功能点在于重试和熔断。它被广泛用于Spring Batch,Spring Integration, Spring for Apache Hadoop 等项目。它主要是针对可能抛异常的一些调用操作,进行有策略的重试
Spring Retry 提供了 注解 和 编程 的两种支持,提供了 RetryTemplate 的支持
使用Spring Retry 编程式导入依赖1234<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId></dependency>
自定义异常1234567891011121314public class RemoteAccessExc ...
MySQL 函数
MySQL 函数字符串函数CONCAT
字符串 s1,s2 等多个字符串合并为一个字符串
12# SELECT CONCAT(str:varchar*)SELECT CONCAT('hello', 'world', '!')
CONCAT_WS
同 CONCAT(s1,s2,…) 函数,但是每个字符串之间要加上 x,x 可以是分隔符
12# SELECT CONCAT(sepatator:varchar, str:varchar*)SELECT CONCAT_WS('-', 'hello', 'world', '!')
FIND_IN_SET
返回在字符串s2中与s1匹配的字符串的位置
12# SELECT FIND_IN_SET(str:varchar, strlist.varchar);SELECT FIND_IN_SET("c", "a,b,c,d,e");
FIELD
返回第一个字符 ...
Spring 原理 - AOP
SpringAOPAop实现之AJC编译器AJC即aspectj-maven-plugin插件,它可以实现静态编译代理,编译阶段 compile 对文件进行增强,可以从 生成的.class 文件可以看出
导入AJC依赖
123456<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt --><dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.8.13</version></dependency>
12345678910111213141516171819202122232425<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId&g ...
Spring 原理 - Bean和容器
SpringBeanFactory和ApplicationContextBeanFactory12345678910@SpringBootApplicationpublic class SpringDemoTestApplication { public static void main(String[] args) { /** * Class<?> primarySource-SpringDemoTestApplication:引导类 * String... args-agrs[] 应用程序参数 */ ConfigurableApplicationContext context = SpringApplication.run(SpringDemoTestApplication.class, args); }}
打开类图 我们可以发现:
BeanFactory是ApplicationContext的父接口,是Spring的核心容器,主要的App ...
阅读源码-@Transaction
阅读源码-@Transaction
@Transaction事务注解中rollBackFor和noRollbackFor底层执行逻辑
方法论方法论-关注调用栈
栈底调用栈顶
通过调用栈找到了事务相关的方法
org.springframework.transaction.interceptor.TransactionInterceptor#invoke(MethodInvocation)
重新打上断点,恢复程序后,重新发送请求。从这里开始正向调试,从框架代码一步一步往业务代码执行。
步入方法,继续调试
org.springframework.transaction.interceptor.TransactionAspectSupport#invokeWithinTransaction
方法论-开启Debug日志
通过观察日志的输出,寻找阅读源码突破口
123logging: level: root: trace
寻找日志输出的地方,重新打上断点后,重新调试程序。
方法论-查看被调用的地方
直接查看注解在框架哪些地方被调用
当调用的地方比较少时,直接在调 ...
ELK
ELK
ELK即Elasticsearch、Logstash、Kibana组合起来搭建的线上日志系统
ELK各个服务的作用
ElasticSearch:用于存储收集到的日志信息
Logstach:用于收集日志,应用整合Logstach会将日志发送给Logstach,Logstach再将日志转发到ElasticSearch
Kibana:通过Web端的可视化界面来查看日志
使用Docker Compose搭建ELK环境拉取镜像123docker pull elasticsearch:6.4.0docker pull logstash:6.4.0docker pull kibana:6.4.0
使用docker-compose.yml脚本启动ELK服务创建配置文件存放目录1mkdir /mydata/logstash
上传logstash-springboot.conf文件1234567891011121314input { tcp { mode => "server" host => "0.0.0.0&q ...
XXL-JOB
XXL-JOB概述
XXL-JOB 是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。
中文文档:https://www.xuxueli.com/xxl-job/
设计思想设计思想是将调度行为抽象形成调度中心公共平台,平台本身不承担业务逻辑,而是负责发起调度请求后,由执行器接收调度请求并执行任务,这里的任务抽象为分散的 JobHandler,交由执行器统一管理。通过这种方式即可实现调度与任务相互解藕,从而提高系统整体的稳定性和拓展性。
系统组成
调度模块(调度中心):负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover。
执行模块(执行器):负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效;接收“调度中心”的执行请求、终止请求和日志请求等。
架构
特 ...
高级MQ
高级MQMQ一些常见问题
消息可靠性问题:如何确保发送的消息至少被消费一次
延迟消息问题:如何实现消息的延迟投递
消息堆积问题:如何解决数百万消息堆积无法及时消费的问题
高可用问题:如何避免单点的MQ故障而导致的不可用问题
消息可靠性
消费者将消息投递给exchange(交换机),exchange再将消息路由到queue(队列),queue最后将消息投递到consumer(消费者)。
发送时丢失
生产者发送的消息未送达exchange
消息到达exchange后未到达queue
MQ基于内存存储消息,MQ宕机后,queue里的消息将会丢失
consumer接收到消息后未消费就宕机
生产者消息确认机制
RabbitMQ提供了publiser confirm机制来避免消息发送到MQ过程中丢失的问题。
消息发送到MQ之后,会返回一个结果给发送者,表示消息是否处理成功。
publisher-confirm:发送者确认
消息成功投递到交换机,返回ack
消息未投递到交换机,返回nack
publisher-return:发送者回执
消息投递到交换机,但没有路由到队列,返回a ...
MySQL运维
MySQL运维日志错误日志
错误日志是MySQL中最重要的日志之一,它记录了当mysqlId启动、停止以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,查看此日志。
该日志时默认开启的,默认存放目录/var/log/,默认的日志文件名为mysqld.log。
日志变量12# 查看日志位置show variables like '%log_error%';
查看日志1tail -50f ./xxx.err
二进制日志
二进制日志(BINLOG)记录了所有的DDL(数据定义语言)语句和DML(数据操纵语言)语句,但不包括数据查询(SELECT、SHOW)语句。
作用
灾难数据恢复
MySQL主从复制
1show variables like '%log_bin%';
日志格式
MySQL服务器中提供了多种格式来记录二进制日志
日志格式
含义
STATEMENT
基于SQL语句的日志记录,记录的SQL语句,对于数据进行修改的SQL都将记录在日志文件中
ROW(defau ...
MySQL进阶
MySQL进阶篇事务事务简介
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即事务时逻辑上的一组操作,要么同时执行成功,要么同时执行失败。
123456789101112CREATE TABLE `account` ( `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id', `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '姓名', `money` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '余额', PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai ...