自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

qqxhb 资源共享

知识共享、提高效率、不断学习、共同进步。

  • 博客(186)
  • 问答 (1)
  • 收藏
  • 关注

原创 GORM GEN 生成代码如何自定义方法和表名

相信你在日常使用gorm gen开发的过程中也有这种场景:通过gen的等方式,从数据库或者sql文件生成了对应的gorm model,已经满足了基本的使用;某些时候希望model上能有一些通用的方法,比如IsEmpty(),判断model是否为空;如果生成之后在修改model,添加自定义方法,下次生成的时候会被覆盖,因此gen提供了WithMethod写一个通用方法的模版这个模版定义了两个方法,你可以把他放到所有需要的model上生成代码指定需要的自定义方法,可以是一个也可以是全部。

2023-04-03 13:18:04 1534 1

原创 零基础上手更安全更友好GORM原作者操刀的GORM GEN

GORM/GEN,持续更新欢迎吐槽Star!!!基于 GORM, 更安全更友好的ORM工具。自动生成CRUD和DIY方法自动根据表结构生成model完全兼容GORM更安全、更友好多种生成代码模式

2021-11-29 09:04:58 7950

原创 如何优雅的解决SQL注入 如何摆脱编写繁琐的gorm model GORM/GEN来了

GORM/GEN是一个 GORM 的增强工具,在 GORM 的基础上只做增强不做改变,为简化开发、提高效率而生。

2021-08-26 17:39:34 3164

原创 JVM内存模型及CMS、G1和ZGC垃圾回收器详解

1. JVM 内存模型JVM 内存模型主要指运行时的数据区,包括 5 个部分,如下图所示。栈也叫方法栈,是线程私有的,线程在执行每个方法时都会同时创建一个栈帧,用来存储局部变量表、操作栈、动态链接、方法出口等信息。调用方法时执行入栈,方法返回时执行出栈。本地方法栈与栈类似,也是用来保存线程执行方法时的信息,不同的是,执行 Java 方法使用栈,而执行 native 方法使用本地方法栈。程序计数器保存着当前线程所执行的字节码位置,每个线程工作时都有一个独立的计数器。程序计数器为执行 Ja

2020-06-28 09:46:21 2532 2

原创 一文彻底理解Dubbo SPI 自适应(Adaptive)拓展原理

有关Dubbo SPI的源码分析请参考前篇博文:一篇短文就能搞定Dubbo SPI 源码及示例,本文介绍SPI自适应扩展相关实例及源码(源码版本:2.7.7)。1. Dubbo SPI 自适应拓展简介在 Dubbo 中,很多拓展都是通过 SPI 机制进行加载的,比如 Protocol、Cluster、LoadBalance 等。有时,有些拓展并不想在框架启动阶段被加载,而是希望在拓展方法被调用...

2020-04-04 23:06:46 6238

原创 轻量级Kubernetes-K3S简介入门

1. K3S简介k3s即轻量级Kubernetes发行版。易于安装,内存减半,所有二进制文件不到40mb。k3s是完全兼容的Kubernetes发行版,有以下更改:移除过时的功能、Alpha功能、非默认功能,这些功能在大多数Kubernetes集群中已不可用。删除内置插件(比如云供应商插件和存储插件),可用外部插件程序替换。添加SQLite3作为默认的数据存储。etcd3仍然可用,但并非...

2020-03-02 16:10:11 5428

原创 RocketMQ重试策略及与Springboot整合

注:基础请参考上一篇文章RocketMQ简介与安装及入门1. 重试策略在消息的发送和消费过程中,都有可能出现错误,如网络异常等,出现了错误就需要进行错误重试,这种消息的重试需要分2种,分别是producer端重试和consumer端重试。1.1 producer端重试生产者端的消息失败,也就是Producer往MQ上发消息没有发送成功,比如网络抖动导致生产者发送消息到MQ失败。impor...

2019-10-11 18:08:11 3884 7

转载 软件工程的完整生命周期

