高并发无锁无IO等待分布式ID生成方案

A)

网络上现在有很多的分布式ID生成算法, 各大厂商也开源了自己的分布式id生成算法. 前段时间项目里有个生成唯一id的需求, 思考了一下, 将flick的id生成方案和Twitter的id生成算法结合到一起, 写了个小算法, 也算是站在巨人的肩膀上做了点小东西, lol

B)

原理大致是这样的, 利用mysql insert来计算出集群中某个节点处于集群中的位置, 算出serverId, 然后利用雪花算法在该id上生成分布式id.

目前的实现是采用long来进行存储的, 因此只能在生成时间维度, 节点数量, 和每毫秒内生成的数量上进行调节, 如果你们可以存储字符串的话, 那么可以拓展一下该算法, 加大时间和空间的容量.

Java入门及书单

入门

今天周六, 在家闲来无事, 多写俩篇博客(本想说成写文章, 但想了想该文实在承担不起文章二字, 便罢) 把最近看到的和想到的记录一下(恰好也把俩三年前写博客的热情又拾了起来).

经常在知乎上看到, 有人发问, 新人如何入门Java, 新人应该读哪些Java相关的书籍, 今天来谈谈这个问题.

Java入门的话, 分析一下哪些行文算是入门

  • 搭建Java开发环境
  • 掌握Java基础语法(原生类型/包装类型, 变量声明, 循环控制, 方法声明/调用, 类定义, 实例化对象…)

私认为掌握上面这俩点就算Java入门了, 也不需要买什么书籍, 在网上找个教程, 或者去慕课网/B站/油管 上面找个教学教程, 利用3-5天的时间学一学就好了, 会用能记住就ok了, 不必深究语法.

上面第二点只是把当下想到的说了一下, 更多的还请参考(Java 教程).

入门之后干什么呢? 找一个自己喜欢的方向, 做个小项目练练手. 例如写一个web项目, 再学习一下下面的几个技术

  • SpringBoot: 用于后台web服务器
  • Mybatis: 替代原生的JDBC, 与mysql打交道的
  • vue/element-ui: 写前台页面的

基本上用上面这三个技术就能写一个后台管理系统出来, 当然我也只是把我熟悉的技术写了一下, 如果你身边有其他技术栈的同学指导, 也可以采用其他的技术栈.

如果前台从0写起来比较费劲, 可以参考一个开源的前端工程vue-element-admin

随着功能的不断完善, 你对技术的理解也会不断的加深, 开发的兴趣也会不断加大. 只有对一件事情有兴趣了, 我们才想把它做好, 不是吗?

通过Java Agent的redefineClasses实现Mock功能

A)

最近组内项目有个模块进行了较大规模的重构, 需要跑一下压力测试, 看一下性能如何. 但是介于产品的模式, 在正常场景下需要向通道发送消息, 然而在压测中, 我们希望这段行为能被mock掉.
当时想到的方案可以采用Spring AOP, JMockit或者自己通过Javasisit/ASM这种字节码框架来实现功能.

由于项目中我自己很少使用Spring AOP来做一些功能, 便没让它当首选方案, 研究了一下JMockit实现, 发现是使用动态Agent实现的.ok, 那么便初步定了一下方案Agent+Javasisit来实现(ASM手写字节码实在太痛苦).

B)

这一段貌似是废话, 你们也看不见代码发生的真实地转变, 我只是记录一下心路历程.

利用了2个小时, 采用Agent+Javasisit实现了一个小的模块, 基本功能也都实现了, 但是使用起来实在是太麻烦了, 代码耦合性太高. 于是又换了个思路, 去掉了Javasisit框架, 也完美地实现了功能.

C)

整个mock框架分为俩部分.

  • agent-core, mock的核心代码
  • agent-client, 在这个工程中, 我们只需要在pom中引入需要替换的工程的依赖, 然后再agent-client中把要替换的类重写一遍就好了

工作/生活中用到的软件/插件/小工具

Chrome

  • Awesome Autocomplete for GitHub
  • Enhanced Github
  • Octotree
  • OneTab
  • Pinbox
  • Tampermonkey

Mac

这部分参考自有哪些命令行的软件堪称神器?

  • bat: cat 替换工具
  • mycli: mysql 客户端
  • ag:比 grep、ack 更快的递归搜索文件内容。
  • jq: json 文件处理以及格式化显示
  • shellcheck:shell 脚本静态检查工具
  • fzf: 命令行下模糊搜索工具
  • mosh: 基于 UDP 的终端连接
  • glances: 更强大的 htop / top 代替者
  • figlet: 将输入字符转换成艺术字体。
  • Pandoc: 可以将 markdown 转成各式各样的格式:PDF、DOCX、EPUB、MOBI
  • asciinema: 终端下的录制分享软件
  • ttygif: 终端录屏工具
  • Teleport: 堡垒机系统
  • prettyping: ping 替代品
  • fzf: 命令行模糊搜索工具
  • ncdu: 查看磁盘目录及文件的使用情况
  • jenv: Java 多版本管理工具
  • nnn: 文件管理器
  • fd: find 替代命令
  • htop: top 优化版本
  • you-get: 非常强大的媒体下载工具
  • httpie:
  • aria2
  • sz/rz
  • ip
  • fcrackzip: 破解 zip 压缩包密码。
  • Rename-CLI: 文件重命名工具
  • fasd: 快速跳转工具
1
2
3
yum install -y bat mycli ag jq fzf mosh glances asciinema ttygif ncdu jenv fd nnn autojump tmux

source /usr/share/autojump/autojump.bash

VSCode

  • Code Runner
  • Markdown Preview Enhanced
  • MySQL Syntax
  • Open in Browser
  • Path Intellisense
  • PEG.js Language
  • Prettier - Code formatter
  • REST Client
  • Settings Sync
  • Terminal

IDEA

列举一下 idea 中常用的插件(仅限于自己要安装的)

  • ASM Bytecode Outline
  • BashSupport
  • Free Mybatis Plugin
  • Grep Console
  • JavaCC Plugin
  • Translation