记录雪花算法ID到前端之后丢失精度
问题描述 12345后端把Long类型的数据传给前端,前端可能会出现精度丢失的情况。例如:201511200001725439这样一个Long类型的整数,传给前端后会变成201511200001725440js中的number类型是16位的,而雪花id是19位 下图可以看出,输入的值超出安全值,可能会被js自动转化 3种jackason解决方式(前端再把String类型的19位数字传回服务端的时候,服务端还是接收long类型即可,这是Spring反序列化参数接收默认支持的行为) 重新注册ObjectMapper的Long类型序列化方式 123456789101112131415161718192021222324@Configurationpublic class LongClassMessageConverter implements InitializingBean { @Resource ObjectMapper objectMapper; private SimpleModule getSimpleModule() { ...
使用SpringBoot创建DockerImage(layers分层的使用)
简介在Spring Boot 2.3以前,我们创建Spring Boot - docker image最通用的办法就是将Spring boot的应用程序打包成一个fat jar,然后写一个Dockerfile,将这个fat jar制作成为一个docker image然后运行。 在Spring Boot 2.3发布后,附带了快速创建docker image的功能 传统做法和它的缺点首先创建一个非常简单的Spring Boot程序: 12345678910111213@SpringBootApplication@RestControllerpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @GetMapping("/getInfo") public String getInfo() { re...
自定义Eslint规则并整合到Sonarqube
背景Eslint Eslint,我们常应用在代码静态扫描中,通过设定的Eslint的语法规则,来对代码进行检查,通过规则来约束代码的风格,以此来提高代码的健壮性,避免因为 代码不规范导致应用出现bug的可能。而规则是自由的,可以设定内部自己团队适用的规则,也可以直接使用开源社区比较热门的规则集合, 比如Airbnb等 Sonarqube Sonarqube是一个用于代码质量管理的开源平台,用于管理源代码的质量 通过插件形式,可以支持包括Java,C#,C/C++,PL/SQL,Cobol,JavaScript,Groovy等等二十几种编程语言的代码质量管理与检测 自定义规则 实际业务中,我们可以把团队的编码规范和最佳实践通过自定义规则落地到实际项目中,在编码阶段对开发者进行提示和约束,然后在Sonarqube进行统一管理,这对于多人协助、代码维护、统一代码风格都会有很大的帮助。 按照Sonarqube官方文档描述,每个语言都有对应的第三方整合插件开发支持 JavaScript中则建议使用Eslint进行整合 参考链接: https://docs.sonarsource.c...
seata的使用
初识Seata以及Seata的架构Seata是 2019 年 1 月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案。致力于提供高性能和简单易用的分布式事务服务,为用户打造一站式的分布式解决方案。 官网地址:http://seata.io/,其中的文档、播客中提供了大量的使用说明、源码分析。 Seata事务管理中三个重要的角色 TC (Transaction Coordinator) - **事务协调者:**维护全局和分支事务的状态,协调全局事务提交或回滚。 TM (Transaction Manager) - **事务管理器:**定义全局事务的范围、开始全局事务、提交或回滚全局事务。 RM (Resource Manager) - **资源管理器:**管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。 整体的架构如图: Seata基于上述架构提供了四种不同的分布式事务解决方案: XA模式:强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入 TCC模式:最终一致的分阶段事务模式,有业务侵入 AT模式:最终一致的分...
nslookup和dig指令
dig和nslookup的安装Ubuntu,Debian: 1# apt install -y dnsutils Fedora / Centos: 1# yum install -y bind-utils nslookup命令详解nslookup命令用于查询DNS的记录,查看域名解析是否正常,在网络故障的时候用来诊断网络问题。 nslookup的用法相对来说还是蛮简单的,主要是下面的几个用法 直接查询查询一个域名的A记录。 1nslookup domain [dns-server] 如果没指定dns-server,用系统默认的dns服务器。 查询其他记录直接查询返回的是A记录,我们可以指定参数,查询其他记录,比如AAAA、MX等。 1234nslookup -qt=type domain [dns-server]nslookup -q=type domain [dns-server]nslookup -type=type domain [dns-server]nslookup -querytype=type domain [dns-server] 注意以上四...
OpenResty快速入门
OpenResty监听请求OpenResty的很多功能都依赖于其目录下的Lua库,需要在nginx.conf中指定依赖库的目录,并导入依赖: 1)添加对OpenResty的Lua模块的加载 修改/usr/local/openresty/nginx/conf/nginx.conf文件,在其中的http下面,添加下面代码: 1234#lua 模块lua_package_path "/usr/local/openresty/lualib/?.lua;;";#c模块 lua_package_cpath "/usr/local/openresty/lualib/?.so;;"; 2)监听/api/item路径 修改/usr/local/openresty/nginx/conf/nginx.conf文件,在nginx.conf的server下面,添加对/api/item这个路径的监听: 123456location /api/item { # 默认的响应类型 defaul...
openresty(lua-API-cosocket,请求转发)
摘自:http://www.daileinote.com/computer/openresty/12 Openresty 提供了强大的 cosocket 功能,它源自 nginx 的 upstream 机制,但又超越了 upstream 机制,结合了 nginx 的事件机制和 Lua 协程特性,以同步非阻塞模式实现 socket 编程,可以高效的与后端服务器通信,而且还支持连接池功能。 ngx.socket.tcp123syntax: tcpsock = ngx.socket.tcp()context: rewrite_by_lua*, access_by_lua*, content_by_lua*, ngx.timer.*, \ ssl_certificate_by_lua*, ssl_session_fetch_by_lua* 创建一个 tcp 的 cosocket 对象,使用完后最好手动关闭或者通过 setkeepalive 存入连接池。如果没有关闭或者存入连接池,那么如下2中情况发生也会关闭。 1.当前请求的 Lua 句柄结束。2.被 Lua GC 垃圾回...
openresty(lua-API-共享内存区域)
摘自:http://www.daileinote.com/computer/openresty/11 通过 lua_shared_dict 指令可以声明一个共享内存区域,可以在多个 worker 进程间共享,单位支持 k、m,然后配合 ngx.shared.DICT api函数来操作。nginx -s reload 后共享内存的数据还在。 这个共享内存功能非常有用,极大的便利了worker 进程间的通信和协作,而且还提供了类似 redis 的数据结构,可以当做一个简易的数据库,而且没有通信开销。 共享内存在 Openresty 里用途很广,基于它可以实现流量统计、缓存、进程锁等高级功能。 12345678910111213141516171819202122232425http { lua_shared_dict dogs 10m; server { location /set { content_by_lua_block { local dogs = ...
openresty(lua-API-基础,常量)
摘自:http://www.daileinote.com/computer/openresty/06 下面介绍的 Lua API 可以在 *_by_lua_block 和 *_by_lua_file 指定的 Lua 代码里调用,这些 API 很好的桥接了 nginx 和 Lua。 ngx.arg12syntax: val = ngx.arg[index]context: body_filter_by_lua* 在响应体过滤时候 ngx.arg[1] 代表响应体内容,ngx.arg[2] 代表该块的标志位。参照 配置指令 body_filter_by_lua_block。 ngx.var.VARIABLE这个指令可以获取 nginx 的变量,注意,在一次请求里 nginx 变量读取的时候会分配一次内存,在请求结束的时候会释放,所以如果需要反复使用该变量的值,可以保存为本地 lua 变量。 未定义的变量返回 nil,定义了未初始化的返回空字符串。 把变量设置为 nil,会清除该变量。 1ngx.var.args = nil 例子 123456789101112location /...
openresty(lua-API-子请求,(内部)重定向)
摘自:http://www.daileinote.com/computer/openresty/07 内部子请求子请求在内部执行,非常高效。子请求会缓冲所有的响应体,如果响应体很大,建议用 cosockets 来操作。 子请求默认情况下会继承所有父请求的请求头。 ngx.location.capture1syntax: res = ngx.location.capture(uri, options?) 基本用法 1res = ngx.location.capture(uri) res是一个表格,包含4个成员 res.status 子请求响应的状态码res.header 表格的形式存放子请求的响应头,如果有同名多个响应头,那么值也为表格,比如假设响应头有3个 Set-Cookie。 123Set-Cookie: a=3Set-Cookie: foo=barSet-Cookie: baz=blah 那么 res.header["Set-Cookie"] 里的值为 1{"a=3", "foo=bar", &qu...