生命周期大体上分为11个步骤,如下图:第一步:概念/创意/需求 产生,这个环节一般是项目发起人完成,也有可能由产品经理或收到反馈后发起,很多时候是会带有这个项目的期望或者说一个愿景,就像这样:所有的软件都是有被需要的地方才会诞生,要么解决用户痛点(如:膜拜单车,滴滴),要么提高工作效率(如:office,vs,idea等),或是节约成本(淘宝,拼多多,自动售货机)等,一定是会产生一定效果...

2019-06-24 11:47:13 3167

原创 Springboot 自定义注解、切面

本文实现的是使用自定义注解作为切入点。1、创建springboot工程,引入依赖本次任务实例主要引入以下两个依赖即可。 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-sta...

2019-06-08 12:16:08 3368 1

原创 springboot+druid+mybatis plus的多数据源配置

注:本文主要介绍基于注解的方式,适合于有一个主库,其他库只使用个别表的情形,我会在文末贴出使用切面方式博客地址。1、创建工程引入依赖使用动态数据源不一样的是需要引入dynamic-datasource-spring-boot-starter包。<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://mave...

2019-06-04 11:01:47 4574 2

原创 Go text/template详解:使用指南与最佳实践

Go text/template 是 Go 语言标准库中的一个模板引擎,用于生成文本输出。它使用类似于 HTML 的模板语言,可以将数据和模板结合起来,生成最终的文本输出。Go text/template 是一个简单易用、安全可靠、高效性能、灵活可扩展的模板引擎,适用于生成各种类型的文本输出。在使用模板时,应该遵循最佳实践,注意模板设计原则、模板性能优化和模板安全性。Tips: 欢迎评论区讨论,你想要的或者你知道的其他用法哦!!!

2023-07-24 10:27:34 1729

原创 【开发神器】一键生成代码,让开发更高效!

GORM GEN 是 GORM 框架提供的一个命令行工具,它可以根据数据库表的结构自动生成对应的 Go 语言结构体,并且自动添加必要的标签和方法,如表名、主键、索引、查询等。但是,总体来说,GORM GEN 是一款非常实用的开发工具,可以让开发更高效,让你的项目更成功!某公司的开发团队在使用 GORM GEN后,开发效率提高了 50%,同时代码的可读性和可维护性也得到了大幅度提升。不仅如此,GORM GEN还可以避免手写大量的重复代码,提高代码的可读性和可维护性,同时也可以减少开发人员的出错率。

2023-06-18 21:45:24 683

原创 常见设计模式的原理、应用场景总结——结构型

结构型设计模式常见设计模式的原理、应用场景总结——创建型结构型模式主要总结了一些类或对象组合在一起的经典结构,这些经典的结构可以解决特定应用场景的问题。结构型模式包括:代理模式、桥接模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式。1.代理模式代理模式在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是控制访问, 而非加强功能,这是它跟装饰器模式最大的不同。一般情况下,我们让代理类和原始类实现同样的接口。但是,如果原始类并没有定义接口,并且原始类代码并不是我们开发维护的。 在这

2021-10-19 09:12:00 651

原创 常见设计模式的原理、应用场景总结——创建型

经典设计模式共分为 3 种类型,分别是创建型、结构型和行为型。今天,我们先看下创建型设计模式的原理、实现、设计意图和应用场景。创建型设计模式创建型设计模式包括:单例模式、工厂模式、建造者模式、原型模式。它主要解决对象的创建问题,封装复杂的创建过程,解耦对象的创建代码和使用代码。1. 单例模式单例模式用来创建全局唯一的对象。一个类只允许创建一个对象(或者叫实例),那这个类就是一个单例类,这种设计模式就叫作单例模式。单例有几种经典的实现方式,它们分别 是:饿汉式、懒汉式、双重检测、静态内部类、枚举。.

2021-10-15 09:13:54 1022

原创 go踩坑记|time.IsZero()使用踩坑分享

