TransmittableThreadLocal简单了解
1、如何解决单线程程序运行中变量共享问题?借助ThreadLocal可以做到,在单线程程序运行的任意地方都可以获取变量,这个对象叫线成的本地变量。
想要了解线成内变量共享的原理,就得看一下线成内部结构:
线程Thread类中维护着ThreadLocalMap对象;
ThreadLocalMap中的Entry继承自WeakReference
Entry的key为被WeakReference包装的ThreadLocal对象
ThreadLocal对象的get\set操作的底层都是处理当前Thread所拥有的ThreadLocalMap对象
网上找了个比较形象的图:
2、多个线程的情况下,为什么InheritableThreadLocal可以解决线程本地变量父传子问题?InheritableThreadLocal继承自ThreadLocal类,特殊性就体现在他的getMap方法:
123ThreadLocalMap getMap(Thread t) { return t.inheritableThreadLocals;}
这里引出了线成对象的inhe ...
创建型设计模式-抽象工厂模式
1、简介1.1、意图提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
1.2、适用性一个系统要独立于它的产品的创建、组合和表示时。
一个系统要由多个产品系列中的一个来配置时。
当你要强调一系列相关的产品对象的设计以便进行联合使用时。
当你提供一个产品类库,而只想显示它们的接口而不是实现时。
1.3、优点可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。当增加一个新的产品族时不需要修改原代码,满足开闭原则。
1.4、缺点当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。
2、类图
3、代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970public interface CarFactory { ClassACar createClassACar(); ClassBCar createC ...
创建型设计模式-工厂模式
1、简介1.1、意图定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。
1.2、适用性当一个类不知道它所必须创建的对象的类的时候。
当一个类希望由它的子类来指定它所创建的对象的时候。
当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
1.3、优点用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;
1.4、缺点每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。
2、类图
3、代码12345678910111213141516171819202122232425262728293031323334353637383940public interface Car { String getBrand();}public class BenzCar implements Car { ...
车辆详情页展示商机列表慢查询优化
1、背景1.1、车辆详情页展示商机列表产生异常。
1.2、慢查询SQL
1.3、SQL执行计划1234567891011SELECT count( 0 ) FROM remind_bill t1 LEFT JOIN remind_bill_ext_service t2 ON t1.pk_id = t2.remind_bill_id WHERE t1.is_deleted = 0 AND t1.group_id = 10546443563683618514 AND t1.remind_type = 0 AND t1.state IN ( 0, 2 ) AND t1.car_id = 10546443563706551334
1.4、接口调用频率高
1.5、接口时序图
2、优化方案2.1、分析
时序图第9步可以看出,查询的mysql,且使用关联查询。
从1.3执行计划可以看到,走到了索引,扫描行数68146。
目前服务提醒主表数据5467597条,加上扩展表,一共5467597*2 = 10,935,194。千万级数据。
目前提醒信息已经接入搜索:customer_ ...
阿里API网关与Dubbo泛化调用
关于阿里API网关介绍参考:阿里API网关文档、API网关在微服务架构中的应用
开源dubbo-proxy:https://github.com/apache/dubbo-proxy
F6 dubbo-proxy 二次开发:https://codeup.aliyun.com/f6car/f6-platform/dubbo-proxy
本文主要梳理一下api网关调用后端dubbo接口流程。
1、API请求生命周期
2、后端服务(dubbo-proxy)
对https://github.com/apache/dubbo-proxy进行二次开发,支持dubbo调用上下文增加:groupId+userId信息
核心:Netty实现http服务器+Dubbo的泛化调用
2.1、Netty实现http服务器2.1.1、NettyServer
参考:org.apache.dubbo.proxy.server.NettyServer📎NettyServer.java
在本地启动服务:localIp:port
重点在:HttpProcessHandler
1234567891011121314 ...
Map.computeIfAbsent方法引出的OOM问题定位
1、问题设置预约内容时出现OOM。
2、分析过程2.1、通过jvisualvm打开堆栈数据:java_pid6.hprof
2.2、点击oom线程链接
可以发现问题处在HashMap的computeIfAbsent方法中
2.3、查看出问题的代码(98行)
可以看到computeIfAbsent方法的第一个入参为:订单id,第二个参数为:ArrayList::new
2.4、查询HashMap源码(1127行)
这里的mappingFunction是new ArrayList(key)
key为:订单id
当订单id过大时,会出现OOM
2.5、复现问题123456public class OomDemo { public static void main(String[] args) { Map<Integer, List<String>> map = Maps.newHashMap(); map.computeIfAbsent(999999999, ArrayList::new ...
Postman批量请求接口基础教程
1、场景
接口性能测试
通过接口线上刷数据
2、准备
接口的请求参数
cookie
postman
3、例子与操作以修改车辆下次服务日为例子介绍:
3.1、接口信息获取
3.1.1、URL1http://yunxiu-test.f6car.org/macan/car/nextService/directUpdate
3.1.2、请求体123456{ "remindRuleId": "14930257152676270156", "carId": "15824664055173357662", "nextServiceTime": "2022-04-29", "pkId": "15824664630174687292"}
3.1.3、cookie1macanSESSIONID=ce9f5846-af6d-431f-b317-66e5b5a93dfb; gr_user_id=aadc3 ...
微信开放平台能力建设
1、业务背景修理厂购买了SAAS系统,希望能和自己微信私域流量打通,在SAAS系统中管理自己的微信客户,给车主微信发送消息通知,因此需要我们来代修理厂开发自己的公众号和小程序。
在最初的版本,我们需要修理厂提供公众平台的开发者AppId和Secret,通过自主开发的方式,由我们代为开发实现响应功能。但是此种方式有以下一些弊端:
AppId和Secret可以提供给多个开发者使用,不安全
Secret被修改后,作为开发者无法主动知晓,导致获取accessToken失败
accessToken有时效性,需要开发者主动刷新,开发者之间无法知晓accessToken是否是最新的,导致token失效。
accessToken每天获取有次数限制,多个开发者频繁刷新容易超出限制,导致功能不可用
如果需要代很多修理厂开发公众号和小程序,AppId和Secret难以维护。同时需要耗费区域大量的人力来帮助客户配置相关信息
基于以上几个问题,我们引入的微信第三方平台。
2、微信第三方平台微信开放平台-第三方平台(简称第三方平台)开放给所有通过开发者资质认证的开发者使用。在得到公众号或小程序运营者(简称运营 ...
为什么arthas需要优先执行sc命令
问题
为什么arthas在attach springboot的业务class时候 需要优先执行sc命令?
classloader的hash值是用来干啥的?
1、核心知识点
一个类可以被多个类加载器所加载。
tomcat破坏了双亲委派机制。
springboot 的fatja技术。
2、个人答案2.1、为什么arthas在attach springboot的业务class时候 需要优先执行sc命令
2.2、classloader的hash值是用来干啥的?一个类在springboot工程中,可能会出现被多个类加载器加载的情景,不同类加载器加载的类对应的命名空间不同,相当于不同的类。所以在arthas使用类的时候需要指定类加载器的hash值,用于确定命名空间。
3、参考文档关于class.getClassLoader().getResourceAsStream()和class.getResourceAsStream()的用法
我真不信,这年头还有人能懂SpringBoot的ClassLoader加载机制
03-Arthas中class或classloader相关命令
[JVM监控及诊断工 ...
对接ElasticSearch注意事项
1、分词尽量不用Ngram,但是如果要查询更准确,还是需要用Ngram,但是需要控制每个需要分词的长度大小,比如手机号11位,车牌号8位等限制。
2、索引实时性要求是啥?是有几秒的延迟,能接受几秒。
3、最多支持查看多少页以后的数据?会对系统有较大压力,例如每页100,查第10000页,那就要处理100万的数据,这个是一个搜索系统,不是导出,所以也不是很有必要跳转到很大的页数。
4、客户姓名要求拼音模糊搜吗?5、查询数量时注意
url后要加track_total_hits=true不然超过1万,数量只给10000
只要count的话,可以限制size=0不反回结果https://blog.csdn.net/weixin_41804049/article/details/107177508
rest_total_hits_as_int=true
https://blog.csdn.net/daofengsuoxiang/article/details/104776085
6、kafka申请使用test环境只需满足命名规范,推送消息后,topi ...