自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(37)
  • 资源 (2)
  • 收藏
  • 关注

原创 一种JSON多态表示法

假设现在需要实现一种功能: 从某个远程的组件(消息队列或远程文件)拉取最后几条记录做一个展示.需要支持如下的组件:KafkaRocketMQOSS假设还有很多, 这里不列了 …显然,, 那么此时如何使用一个统一的结构来表达这些组件的参数呢?刚遇到这个这个需求时, 感觉它和 Java 里常遇到的 多态JSON 序列化很像(确实).但在实践中, 我们这份配置需要被多种编程语言的程序使用, 我们需要考虑各个语言解析多态JSON的难度.

2024-08-10 14:41:00 429

原创 通过命令运行 maven 多模块项目

介绍 Maven如何通过 mvn 命令行直接运行 main 方法.使用 IDE 开发时, 我们都会直接运行 main 方法, IDE 会负责编译依赖模块和 main 方法所在的模块, 最后运行.把代码拷贝上去有很多办法, 不在本文讨论范围了, 这里简单介绍一下因为讨论的是一个多模块项目, 因此网上常见的命令无法正常工作, 它能很好的用于单模块应用, 但不能很好用于多模块项目.在实践中, 我肯定会尽可能优先使用这种方式!repackage下面, 我展开介绍基于的办法.

2024-08-02 02:35:12 432

原创 高并发下的 AtomicReference 性能陷阱

我本以为 AtomicReference 也有着类似的性能,结果发现在 16C32G 机器上 16 个线程并发执行 AtomicReference 的 compareAndSet() 操作只有 200多万的ops. 调用 CAS 时一般会搭配自旋,此时 16 个核全部打满也才 200 多万ops。各大网站搜了一下没有讲 AtomicReference 性能的。一般情况下 AtomicInteger、AtomicLong 的性能随着线程的增多而急速下降,高并发下甚至不如加锁的版本。大概是类似下面的场景。

2024-02-28 22:01:03 474

原创 网络隔离场景下访问 Pod 网络

考虑一个监控系统,它的数据采集 Agent 是以 daemonset 形式运行在物理机上的,它需要采集 Pod 的各种监控信息。现在很流行的一个监控信息是通过 Prometheus 提供指标信息。一般来说,daemonset Agent 会使用物理机网络(就算有自己的网络也没关系),它需要通过 ICMP、TCP、HTTP 等协议访问目标 Pod。这在一般的 k8s 场景下是没问题的,因为此时 daemonset Agent 与 目标 Pod 之间的网络是通的,没有隔离。

2024-01-30 23:08:42 1030

原创 记CMS FGC 的一次调优

我们希望能尽可能减少 FGC 发生频率,系统偶尔 STW < 5 秒都能接受。

2024-01-09 23:28:11 1052

原创 VPC网络架构下的网络上数据采集

突破VPC的网络隔离,实现系统内部各个组件的点对点访问。

2024-01-05 21:25:48 1072

原创 加速Maven构建

加速Maven构建

2023-04-06 14:09:41 372

原创 ArrayList批量移除元素

ArrayList<...> list = ...;// 批量移除list位置 [3, 6)list.subList(3,6).clear();// 批量移除list中满足某条件的元素list.removeIf(...);批量的意义在于相比自己写for循环, 它的效率更高是O(n), 而我们自己写for循环如果没留意最坏情况下会降级成O(n^2)....

2021-04-27 11:18:16 1135

原创 并发编程中的WIP技巧

介绍遇到如下场景:对于某个方法, 调用它时如果有另外一个线程正在调用该方法, 那么当前线程放弃调用, 但另外一个线程调用完毕之后必须再调用一次该方法.比如, 多个线程更新一个数据结构(这个行为是否并发安全不在本次讨论中), 然后一旦结构发生修改就将数据同步到DB. 显然同步到DB是一个相对高耗时的行为, 而且短期对数据结构的更新显然可以压缩成一次DB的更新. 这也就是我上述说的场景了.wip技巧wip = Working-In-Progress这种模式我也不知道该怎么称呼, 但我在很多地方都有

2021-02-19 15:11:48 437

原创 ClassValue

与ThreadLocal类似, ClassValue的作用可以说是ClassLocal.如果你有一些缓存是以Class<?>为key, 那么可以考虑用ClassValue代替. 对于动态生成的类, 不会导致其无法被回收.

2021-02-04 13:46:31 506

原创 Maven部署到指定仓库

mvn clean deploy -DskipTests -DaltDeploymentRepository=server_id::default::仓库地址server_id: 会用于在 settings.xml 寻找server, 其账号密码用于鉴权. default: 是layout, 现在固定都是default 仓库地址:

2020-10-23 12:36:12 997

原创 GRPC的context级联关闭导致请求被cancel

