- 博客(36)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 【SEATA源码分析】 配置相关源码解析
一 . 导读在实例化的时候通过 ConfigurationFactory 获取后作为参数注入的,需要重启才能生效,而在使用时通过 ConfigurationFactory 获取的,配置改了就可以生效。但是 config模块 提供了 ConfigurationChangeListener#onChangeEvent 接口方法,实例化了的类,可以通过实现这个接口方法,监听动态变化的属性,如果检测到...
2020-01-10 22:11:55
670
1
原创 中间件集群之间数据同步和故障转移
一. 数据库之间数据同步mysql 两种集群同步方式:Replication 同步方式特点: 弱一致性、速度快、低价值,适合日志新闻帖子等。PXC 同步方式特点: 强一致性、速度慢、高价值,适合订单、账户、财务等。Replication 介绍:Master 写,slave 读,单项操作。基本流程: sql-thread 可能是多线程。主备切换时,计划外切换先让备库获取中继日志relay-log,选择并设置新主库,查找其他从库上复制事件在新主库上二进制坐标,在新从库上重置复制,按上一步获得的二
2022-03-20 20:18:39
1870
原创 自动排单功能的一些思考
一: 产品需求四个角色,用户、订单、悦姐、店长,自动排单需要把用户下的订单替店长排到悦姐身上。订单分为周期指定悦姐订单和单笔随机订单。悦姐库存以半小时为单位,每半个小时算一个槽。下单时间根据配置来,白天基本都可以下单。目标: 在订单和悦姐之间寻找最佳匹配模型:悦姐: 库存、技能、家庭住址订单:地址、技能、占时硬性约束: 悦姐存在满足的库存和技能软性约束: 得分(偏好,距离,库存利用率)指标: 悦姐库存技能一定时排订单最多,或者总得分最高,单个门店或者所有门店作为维度二: 算法
2021-10-01 22:43:58
1128
2
原创 QLexpress源码解析
一. 流程分析表达式: 10 * 10 + 1 + 2 * 3 + 5 * 21:整体处理被 ExpressRunner 托管,可以在这个类里开启一些运行时辅助功能,比如 是否使用Cache中的指令集、是否输出详细的执行指令信息 等等,。首先调用这个方法 ExpressRunner#execute(Sting,IExpressContext):Object ,第一个参数是表达式,第二个是上下文。2:然后调用 ExpressRunner#parseInstructionSet(String): Ins
2021-08-08 20:25:25
1634
1
原创 对线程池 ThreadPoolExecutor 进行增强,使用 metrics 增加可监控、可运维性
一:背景最近在做推荐排单时,有些走规则进行实时查询的需求,需要并行的远程调用处理数据,所以使用了线程池异步并行处理。但是原生线程池没有监控,没有监控就没法统计数据,没法调参数,需要一个能统计任务数据的线程池。约束:时间有限、不脱离线程池的范畴、不过度设计。二:方案本次方案实现了三个功能:任务监控、告警通知、运行时参数查看。1) 任务监控实现方式:通过继承 ThreadPoolExecutor,重写预留的两个方法 beforeExecute(Thread t, Runnable r)、 after
2021-03-31 16:52:34
932
原创 业务代码应该怎么写
一. 前言不知不觉也写了两年业务代码了,是时候总结一波了。二.模块划分首先是包的划分, controller、service、dao、model、util 等包是要有的,在正常的业务之外,我认为还可以有filter:对请求进行处理,解析出请求参数或者登陆人信息,context:存放线程相关的上下文,比如一次请求的参数,登陆人信息,exception:全局处理异常,可以分开业务异常和运行...
2020-06-02 09:07:49
2638
原创 业务、线程、虚拟机、通信框架等对异常的处理
一. 前言异常是开发中,非常常见的。异常在不同的场景中,有不同的作用。本文就聊一聊,在 java 应用、线程、第三方框架等场景中,对异常常见的处理方式。二. 语言场景下的异常首先是超类 java.lang.Throwable ,超类有两种类型的子类,一类是 java.lang.Error ,一类是 java.lang.Exception 。前者是用来描述 java 内部在运行时出现错误或者资源耗尽情况,不应该被 catch 捕获。后者分为两种情况,一种是 java.lang.RuntimeExcept
2020-05-26 21:21:51
227
原创 【Feign源码解析】feign 源码解析
一. 前言看 feign 源码有一个有趣的感受,feign 利用 spring 或者说与 spring 结合的方式,和 mybatis 是一样的,真是天下代码一大抄。先附上 feign 项目提供的示例,非常的全,藏在 github 仓库中,不看源码都没发现。。。feign官方示例二. feignclient bean 被代理的方式首先从 springboot 的启动项看起,springb...
2020-04-22 20:21:20
652
原创 【MyBatis源码解析】spring-mybatis 源码解析
一。前言人们总是一边追逐一边回味。既要研究大型分布式框架,单机的优秀框架也不能错过。二。重要设计每次使用 mybatis,都会引入 mybatis-spring 包,并且设置两个bean‘,SqlSessionFactoryBean 和 MapperScanConfigurer,并且把 SqlSessionFactoryBean 当作属性,注入 MapperScanConfigurer。Sq...
2020-04-12 20:31:55
216
原创 【中间件常用写法】一些设计上的基本常识
前一段时间,尝试过总结中间件的写法,奈何见识太少,总是不能清晰的抽象出来。后来偶然间看到梁飞大佬的博客,读来有醍醐灌顶之感,大佬在九年前就总结出来一套模型了和一些常见的写法示例,非常清晰。在这里放一些大佬的博客链接:一些设计上的基本常识:一些设计上的基本常识。大佬的 核心域、服务域、会话域的划分,和我前一篇博客想表达的一样,只不过我没总结好,不够清晰。还有 api 和 spi 分离,中间件...
2020-03-31 20:11:20
426
原创 【SEATA源码分析】记一次 pr
一 . 导读为什么为想起来贡献 pr 呢?在写这个 pr 之前,研究了一个多月 seata 源码,看的多了手就痒了,恰好又看到了社区的 issues ,于是就动手了。二. pr 相关pr 内容:参与方回滚,地址。由参与方通知TC回滚,可以提前结束全局事务并释放锁,提高seata事务的吞吐量;至于发起方可以接收参与方抛出的约定异常,不再通知TC,直接结束。这里简单介绍一下现如今的做法,只有发...
2020-03-16 16:11:48
744
原创 【SEATA源码分析】 core 模块源码解析
一 . 导读core 模块定义了事务的类型、状态,通用的行为,client 和 server 通信时的协议和消息模型,还有异常处理方式,编译、压缩类型方式,配置信息名称,环境context等,还基于 netty 封装了 rpc ,供客户端和服务端使用。按包顺序来分析一下 core 模块主要功能类:codec:定义了一个 codec 的工厂类,提供了一个方法,根据序列化类型来找对应的处理类。...
2019-12-14 15:34:15
1103
原创 【SEATA源码分析】 rm-datasource 模块源码解析
一 . 导读前几篇模块分析的时候说到,spring模块中的 GlobalTransactionScanner 实现了InitializingBean 这个接口类,重载 postProcessAfterInitialization() 方法,在这个方法中,判断被扫描的bean是否是 DataSource 类型,如果是,用 DataSourceProxy 替换。而 @GlobalTransact...
2019-12-02 23:27:36
973
原创 【SEATA源码分析】 tm 模块源码解析
一 .导读首先放一张tm模块的主要类关系图:从图中可以很明显的看出,模块暴露出去的类是 TransactionalTemplate ,模板类中找 GlobalTransactionalContext 类获取业务业务类,而业务类持有了一个 TrancationManagerHolder 类,即由 TransactionManager 的实现类封装成的单例持有类,holder 通过SPI的方式加...
2019-11-30 11:44:11
1169
原创 【SEATA源码分析】 tcc 模块源码解析
一 .导读上一篇讲到,Seata的spring模块对bean进行处理,当GlobalTransactionalScanner 扫描到TCC服务的 ‘reference’ 时,对其进行动态代理,即给bean织入对应事务模式的MethodInterceptor 的实现类。TCC的实现类就是TccActionInterceptor ,在实现类中,调用TCC模式的事务处理方法,TCC 模块 主要功能...
2019-11-24 23:11:49
1458
3
原创 【SEATA源码分析】spring 模块源码解析
一. 导读spring是java开发必备框架,类一般都是通过spring进行管理。那spring之外的框架,尤其是想使用spring代理的类的框架,如何借助spring的扩展方式来操作bean?这篇文章主要分析seata如何借助spring扩展点对代理的bean进行操作,最终生成自己的数据库代理bean和织入interceptor。二. Spring模块主要类解析这儿是spring模...
2019-11-21 10:41:24
1147
原创 【中间件常用写法】中间件如何加载和控制类
一. 导读每一个框架都有客户端和服务端,一般客户端只需要引入一个包,然后通过注解自动开启客户端,这是如何左到的?有的框架,比如 Seata 没有引入 spring ,就无法使用 spring 的注解来定义bean,那么它是如何管控实例的?...
2019-11-10 20:01:54
606
原创 【中间件常用写法】中间件架构中常用模型详解
一.写在前面源码看的多了,就会感觉到很多架构都有相似的地方,许多操作都有其通用性。就像框架中的一些组件,以及他们承担的责任,都有相似的地方,这篇博客就来分析一下组件中通用类的作用。二.组件中通用类分析首先我们看一下现在很流行的seata框架,它的全局事务的控制是如何做到的:这是seata的整体架构图,细节很多,主要说一下每个Microservice如何管控自己的Branch事务分支并与TC...
2019-11-03 14:00:29
1328
1
原创 springboot,接阿里云消息rocketmq (二),优雅的使用mq
上一篇文章仅仅使用了CommandLineRunner和@Configuration、@component等注解,如果仅仅是自己玩足够了,但是用在生产,实在不够优雅。再加上,之前玩过rabbitmq的starter,于是想弄一个rocketmq的starter。不想重复造轮子,于是谷歌了一下,发现alibaba开源了一个starter,扩展spring-cloud-stream,优雅的进行mq的...
2019-03-25 15:12:47
2114
原创 springboot,接阿里云消息rocketmq (一)
首先上一张rocketmq的架构图:Rocket主要使用两个组件:Name Server和Broker。Name Server:mq的寻址服务。用于把mq的Broker路由信息做聚合。客户端通过name server去获取topic的路由信息,从而决定对哪些Broker做连接。nameserver是无状态的,互相之间不通信息,客户端寻找nameserver是,随机选一个进行连接,namese...
2019-01-20 12:26:07
3802
3
原创 微信wap第三方登陆,springboot框架
首先,这里有个坑,微信开放平台和微信公众平台不是一回事。wap端登陆属于微信公众号的功能,而网页端第三方登陆才是微信开放平台的功能。附上微信公众平台的开发者文档地址:添加链接描述。首先要配置好微信公众号,这里还要区分一下订阅号和服务号。订阅号:每个月可以发的消息比较多,但是没有第三方登陆和支付的功能。服务号:可以有登陆支付等功能。配置服务号的时候要仔细看文档,在配置token验证地址的时...
2018-12-14 14:21:31
828
原创 springboot中使用quartz进行定时任务操作
在springboot中使用quartz进行定时结算操作,并使用feign跨服务调用数据。
2018-11-22 12:04:41
13053
4
原创 将springcloud项目打成war包部署到tomcat中
1.首先把jar包改成war包,然后把内嵌的tomcat去掉<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLo...
2018-10-11 12:02:55
8482
3
原创 springcloud中组件feign使用研究记录
feign请求有两种方式:第一种,注解中直接使用spring.application.name,就是注解中name直接等于被调用的项目的name名。@FeignClient(name="clientname")public interface GoodsRemote @RequestMapping(method = RequestMethod.POST , value = "/ss...
2018-09-26 17:15:58
257
原创 阿里云oss对象服务器操作研究
给阿里云上传内容(图片、视频、word等等)。 首先需要引入阿里云提供的包,然后就可以使用阿里云oss提供的api进行操作。 <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</art...
2018-08-02 11:04:31
939
原创 解决ajax跨域访问和Content-Type问题,报No 'Access-Control-Allow-Origin' header错误
首先是No ‘Access-Control-Allow-Origin’ header is present on the requested resource。报这个错误不一定就是服务端不允许跨域访问,如果你已经允许服务端跨域了。 在Tomcat服务器下conf/web.xml中,或者项目WEB-INF/web.xml中,我选择的是在项目下配置过滤器。我验证了两个,一个是tomcat下自带的co...
2018-07-31 11:15:17
2925
原创 支付接口开发总结,支付宝接口、通联接口
主要知识点:会使用httpclient、理解回调和通知机制支付宝开发主要就是三个接口:一个是下订单的接口。这个接口中,先存储自己的订单业务逻辑。 然后根据自己支付宝注册成为商户时,支付宝提供给你的商户appid、私钥,来实例化一个支付宝的客户端。AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatew...
2018-07-18 09:40:12
4728
原创 单点登陆开发总结,客户端只需一个filter,服务端提供三个校检接口即可
单点登录,各个子系统和认证中心的交流是通过token,浏览器与子系统之间和浏览器与认证中心之间,是通过session直接交流。浏览器只能看得到子系统,不能直接接触认证中心。当浏览器需要子系统为其创建会话时,子系统需要将浏览器重定向到认证中心,这时浏览器直接与认证中心交流。浏览器在认证中心登录成功后,认证中心创建全局会话,并且帮助子系统创建局部会话。由认证中心重定向到子系统,重定向时把认...
2018-07-16 18:03:32
469
原创 基于SSM实现图片、文件、excel的导入导出
本次ssm框架的搭建都是正常的配置,除了下面说的包,只需要引入增删改查所需要的包即可。&amp;amp;lt;!-- Map工具类 --&amp;amp;gt; &amp;amp;lt;dependency&amp;amp;gt; &amp;amp;lt;groupId&amp;amp;gt;commons-collections&amp;amp;lt;
2018-06-14 19:17:36
1603
2
原创 java语言高级特性(二)数据结构相关类及实现原理
数据有逻辑结构和存储结构,逻辑结构又有四种:list,tree,set,graph。存储结构有顺序印象和非顺序印象,因此有顺序存储结构和链式存储结构。java JDK为常用的数据结构定义了一些Interface和Implementation。这些接口、实现类以及常用的排序、查找等算法成为Java Collection框架(Java Collection Framework)。Collection接口
2017-09-25 22:40:29
1045
原创 java语言高级特性(一)多线程创建、交互
创建线程的两种常用方法第一种是继承Thread类,重写该类的run()方法。 第二种 方式实现Runnable接口,并重写该接口的run()方法。线程池 jdk1.5以前需要考虑 线程的创建 结束和 结果的获取 等诸多细节不仅如此,使用newThread( )方式定义线程,在时间和 空间效率方面都存在不足。ExcuteServices excutor=Excutors.newCacheThr
2017-09-20 14:32:58
370
原创 在线汇率转换,用json解析数据,支持偏好设置。
默认启动Activity背景是一张图片,启动时后台加载汇率数据,加载成功后进入另一个与用户交互Activity 首先分析JsonParser代码package com.example.zhaorunze.currencies;import android.util.Log;import org.json.JSONException;import org.json.JSONObject;impor
2017-04-21 22:31:36
684
原创 Android的别踩白块开发,使用SurfaceView(二)
private void initView() { mPianoTilesView = (PianoTilesView) findViewById(R.id.pianoTilesView); mCountDownView = (CountDownView) findViewById(R.id.countTextView); mMarkRela = (
2017-04-20 22:14:39
959
1
原创 Android的别踩白块开发,使用SurfaceView(一)。
编写这个程序之前,你需要对SurfaceView有一定的了解。 View是使用UI主线程开发的,如果UI主线程任务过于繁重,那么UI主线程将阻塞。 SurfaceView是直接从内存和DMA等取得数据,而且SurfaceView可以通过主线程之外的线程更新UI。 被动更新:通过点击事件等更新。(VIEW) 主动更新:一直在更新。(Surface) 这是游戏结束时弹出的对话框,为了避免
2017-04-13 17:51:44
2162
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人