- 博客(34)
- 资源 (5)
- 问答 (1)
- 收藏
- 关注
原创 程序员成长路线
程序员职业生涯,要不断的思考和探索,就如同爬山。能力提升的2个好办法,一个是让自己摆脱舒适区,另一个是站在比自己更高的层面去看待问题
2023-03-09 17:22:01
1045
原创 七天从0到1基于vue实现docker管理平台之第2至7天
从本期文章开始,我将带大家从0开始基于前端vue框架实现一个docker管理平台。因为我是后端开发出身,对于前端技术完全是零基础,所以本次边做边学习,完成任务的同时,提高自己的技术能力!在前一篇文章中,我们完成了环境搭建以及登陆等相关功能,在这篇文章中,我们将是实现token的保存、页面的跳转及列表页的展示等工作。首先,我们先封装一个axios文件,定义一个拦截器,对接口的请求及响应进行过滤,如将token设置到header中,并且基于接口响应结果,判断token是否过期等,如果过期,则跳转到登录页面。
2022-07-09 22:19:40
4344
原创 七天从0到1基于vue实现docker管理平台之第1天
从本期文章开始,我将带大家从0开始基于前端vue框架实现一个docker管理平台。因为我是后端开发出身,对于前端技术完全是零基础,所以本次边做边学习,完成任务的同时,提高自己的技术能力!第一天,我们的主要任务是搭建开发环境,并实现登录界面以及完成登录功能,并返回token!搭建环境的过程不再赘述,感兴趣的朋友可以自行网上搜索教程,我们直接上代码,实现登录功能!首先展示下完整的工程结构: main.js核心文件的代码如下:router目录下的index.js文件内容:接着实现登录组件Login.v
2022-07-07 22:26:35
5735
原创 七天从0到1基于vue实现docker管理平台之第0天
从本期文章开始,我将带大家从0开始基于前端vue框架实现一个docker管理平台。因为我是后端开发出身,对于前端技术完全是零基础,所以本次边做边学习,完成任务的同时,提高自己的技术能力!本次任务预计涉及的相关技术栈如下:1、vue、js、element-ui、css、nodejs基础等;2、golang、gin、docker-go-sdk;3、虚拟机及docker环境;4、开发工具包括vscode、idea其中,golang及docker相关能力本身已经掌握,前端相关的技术需要边学习边做。功能模块包括:1、
2022-07-06 22:04:42
7024
原创 Java高级开发/架构技能总结
1、语言基础; 内存模型,垃圾回收,多线程,juc,锁相关; jvm调优,jmap -heap pid, jmap -dump pid等2、框架基础; springboot,mybatis等;3、中间件基础; dubbo,rocketmq,rabbitmq,qz,zk等;4、数据库基础; mysql,redis,es,mongodb等;5、架构设计基础; 微服务设计,分布式协议,设计模式,DDD,性能调优等; 红包雨设计:系统分为管理后台(配置活动及奖...
2022-01-06 10:18:59
22184
原创 Ubuntu20.04基于docker部署springboot项目
整理一下基于Ubuntu20.04版本搭建docker,基于docker安装mysql5.7,并部署springboot项目的过程。一、安装dockerUbuntu 20.04 官方 apt 源中就有 Docker,我们可以直接通过 apt 来安装。执行下述命令:sudo apt updatesudo apt install docker.iodocker --version由于 docker 默认镜像仓库在海外,所以需要配置国内源来加快镜像拉取速度,修改 /etc/doc..
2021-12-10 15:11:51
23287
原创 手把手教你编写脚本批量实现k8s镜像部署
背景日常工作过程中,避免不了经常遇到很多需要手工进行的重复劳动,如果我们可以凭借自己勤劳的双手和聪明的智慧编写一些小工具或者脚本,这样我们就可以节省大量的时间,用来duo'ka
2021-06-03 16:33:55
37300
2
原创 基于Golang实现数据配置中心(meta-config):一
继1年前的系列文章《GO语言实现redis客户端》之后,几乎就没怎么碰过Golang这门语言了,在云原生时代,go语言无疑是无可替代的。近期,我们顺手把go语言重新捡起来,边写边学,手撸一个数据配置中心玩玩。笔者的习惯是,不喜欢在自己文章中赘述别人已经讲的很好的东西了,所以关于什么是数据配置中心?配置中心的作用和意义、以及当下热门的产品等话题,请移步这里(文章讲的很好):https://developer.51cto.com/art/202102/645471.htm直接上代码,先考虑一下初步的设计..
2021-05-21 10:39:58
43844
6
原创 数据安全之MySQL数据加解密的实现方案
在我们日常的业务需求中,经常会遇到需要对存储的用户敏感数据进行加密处理的场景,如用户的身份信息、住址、身份证号等等,本文我们就讨论下,业务系统(后端)如何实现数据存储(基于MySQL)的加解密功能。技术栈:springboot、mybatis、mysql等方案一:基于spring aop拦截mybatis mapper.第一步:定义注解@Encrypt@Target(ElementType.METHOD)//注解的范围是类、接口、枚举的方法上@Retention(RetentionPol
2021-04-25 16:23:24
45841
1
原创 SpringBoot2.1.4整合log4j2保存日志到MySQL中
一、框架版本springboot2.1.4,log4j2(2.11.2),MySQL5.7maven依赖请自行上网百度,本文不再赘述,网上大多是基于log4j2-spring.xml方式配置jdbc appender,本文基于javaconfig方式配置JdbcAppender,并指定logger输出日志到mysql中,直接上代码。二、日志表设计CREATE TABLE `cps_sys_log` ( `ID` bigint(20) unsigned NOT NULL AUTO_I..
2021-03-23 10:15:32
62728
5
原创 activiti6.0表结构梳理
activiti工作流引擎在首次初始化启动时会自动创建引擎所需的28张系统表,下面我们简单罗列一下每张表大概的说明与用处。表总体分为5大类:一、ACT_GE_*通用数据表 act_ge_property 流程引擎相关属性配置表(如版本号、id分发情况等等)。对应代码中的实体类为propertyEntityImpl act_ge_bytearray 流程定义的资源文件信息表(即processes目录下的资源文件)。对应代码中的实体类为ByteArray...
2020-10-22 16:39:00
62442
1
原创 gedis:自己实现go语言的redis客户端 第六节(客户端分片集群实现)
在前5篇文章中我们分享了一个go语言redis客户端的基本实现,包括单机版(1.0)和Cluster版本(2.0),接下来我们分享一下客户端分片(3.0-Sharding)的集群方式的实现。1.0 特性: 基于原生golang开发 连接池管理 keepalive redisTemplate提供多种命令支持2.0 特性 cluster支持 loadbalance支持 ...
2020-09-08 16:49:35
63620
1
原创 浅谈支付业务的分表方案
在互联网相关的业务场景中,为了解决数据存储层面的扩展问题,满足线上的并发性能需求,经常会对数据库(如mysql)进行分库分表操作。常见的分表方案都是基于水平拆分,如基于range分段拆分,或者基于hash取模的方式等等。实际上,分表的规则的设计往往是基于实际业务场景来决定的,此外还要事先对系统的规模进行数据推演等等,如短期内是否会出现爆发式的业务增长,这些都是决定系统架构设计是否成熟的关键因素。下面分享一个实际案例。在电商平台的支付系统中,核心的一个数据模型就是支付快照(也叫支付流水),一个中小型的..
2020-09-02 14:29:53
65417
4
原创 徒手编写服务发现框架系列三:服务消费端实现
上一篇文章主要介绍了服务提供端的大致实现,这一篇我们继续研究服务消费端如何实现。服务提供端启动后,接口已经对外暴露出来了,且提供端已经注册到注册中心里面,那消费端的主要工作就是从配置中心获取提供端的注册信息,然后订阅其提供的接口。消费端配置如下:package com.zxm.rpc.config;import com.zxm.rpc.proxy.ReferenceProxyInvoker;/** * @Author * @Description * @Date Create i
2020-08-20 10:33:25
62348
1
原创 徒手编写服务发现框架系列二:服务提供端实现
在服务发现框架中,服务提供端的作用是为消费端提供接口调用,提供端应该首先启动,依次完成服务注册、接口暴露等等。首先看下提供端的配置信息:/** * @Author zxm * @Description * @Date Create in 下午 4:33 2019/1/22 0022 */public class RegistryConfig { /** * 注册中心host */ private String registryHost; /*
2020-08-14 16:56:54
62121
1
原创 redis错误使用一:存储单key过大的值
前段时间优化线上业务代码时,发现前端一处页面的请求很缓慢,平均时延也在几百ms左右,平且这个接口的数据是缓存在redis中的。结果利用redis客户端工具,连接redis实例,查看这个数据,发现点击后,客户端直接崩溃、卡死了。后来通过命令行查询,发现这个单key返回的数据结果超级大(一般建议小于10kb),有接近700kb!终于定位到原因了。 我们知道,redis早期版本(6.0以前)内部线程模型是基于单线程的,往往业务系统的访问量都很高,为了提升查询速度,才将数据存储在r...
2020-07-31 16:47:52
62618
3
原创 Java对象作为Hashmap的key时不重写hashcode方法引发的灾难
近期看到一篇文章,简单做个复盘(类似的问题,网上总结的文章也有很多,不喜勿喷)。业务场景是需要统计后端应用接口访问量,代码的实现简单描述是基于接口的地址、名称等作为属性,包装成一个对象。类似如下:public class Key { private String url; private String name; public Key(String url, String name){ this.url = url; this.na
2020-07-31 16:01:22
65186
2
原创 Java不同的service间的方法调用,如何保证事务全部回滚
最近在代码重构时,将一些复杂的service层方法,进行抽象,公共部分提取到父类中,但是因此遇到一个问题,就是方法被拆分后(部分逻辑提取到父类中),当发生异常时,整个逻辑中部分数据库操作不会回滚,经过一系列测试及资料查阅,最终才得以解决。举例1:@Servicepublic abstract class BaseService { public void method1(){...
2020-04-29 13:38:08
73469
1
原创 idea gradle build报错‘Could not find method annotationProcessor() for arguments’解决办法
idea开发时,使用gradle构建项目,在build时发生错误‘Could not find method annotationProcessor() for arguments’,主要是因为gradle版本过低导致的,参考stackoverflow 上国外程序员回答说,ThisannotationProcessoris available from Gradle4.6.So what ...
2020-04-14 09:20:05
71075
2
原创 gedis:自己实现go语言的redis客户端 第五节(集群模式的支持)
redis3.0之后提供了新的HA的解决方案,即Cluster模式,由多个节点组成的集群模式。集群master之间基于crc16算法,对key进行校验,得到的值对16384取余,就是key的hash slot(槽)值,每个节点各自存储一部分的hash槽值,主从节点之间基于异步复制方式同步数据。基于redis集群的基本原理,gedis需要提供一下方面的能力:1、统一的客户端Cluster;...
2019-12-06 10:00:21
63903
2
原创 gedis:自己实现go语言的redis客户端 第四节(redis命令的封装实现)
我们在前面的文章中依次实现了通信模块、连接池及协议的处理,本节将对redis的命令进行封装,主要包含一下大类:1、string类2、hash类3、list类4、set类5、sorted_set类6、其它类string_template.gopackage clientimport ( "protocol" "client/handler" "fmt")...
2019-11-27 12:32:51
63441
原创 gedis:自己实现go语言的redis客户端 第三节(redis协议的处理)
redis的通信协议本文不做分析和解读,建议参考redis官方文档或其它博文,我们直接看实现:redis相关命令及常量定义:package protocolconst DOLLARBYTE = "$"const ASTERISKBYTE = "*"const PLUSBYTE = "+"const MINUS_BYTE = "-"const COLON_BYTE = ":"...
2019-11-27 12:27:28
63602
2
原创 gedis:自己实现go语言的redis客户端 第二节(tcp连接池模块实现)
在大多数实际业务场景中,为满足高并发的需求,往往需要提供连接池的支持,包括连接池的管理,连接的创建、销毁等等,还要保证并发安全。实现如下:package clientimport ( "errors" "net" "sync" "protocol")type ConnConfig struct { ConnString string Pwd string...
2019-11-27 11:54:53
63435
原创 gedis:自己实现go语言的redis客户端 第一节(底层通信模块实现)
客户端与redis服务器间通信基于tcp协议,获取tcp连接模块实现如下:package clientimport ( "net" "fmt" "os")/** * tcp连接 */func Connect(server string) *net.TCPConn{ tcpAddr, err := net.ResolveTCPAddr("tcp4", server)...
2019-11-27 11:45:20
63248
原创 gedis:自己实现go语言的redis客户端
刚刚学习go语言,分享下实践过程,一步步实现一个平民版的redis客户端。特性:基于原生golang开发连接池管理keepalive支持redisTemplate提供多种命令支持实验测试:package mainimport ( "tcp" "fmt" "template")func main() { testPool()}func testPo...
2019-09-23 10:10:00
61889
原创 分布式全局唯一ID生成器(支持多种注册中心)的实现
在订单、支付的业务场景中,单号的生成规则与生成方式十分重要,实现有很多种,最简单的是基于mysql自增主键实现,方案优劣不多说,大家都清楚。我们今天实现一种分布式的、可扩展的并且在高并发场景能保证高性能的全局唯一ID生成方案(基于twitter的snowflake原理进行改编和扩展)。不多说直接上代码。package com.zxm.adapter;import org.apache.z...
2019-04-12 15:14:25
64330
1
原创 徒手编写服务发现框架系列一:项目简介
项目地址:https://github.com/zhangxiaomin1993/rpc-server-sdk简介一款集服务发现、rpc通信于一体的框架,通信层基于netty实现,底层原理基于反射、动态代理实现。 纯基于Javaconfig方式配置,无xml。配置中心基于redis。特性传输方式:TCP长连接,NIO异步通信 序列化:json 适用场景:服务间高性能、低延迟调...
2019-01-30 16:41:16
52435
原创 手把手教你:基于netty实现一款聊天软件
文章未完待续项目地址:https://github.com/zhangxiaomin1993/netty-server/blob/master/README.md
2018-09-21 17:57:47
64763
原创 cache2j:持久化机制实现
作为内存缓存框架,持久化能力并非其关键特性,目前cache2j支持的持久化机制是“定时全量快照备份”的形式,类似redis的rdb持久化机制,优点是如果有数据备份的需求,则机器重启后数据恢复的速度较快,且性能较好(相比于AOF形式);缺点是最后一次快照备份可能会发生数据丢失的风险。cache2j持久化机制的实现主要依赖的桥梁就是内部的MessageQueue,其底层实现是基于jdk自带的无界非...
2018-07-31 14:49:28
62105
1
原创 Cache2j:进阶之Stats讲解
Stats用来统计缓存命中情况,包括命中数量hitCount,未命中数量missCount及重新加载的次数reloadCount./** * 缓存统计信息,含命中次数,未命中次数及命中率。 * @author zxm * @since 2018.02.01 */public final class Stats { private AtomicLong hitCount = new...
2018-02-09 10:23:05
62245
1
原创 Cache2j:进阶之Monitor讲解
Monitor在框架内部由一个后台的守护线程实现,基于用户的配置定时执行缓存淘汰任务,定义如下:/** * 缓存淘汰监控器 */public interface Monitor { void processMonitor(); void start(); void stop(); void startIfStop(); boolean isRunnin...
2018-02-09 10:20:09
62096
1
原创 Cache2j:进阶之CacheListener讲解
CacheListener:缓存对象移除的通知器,由用户自己根据业务需求实现,当缓存对象被移除时,会回调其内部的callback方法,将对象的相关信息返回给业务。 /** * 对象缓存的监听器,当缓存被淘汰时,内部会回调监听器的callback方法,返回缓存对象的相关信息 * The listener of the object cache, when the cache is elimin...
2018-02-09 10:15:21
62361
1
原创 Cache2j:进阶之CacheBuilder讲解
CacheBuilder是缓存Cache实例的构造器,通过它可以设置相关属性,并利用build方法生成对象。内部属性:public final class CacheBuilder<K,V>{ private CacheListener listener; private MonitorType type; private Stats stats; l...
2018-02-09 10:11:02
64552
2
原创 Cache2j:一款轻量级的进程内缓存框架的实现
背景最近比较闲,阅读了一些开源项目,受到一些启发,于是萌生了自己开发一款轻量级的缓存框架的想法。目前业界成熟的缓存系统很多,如分布式缓存系统redis、memcache,本地缓存系统如guava cache、oscache、ehcache等,都有自己的适用场景及优缺点,多的不做评论(都是开源产品,自然是十分成熟和优秀的了)!cache2j这个名字是项目开发完成后,作者本人取的,本意是“cache ...
2018-02-08 17:10:33
62217
1
RSA签名验签工具windows_V1.4.rar
2020-09-14
gradle-master.zip
2020-09-14
centos执行jmap、jinfo等命令报错
2020-08-31
TA创建的收藏夹 TA关注的收藏夹
TA关注的人