背景线上遇到奇怪的GRPC请求失败, 看日志提示 context is cancelled. 而且报错时间与请求发出的时间很接近, 根本还没达到超时时间.我们有如下场景ServiceA -异步-> ServiceB -异步-> ServiceC服务A调用服务B, B收到请求之后又会去请求服务C.B返回给A的结果并不依赖B请求C的结果, 因此B会尽快返回给A.分析一旦B返回, B与A之间的context就被cancel, 而B与C的context是继承于前者..

2020-10-12 16:19:25 3696 2

原创 DrainLoop编程技巧

介绍最近项目里频繁涉及到并发编程, 由于我们的系统不需要强一致性, 我选择使用各种并发集合来避免锁. 项目里还大量使用了MPSC的队列(基于JCTools)和Disruptor. 另外还涉及到一些异步编程, 这里使用了Reactor来简化异步流程.之前看过Reactor/RxJava2的一些源码, 在源码里发现了一个很好用的小技巧, 我也不知道叫什么名称, 但看方法名一般是叫"drainLoop", 我就称这种技巧为DrainLoop吧.drainLoop的使用场景是这样的:在一个MPSC(

2020-06-16 20:52:03 299 1

原创 Java线程池的关闭, shutdown和shutdownNow的区别

Java线程池shutdown和shutdownNow的区别结论先说结论shutdown 标记关闭 + 会执行积压任务(因线程不足而放入queue里的) + 不打断正在执行的任务, 之后不允许添加新任务 shutdownNow = 标记关闭+ 不执行积压任务 + 打断(通过线程interrupt)正在执行的任务, 之后不允许添加新任务 对于停不下来的任务只能等到任务结束, 此过程 isTerminating 返回 true, 可以使用 awaitTemination 阻塞地等到真正关闭 .

2020-06-08 11:36:14 471

原创 线程安全的一些建议

介绍我比较认同的线程安全的定义: "一段代码, 被多线程访问, 多线程之间不需要任何显式的协同, 并且运行结果是正确的, 那么这段代码就是线程安全的".线程安全的程度Immutable: 不可变 Thread-safe: 单线程下行为正确, 多线程下行为也正确, 要求很高 Conditionally thread-safe: 有条件的线程安全 Thread-Compitable: 线程兼容, 本来非多线程安全, 但可以通过显示的外部同步来获得安全 Thread-hostile: 线.

2020-06-02 15:48:08 161

原创 Java 高效数组复制

介绍实践中经常需要复制数组的一段连续内容, 比如给一个数组追加一个元素形成一个新数组. 那么怎样做才是较快的呢?测试方法1: 自己new数组, 然后for循环复制方法2: 使用 Arrays.copyOf, 或 System.arraycopy. 本质前者是基于后者的, 两者性能相当, 前者多了2次native调用获取数组元素类型和创建数组.@Warmup(iterations = 2, time = 3)@Measurement(iterations = 3, time = 3)

2020-06-01 15:54:11 719

原创 byte-buddy

介绍先占个坑.因工作需要, 调研了byte-buddy, 并尝试用它实现了各种功能, 都记录下来吧…

2020-04-06 23:24:26 374

原创 Java 的日志门面与实现

Java 的日志门面与实现

2020-04-03 01:52:43 169 1

原创 Reactor的parallel不支持工作窃取

使用Rx系列框架也有2年多了,真的感觉它在项目就像是万金油, 哈哈.项目里经常有并发请求外部系统(然后合并结果,这个今天先不考虑)的情况.这里给出一个场景:需要调用N次外部系统,调用无返回值,只需要确保调用结束即可,可以不处理异常情况,但需要确保全部调用都完成程序才能继续执行下去.如果自己去写代码实现这里就不说了,大概就是:拿到一个线程池,提交多个任务,根据情况b...

2020-02-27 15:13:25 359

原创 Guava - EventBus

EventBus介绍EventBus是Guava包里的一个辅助类, 用于实现消息总线模式.生产事件的叫做Provider, 消费事件的叫做Subscriber, 他们之间通过事件类型产生关联.The EventBus guarantees that it will not call a subscriber method from multiple threads simul...

2020-02-25 12:02:03 180

原创 String.split的坑

介绍某一天使用Spring.split方法对字符串进行拆分, 发现拆分后的数量似乎不太对劲...String.splitsplit方法有2个重载版本:split(String) 相当于 split(String, -1) split(String, max): 按给定的分隔符进行分割, 如果max>0则最多分出max个结果其实这都不是关键.看了split的...

2020-02-03 18:55:54 268

原创 go http处理post请求

http.HandleFunc("/post", func(writer http.ResponseWriter, request *http.Request) { if request.Method != "POST" { writer.WriteHeader(405) return } // 解析form err := reque...

2019-08-05 11:42:10 8044

原创 JWT

介绍本质是将一些信息编码在字符串里, 通过某些算法来编码数据, 加密来保证安全, 通过加签来防止篡改.

2019-08-02 16:08:27 84

原创 Cookie的过期与删除

介绍Cookie的过期与删除本质是一回事. 当服务端想让客户端删除一个cookie时, 它会给客户端颁发一个同名cookie(此时一般会将value设置成空白字符串), 只是这个cookie的存活时间已经过期(通过设置Expires或Max-Age).Cookie有两个属性可以用于控制存活时长: Expires 和 Max-Age. Expires指定一个时间点, 超过这个时间点之后客户端Co...

2019-08-02 16:03:02 6362

原创 关于线程安全的考虑

结论结合当前框架的线程模型不可变对象/无状态化原子操作线程本地锁

2019-07-23 09:15:51 92

原创 Atomic Updater vs. Atomic Wrapper

介绍参考资料https://javamex.com/tutorials/synchronization_concurrency_7_atomic_updaters.shtml

2019-07-23 09:03:15 116

原创 docker exec 进入停止的容器

遇到一个情况, 容器里的应用启动抛异常, 导致容器很快就结束了. 想到容器里看看发生了什么事(通过简单的 docker logs 可能无法解决问题).如果一个容器已经stop, 那么你是无法docker exec进去的.会提示Error response from daemon: Container 837ffa1d4...is not running下面是一种方案:...

2018-08-13 20:58:44 20615

原创 CPU分支预测对Java程序的影响

回忆课上教的, 和几篇博文https://blog.csdn.net/rrrfff/article/details/44993467?ticket=ST-106021-6fOewnguwhi3rUrgYAUb-passport.csdn.net都提到了分支预测正确时可以给程序带来一定的性能提升, 为此利用JMH写了个简单的测试例子, 但并没有得到想要的结论:@BenchmarkMode(Mode....

2018-05-24 23:40:53 345

原创 rinetd - Linux下的端口转发工具

在一台内网windows2003主机上操作着, 突然因为发包数过多, 而导致这台服务器的外网访问被断掉. 根据以前的经验, 此时内网照样可以访问, 但其他内网服务器都是Linux, 此时需要在Linux下进行端口转发. 感觉iptables应该是可以实现的? 但一时半会弄不会了...上网一搜, 发现有个小工具叫做 rinetd 可以解决这个问题apt install rinetdvim /et...

2018-04-30 13:44:32 435

原创 portainer - docker可视化工具

在docker宿主机上执行docker run -d -p 9000:9000 --restart always -v /var/run/docker.sock:/var/run/docker.sock -v /opt/portainer:/data portainer/portainer访问9000端口 -&gt; 创建初始账号 -&gt; 选择管理Local机器, 然后就可以进入到后台了大部分...

2018-04-30 12:18:14 916

原创 在腾讯云Ubuntu16.04上配置docker的镜像加速

安装docker本身的步骤和官网文档描述的一致, 见 https://docs.docker.com/install/linux/docker-ce/ubuntu/, 麻烦的是下载速度稍慢.稍等一会, 安装完毕之后, 用 docker run hello-world 进行验证, 发现下载镜像的速度还是有点慢, 之前用的是daocloud提供的加速器, 但腾讯云自己也提供了mirror服务(总不会比...

2018-04-30 12:11:13 1440

原创 windows7下添加 在当前目录打开Cygwin

windows7下添加 在当前目录打开Cygwin

2016-03-11 13:53:36 1231

原创 LinearHorizontalRecyclerView

最近在学习安卓,找点应用模仿一下界面LinearHorizontalRecyclerView只是RecyclerView + LinearLayout + Horizontal而已想要达到的效果是这样的先上图:大家先看番剧更新这一区域,它是由一个RecyclerView + 水平线性管理器 组成的现在我们向左滑一点点 假设滑动距离是10  此时手不要放开

2015-09-27 12:10:09 444

原创 Android的复合RecyclerView

很多时候我们想要把一个RecyclerView(或ListView等)融入到一个ScrollView里.具体情况是这样的:一个页面可能由一些不属于ListView的item的view和一个ListView组成,而我们想要总体都有一个滑动的效果对于ListView 解决方案可能是 将其他的View元素 作为ListView的HeaderView或FooterView 这是可以解决问题的

2015-09-27 11:53:22 2011

原创 struts2 json插件

返回json表达式方法1在action方法中使用response的api假设在execute方法里        HttpServletResponse res = ServletActionContext.getResponse();         res.setContentType("text/html;charset=utf-8" );       

2014-07-25 11:38:18 369

原创 google gson简单使用案例

到官网下载完之后解压缩要的只有一个gson-2.2.4.jar 大小

2014-07-24 17:47:25 714

原创 struts2上传与下载

上传在Action里private File abcFile;private String abcFileName;//这两个参数是可选的private String abcContentType;//这两个参数是可选的生成set方法

2014-07-22 18:58:35 356

全国信息学奥林匹克联赛NOIP2010复赛

全国信息学奥林匹克联赛NOIP2010复赛

2011-08-02

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除