定时任务 corn
corn表达式语法:秒 分 时 日 月 周 年(Spring 不支持)http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.htmhttp://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.htm
生成工具https://www.toolscat.com/https://www.toolscat.com/特殊字符:,:枚举;(cron=“7,9,23 /* /* /* /* ?”):任意时刻的 7,9,23 秒启动这个任务;-:范围:(cron=“7-20 /* /* /* /* ?”):任意时刻的 7-20 秒之间,每秒启动一次:任意;指定位置的任意时刻都可以/:步长;(cron=“7/5 / /* /* /* ...
线程池配置 异步编排 CompletableFuture
自定义线程池 config123456789101112131415161718192021222324package com.jhj.gulimall.product.config;import org.springframework.beans.factory.annotation.Configurable;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.util.concurrent.*;@Configurationpublic class MyThreadConfig { @Bean public ThreadPoolExecutor threadPoolExecutor(ThreadPoolConfigProperties pool){ return new ThreadPoolExecutor(pool.getCore ...
CompletableFuture异步编排
线程池1public static ExecutorService executor = Executors.newFixedThreadPool(10);
创建异步任务1234567//异步任务,放到自己的线程池 无返回值CompletableFuture.runAsync(()->{ System.out.println("当前线程"+Thread.currentThread().getId()); int i=10/2; System.out.println("运行结果"+i); },executor);
12345678910//异步任务,放到自己的线程池 有返回值 CompletableFuture<Integer> integerCompletableFuture = CompletableFuture.supplyAsync(() -> { Sy ...
延时消息队列
使用场景目的是保证事务最终一致性
消息的TTL
Exchanges 死信
流程
整合使用配置123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263package com.jhj.gulimall.ssoclient.config;import org.springframework.amqp.core.Binding;import org.springframework.amqp.core.Exchange;import org.springframework.amqp.core.Queue;import org.springframework.amqp.core.TopicExchange;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration ...
本地事务与分布式事务
本地事务事务的基本性质数据库事务的几个特性:原子性(Atomicity )、一致性( Consistency )、隔离性或独立性( Isolation)和持久性(Durabilily),简称就是 ACID;
原子性:一系列的操作整体不可拆分,要么同时成功,要么同时失败
一致性:数据在事务的前后,业务整体一致。
转账。A:1000;B:1000; 转 200 事务成功; A:800 B:1200
隔离性:事务之间互相隔离。
持久性:一旦事务成功,数据一定会落盘在数据库。
在以往的单体应用中,我们多个业务操作使用同一条连接操作不同的数据表,一旦有异常,我们可以很容易的整体回滚;
Business:我们具体的业务代码Storage:库存业务代码;扣库存Order:订单业务代码;保存订单Account:账号业务代码;减账户余额比如买东西业务,扣库存,下订单,账户扣款,是一个整体;必须同时成功或者失败一个事务开始,代表以下的所有操作都在同一个连接里面
事务的隔离级别
READ UNCOMMITTED(读未提交)该隔离级别的事务会读到其它未提交事务的数据,此现象也称之为脏读。
REA ...
SEATA分布式事务
官方地址http://seata.io/zh-cn/index.htmlhttp://seata.io/zh-cn/index.html
参考官网即可使用1每个微服务都需要创建 UNDO_LOG 表SEATA AT 模式需要 UNDO_LOG 表
1234567891011121314-- 注意此处0.3.0+ 增加唯一索引 ux_undo_logCREATE TABLE `undo_log` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `branch_id` bigint(20) NOT NULL, `xid` varchar(100) NOT NULL, `context` varchar(128) NOT NULL, `rollback_info` longblob NOT NULL, `log_status` int(11) NOT NULL, `log_created` datetime NOT NULL, `log_modified` datetime NOT NULL, `ext` varchar(100) DE ...
接口幂等性
是什么接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用;比如说支付场景,用户购买了商品支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多扣钱了,流水记录也变成了两条,这就没有保证接口的幂等性。
哪些情况防止幂等用户多次点击按钮用户页面回退再次提交微服务互相调用,由于网络问题,导致请求失败。feign 触发重试机制其他业务情况
那些情况需要以 SQL 为例,有些操作是天然幂等的。SELECT /* FROM table WHER id=?,无论执行多少次都不会改变状态,是天然的幂等。UPDATE tab1 SET col1=1 WHERE col2=2,无论执行成功多少次状态都是一致的,也是幂等操作。delete from user where userid=1,多次操作,结果一样,具备幂等性insert into user(userid,name) values(1,‘a’) 如 userid 为唯一主 ...
OpenFegin远程调用丢失请求头问题
原因调用了拦截器
解决配置(非异步)1234567891011121314151617181920212223242526272829303132333435363738package com.jhj.gulimall.product.config;import feign.RequestInterceptor;import feign.RequestTemplate;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;@Configurationpubl ...
SpringSession
主要解决session共享不同步问题
使用redis存储sessionpom
1234<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId></dependency>
配置
12345678910111213#方式spring: session: store-type: redis #redis连接信息 redis: host: localhost port: 6379server: servlet: session: #超时 timeout: 30m
整合
1234567891011121314151617181920package com.jhj.gulimall.auth.server;import org.springframework.boot.SpringApplica ...
RabbitMq介绍 docker-compose安装 springboot整合
概述
大多应用中,可通过消息服务中间件来提升系统异步通信、扩展解耦能力
消息服务中两个重要概念:消息代理(message broker)和目的地(destination)当消息发送者发送消息以后,将由消息代理接管,消息代理保证消息传递到指定目的地。
消息队列主要有两种形式的目的地
队列(queue):点对点消息通信(point-to-point)
主题(topic):发布(publish)/订阅(subscribe)消息通信
点对点式:
消息发送者发送消息,消息代理将其放入一个队列中,消息接收者从队列中获取消息内容,消息读取后被移出队列
消息只有唯一的发送者和接受者,但并不是说只能有一个接收者
发布订阅式:
发送者(发布者)发送消息到主题,多个接收者(订阅者)监听(订阅)这个主题,那么多个接收者就会在消息到达时同时收到消息
JMS(Java Message Service)JAVA消息服务:
基于JVM消息代理的规范。ActiveMQ、HornetMQ是JMS实现
1.AMQP(Advanced Message Queuing Protoco ...