背景业务场景中使用到的API或者RPC接口定义都采用的是thrift,因此时间的传递格式是i64类型的秒级时间戳。一般会选择统一逻辑对RPC的请求转换成数据库的model,时间类型的转换则是通过time.Unix(sec,0)方式转换的,时间是可以为0值。 不久前做一个数据发布录入功能,里面有一个发布时间字段,通过上面的方式转换成model的time.Time类型之后,统一判断如果发布时间是0值(t.IsZero())则重新赋值为当前系统时间即time.Now()。问题按照上面方式写好代码测试发现,数

2021-09-13 15:23:27 1550

原创 看!Go如何玩转各种并发任务实战

1. go并发基础回顾package sync/**Package atomic provides low-level atomic memory primitivesuseful for implementing synchronization algorithms.These functions require great care to be used correctly.Except for special, low-level applications, synchronization

2021-03-31 08:53:30 742

原创 go并发编程之条件变量sync.Cond实战和原理

1. sync.Cond实战今天简单聊一聊条件变量(conditional variable)。我们常常会把条件变量这个同步工具拿来与互斥锁一起讨论。实际上,条件变量是基于互斥锁的,它必须有互斥锁的支撑才能发挥作用。条件变量并不是被用来保护临界区和共享资源的,它是用于协调想要访问共享资源的那些线程的。当共享资源的状态发生变化时,它可以被用来通知被互斥锁阻塞的线程。用Go语言的条件变量在这里的最大优势就是在效率方面的提升。当共享资源的状态不满足条件的时候,想操作它的线程再也不用循环往复地做检查了,只要等

2021-03-27 17:47:00 352

原创 浅谈Go 错误异常处理方式和并发陷进

任何一门开发语言中,错误和异常处理都是不可回避的问题,Go 中主要通过 error 和 panic 分别表示错误和异常,并提供了较为简洁的错误异常处理机制。作为一门并发性能优越的语言,Go 虽然降低了协程并发开发的难度,但也存在一些并发陷阱,这就需要我们在开发时额外注意。1. Errors are values错误处理是每个开发人员都需要面对的问题,在大多数的编程语言中比如Java、python,都是通过try-catch 的方式对可能出现错误的代码块进行包装:程序运行 try 中代码,如果 try 中

2021-03-27 15:57:55 528

原创 goroutine及调度器GMP模型

协程是一种用户态轻量级线程,goroutine是go自己实现的协程,GMP则是goroutine的调度器模型。1.什么是协程进程是系统资源分配的最小单位, 进程的创建和销毁都是系统资源级别的,因此是一种比较昂贵的操作,进程是抢占式调度其有三个状态:等待态、就绪态、运行态。进程之间是相互隔离的,它们各自拥有自己的系统资源, 更加安全但是也存在进程间通信不便的问题。线程是CPU调度的最小单位,进程是线程的载体容器,多个线程除了共享进程的资源还拥有自己的一少部分独立的资源,因此相比进程而言更加轻量,进程内的

2021-02-28 10:42:08 270

原创 Go基础之性能分析PProf

1. 简介pprof 是用于可视化和分析性能分析数据的工具。pprof 以 profile.proto 读取分析样本的集合,并生成报告以可视化并帮助分析数据(支持文本和图形报告)。profile.proto 是一个 Protocol Buffer v3 的描述文件,它描述了一组 callstack 和 symbolization 信息, 作用是表示统计分析的一组采样的调用栈,是很常见的 stacktrace 配置文件格式支持什么使用模式Report generation:报告生成Interact

2021-01-02 17:22:02 1437

原创 Go基础之资源管理和错误处理

deferGo语言的 defer 语句会将其后面跟随的语句进行延迟处理,在 defer 归属的函数即将返回时,将延迟处执行defer 逻辑。先被 defer 的语句最后被执行,最后被 defer 的语句,最先被执行。即当有多个 defer 行为被注册时,它们会以逆序执行(类似栈,即后进先出),下面的代码是将一系列的数值打印语句按顺序延迟处理,如下所示:执行顺序package mainimport ( "fmt")func main() { fmt.Println("defe

2021-01-02 16:38:10 181

原创 Go基础之函数式编程(闭包)

函数式编程并非Go语言所特有,Go语言对函数式编程主要是体现在闭包上面。函数式编程 vs 函数指针:函数是一等公民:参数,变量,返回值都可以是函数(c++里只有函数指针,Java里函数只是一个名字);高阶函数:函数的参数可以是一个函数;函数–>闭包。//闭包func adder() func(int) int { sum := 0 return func(v int) int { sum += v return sum }}函数闭包

2021-01-02 15:59:01 113

原创 Go基础之面向接口

1. Duck Typing“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。” 我们并不关心对象是什么类型,到底是不是鸭子,只关心行为。在面向对象的编程语言中,当某个地方(比如某个函数的参数)需要符合某个条件的变量(比如要求这个变量实现了某种方法)时,如果判断这个变量是否“符合条件”的标准是: 这个变量的类型是否实现了这个要求的方法(并不要求显式地声明),那么这种语言的类型系统就可以称为 duck typing。Python 中的duck typingdef.

2021-01-02 15:42:51 175

原创 Go基础之封装Go 结构体及常用命令

Go语言仅支持封装,不支持继承/多态。1. Go 结构体 (struct)结构体就是一个复杂的数据类型,里面可以包含字段,也可以嵌套其他结构体Go 中没有 class,而是使用 struct 。结构体命名一般都是用CamelCase,首字母大写表示public,首字母小写表示private,和go变量定义一样。type TreeNode struct { value int left, rignt *TreeNode}go语言采用的是目录分包,同一个目录下是一个包,在文件开头使用pack

2021-01-02 15:04:21 318

原创 Go基础之Go容器

Go容器go 容器用三种: 数组(Array) 、切片(Slice)、映射(map)1. 数组 Array数组:是一个长度固定,用于存储一段具有相同类型元素的连续块。在 Go 开发中一般不直接使用数组,而是使用切片,数组是定长的,不可扩展,切片相当于动态数组,使用场景多。func opArray() { var arr1 [3]int // [0 0 0] 声明数组,不赋初值(使用默认值) arr2 := [3]int{1, 2, 3} // [1 2 3]// 字面量声明数组,

2021-01-02 13:52:08 241

转载 哈希表存储效率50%的原因

Hash Table 常用于频繁进行 key/value 模式的查找中。(查找模式,如匹配查找)哈希表最大的优点在于查找速度快,但存储时可能发生collision(冲突)。哈希表大多使用open addressing来解决collision,此时search的时间复杂度计算公式为:1/( 1 - n/m )其中,n与m分别表示存储的记录数与哈希表的长度,即装填因子( load factor )故,若哈希表半满,即 n/m >= 1/2,则每次的search次数可能会 >= 2因此,为了

2020-11-24 21:56:49 683 1

原创 Go基础之GO特殊语法

文章目录1. Go简介2. Go的数据类型2.1 布尔型2.2 数字类型2.3 字符串类型:2.4 派生类型:3. Go变量声明2.1 标准格式3.2 批量格式3.3 简短格式3.4 常量4. go循环语句5. go 条件语句1. Go简介Go语言也称为 Golang,是由 Google 公司开发的一种静态强类型、编译型、并发型、并具有垃圾回收功能的编程语言。Go语言(或 Golang)起源于 2007 年,并在 2009 年正式对外发布。Go 是非常年轻的一门语言,它的主要目标是“兼具 Python

2020-11-16 10:50:45 404 2

转载 Kafka offset管理及存储模型

Kafka中的每个partition都由一系列有序的、不可变的消息组成,这些消息被连续的追加到partition中。partition中的每个消息都有一个连续的序号,用于partition唯一标识一条消息。Offset记录着下一条将要发送给Consumer的消息的序号。Offset从语义上来看拥有两种:Current Offset和Committed Offset。Current OffsetCurrent Offset保存在Consumer客户端中,它表示Consumer希望收到的下一条消息的序号

2020-08-14 14:12:35 902

原创 架构核心技术之分布式数据存储

本课时主要包括以下内容:MySQL 复制,有主从复制和主主复制两种;数据分片(或称数据分区),具体为数据分片的原理、分片的方案、分片数据库的扩容;数据库分布式部署的几种方案;NoSQL 中的 CAP 原理,分布式系统的最终一致性及其实现方案。MySQL 数据库复制主从复制MySQL 的主从复制,顾名思义就是将 MySQL 主数据库中的数据复制到从数据库中去。主要目的是实现数据库读写分离——写操作访问主数据库,读操作访问从数据库,从而使数据库具有更强大的访问负载能力,支撑更多的用户访问。如下.

2020-07-08 09:24:30 702

原创 各种类型的常见数据库及MYSQL最佳实践

文章目录1. 常见的数据库1.1 关系型数据库1.2 NoSQL1.3 NewSQL2. 其他数据库知识2.1 数据库中间件2.2 数据库的范式2.3 数据库事务3.Mysql详解3.1 基础知识3.2 调优1. 常见的数据库1.1 关系型数据库常用的关系型数据库主要是 Oracle 和 MySQL。Oracle 功能强大,主要缺点就是贵。MySQL 是互联网行业中最流行的数据库,这不仅仅是因为 MySQL 免费,可以说关系数据库场景中你需要的功能,MySQL 都能很好得满足。后面的详解部分会详细介绍

2020-07-07 09:19:49 403

原创 常见消息队列及kafka架构原理解析

本文提到的队列即消息队列。1. 消息队列应用场景首先来看消息队列的应用场景,也就是队列能解决哪些问题。队列可以对应用进行解耦合,应用之间不用直接调用。可以通过队列来传递消息,完成通信。队列也可以用来执行异步任务,任务提交方无需等待结果。队列的另一个作用是削峰填谷,在突发流量时,可以通过队列做缓冲,不会对后端服务产生较大压力,当峰值过去时,可以逐渐消费堆积的数据,填平流量低谷。消息队列一般还提供了一写多读的能力,可以用来做消息的多播与广播。关于队列还需要知道两个主要的消息协议。JMS

2020-07-02 09:20:10 444

原创 Redis和Memcache缓存核心及原理对比最全解析

1. 缓存基础知识1.1 缓存类型缓存是高并发场景下提高热点数据访问性能的一个有效手段,在开发项目时会经常使用到。缓存的类型分为:本地缓存、分布式缓存和多级缓存。本地缓存就是在进程的内存中进行缓存,比如我们的 JVM 堆中,可以用 LRUMap 来实现,也可以使用 Ehcache 这样的工具来实现。本地缓存是内存访问,没有远程交互开销,性能最好,但是受限于单机容量,一般缓存较小且无法扩展。分布式缓存可以很好得解决这个问题。分布式缓存一般都具有良好的水平扩展能力,对较大数据量的场景也能应付自如。缺点

2020-07-01 09:17:22 393

原创 超详解读服务架构的演进之路及前言容器技术原理

1. 系统架构演进首先以演进的方式来了解不同的系统架构。1.1 单体架构最简单的系统架构是单体服务,如下图所示。一个项目中的多个服务,混合部署在一个进程内,服务之间的交互都是通过进程内调用完成的,正如图中 Service 之间的红色箭头所示。这样做的好处是可以快速开发、部署服务,服务之间调用的性能也最好。当然,这种架构缺点也非常多,比如:随着业务的增长,项目越来越臃肿;服务之间因为 JAR 包引用导致频繁的依赖冲突;服务资源变更困难,因为一个服务可能被多个不同的业务引用,升级资源需要多个业

2020-06-30 09:24:26 246

原创 CentOS 安装Python3.6.5并保留默认2.7

安装依赖包支持SSL传输协议 解压功能 C语言解析XML文档的 安装gdbm数据库 实现自动补全功能 sqlite数据库 gcc编译:yum install libffi-devel openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel gcc下载python可以通过命令下载,也可以直接网站下载再上传到服务器。wget https://www.python.org/ftp/python/3.6.5

2020-06-29 15:51:17 108

原创 ORM框架Mybatis核心知识及与springboot整合缓存失效

1. Mybatis优缺点MyBatis 的优点:MyBatis 是原生SQL,不像 Hibernate 的 HQL 需要额外的学习成本;MyBatis 的 SQL 语句与代码进行了解耦合,这与 Hibernate 是一致的;MyBatis 功能简单,学习成本比较低,使用的门槛也非常低,可以快速上手;MyBatis SQL调优比较灵活,而 Hibernate,SQL 语句是自动生成的,当有复杂语句需要进行优化时就比较难处理。MyBatis 的缺点:相比 Hibernate 这样的全自动 OR.

2020-06-29 09:14:04 167

原创 Netty核心知识点及通过Netty实现的RPC框架对比

1. Netty框架如上图左侧所示,首先了解 Netty 的特点。Netty 是一个高性能的异步事件驱动的 NIO 框架,它对消息的处理采用串行无锁化设计,提供了对 TCP、UDP 和文件传输的支持。Netty 内置了多种 encoder 和 decoder 实现来解决 TCP 粘包问题。Netty 处理消息时使用了池化的缓冲池 ByteBufs,提高性能。结合内存零 copy 机制,减少了对象的创建,降低了 GC 的压力。1.1 主要概念需要掌握 Netty 中的一些对象概念。将 Sock

2020-06-29 09:12:58 554

原创 Spring全家桶及核心知识点梳理全解

1. Spring全家桶Spring Framework,也就是我们常说的 Spring 框架,包括了 IoC 依赖注入,Context 上下文、 Bean 管理、SpringMVC 等众多功能模块,其他 Spring 项目比如 Spring Boot 也会依赖 Spring 框架。Spring Boot 的目标是简化 Spring 应用和服务的创建、开发与部署,简化了配置文件,使用嵌入式 Web 服务器,含有诸多开箱即用的微服务功能,可以和 Spring Cloud 联合部署。Spring Boot

2020-06-29 09:11:08 517

原创 不得不提的开发、协作及调优工具

文章目录1. 常用工具介绍1.1. 团队协作工具1.2. 质量保证工具1.3. 压测工具1.4. 容器与代理工具1.5. 文档管理工具1.6. 网络工具2. 详解 JVM 工具2.1 JMC2.2 BTrace2.3 其他 JVM 工具3. 详解 Git3.1 Git 常用命令3.2 Git 常用工作流4. Linux 工具1. 常用工具介绍1.1. 团队协作工具如上图所示,先看左边的团队协作类工具。Ant+ivy、Maven、Gradle 都是用来构建项目、管理依赖的工具。其中 Ant 通过直接

2020-06-28 11:29:14 241

原创 JUC常用工具类核心分享

JUC 是 Java 提供的用于多线程处理的工具类库,来看其中的常用工具类的作用,如下图所示。如上图所示,第一行的类都是基本数据类型的原子类,包括 AtomicBoolean、AtomicLong、AtomicInteger 类。AtomicLong 通过 unsafe 类实现,基于CAS。unsafe 类是底层工具类,JUC 中很多类的底层都使用到了 unsafe 包中的功能。unsafe 类提供了类似 C 的指针操作,提供 CAS 等功能。unsafe 类中的所有方法都是 native 修饰的。

2020-06-28 10:17:23 399

原创 Kafka入门及实战全解

文章目录1. kafka基础入门1.1. kafka是什么?1.2. kafka基本概念:1.3. kafka优缺点1.4. kafka安装&启动1.5. kafka基本管理操作命令:2. kafka实战2.1. kafka java客户端实战2.2. kafka生产者参数详解2.3. 偏移量与偏移量提交2.4. Rebalance 分区再均衡2.5. 独立消费者:2.6. 消费者参数:2.7. 使用java来操作kafka管理命令1. kafka基础入门1.1. kafka是什么?kafk

2020-06-16 10:07:54 185

空空如也

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

TA关注的人

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