- 博客(78)
- 资源 (3)
- 收藏
- 关注
原创 Go之开源工具包那些事
1. 高性能进程内缓存freeCache深入理解Freecache_czlshadow的博客-CSDN博客_freecacheFreecache源码分析简介freecache项目版本freecache架构设计简介freecache是Golang版的本地缓存库,从github项目介绍看,该框架相比与Golang的Map,具有一下的优势:能存储数亿条记录(entry) 。零GC开销。高并发线程安全访问。纯Golang代码实现。支持记录(entry)过期。接近LRU的替换算法。严格限制内存的使用。提供一个测.
2021-11-30 17:29:47 384
原创 Go 初始化那些事(init,sync.Once)
背景: 近期在开发项目的时候,发现有的需求需要进行初始化,但是初始化的时刻不同,简单讲就是文本加载自动初始化,那就是最常见的init方式,同时Go还提供了一个新的方式,那就是sync包提供的方式:sync.Once ,最终的效果都是只执行一次。方法名 相同点 不同点 init() 最终执行次数都是一次 加载到指定文件的时候会自动的执行该文件的init方法 sync.Once \ 执行该方法的时候才会触发执行一次,其他时刻调用不会执行。同时自...
2021-11-26 16:20:43 982
原创 GO之面向对象编程注意事项是否引用类型做参数
背景: 面向对象编程时当前开发的设计思想,虽然Go语言并不是面向对象编程语言,但是可以通过编程设计实现面向对象的编程效果。下面不是讲解如何设计出面向对象编程,而是去说明一下,如何选择使用指针类型还是普通数据类型进行函数实现,了解本质去选择。1. 采用的是普通数据类型:type User struct { Name string Age int}type A interface { Hello()}// 采用的是普通数据类型func (n User) Hell...
2021-09-18 14:47:12 312
原创 Go之设计模式开发
背景: 设计模式是软件设计的基础,那么在不同的开发语言中会有不同的方式进行设计,下面就是采用Go讲解几个基本的设计模式的设计方案:一. 单例模式单例是一种创建型设计模式,让你能够保证一个类只有一个实例,并提供一个访问该实例的全局节点。// 单例模式var once sync.Once //一种安全的初始化机制,保证并发的情况下只有一个去执行。type single struct { // 实体对象结构}var singleInstance ...
2021-09-02 10:07:41 196
原创 Go语言闭包的设计
背景: 之前开发一直没有注意到闭包的开发使用,今天无意间发现闭包的魅力。下面就以一个简单的示例做一个分析。闭包:1、函数里面包含的子函数,子函数访问父函数的局部变量,也就是子函数与局部变量形成了一个整体。2、通过return将子函数暴露在全局作用域,子函数就形成闭包3、通过闭包,父函数的局部变量没有被销毁,可通过闭包去调用return 之前的逻辑代码只能执行一次,可以理解为初始化1次,同时这个局部变量也不会被全局变量污染。示例:package mainimport ...
2021-08-25 14:17:28 118
原创 Go语言协程池(ants)的使用 , 连接池的创建使用
背景: 在开发项目之前之所以使用go语言是因为Go天生支持高并发,只需要go func()就可以实现一个用户态的协程,占用的资源非常小仅仅2k左右(并且支持动态扩容),而正常采用java,c++等语言启用的线程一般都是内核态的占用的内存资源一般在4m左右,而假设我们的服务器CPU内存为4G,那么很明显才用的内核态线程的并发总数量也就是1024个,相反查看一下Go语言的协程则可以达到4*1024*1024/2=200w.这么一看就明白了为什么Go语言天生支持高并发;这样一看我们发现根本不需要考...
2021-08-24 15:37:34 4858 4
原创 GO之反射和类型断言判断变量类型性能分析
背景: 最近刚好有需求对interface的变量类型进行类型判断,然后断言获取指定的变量类型值,那么首先就是要获取变量的类型,所以通过相关知识了解到,go语言获取interface的类型有两种方式:反射,类型断言。所以下面就针对这两种方式进行分析相关性能:1. 反射:// 测试的变量类型type U struct { name string age int}func Benchmark1(t *testing.B) { var u interface{}...
2021-07-24 21:42:31 929
原创 不区分语言开发工具(缓存的设计探讨,ps查看进程内存,cpu,堆栈内存资源那些事,HTTP和WebSocket,TCP那些事,GraphQL的简介,prometheus+grafana(通用做法))
1. 缓存的设计探讨(很有启发的博客)https://blog.csdn.net/weixin_34124651/article/details/88768849
2021-07-07 14:08:23 102
原创 Go项目中调用C库函数
背景: 在很多场景下,在Go的程序中需要调用c函数或者是用c编写的库(底层驱动,算法等,不想用Go语言再去造一遍轮子,复用现有的c库)。我们在使用Golang开发项目或系统的时候难免会遇到Go和C语言混合编程,这时很多人都会选择使用cgo。然后近期有项目需要在Go项目中调用设备模块同事写的C库函数,所以经过查询资料进行一下总结。1. 环境的依赖安装:https://blog.csdn.net/u012278016/article/details/1011014862. 实例...
2021-07-01 10:27:03 1331
原创 Go之工具3(数组追加,go版本的升级,go限流设计)
1. Go的数组追加:根据需求存在两种的追加方式:A :采用的是单个元素的追加,这个也是比较常见的需求:
2021-06-15 13:53:37 851
原创 Go之Json的转换(json官方包和jsoniter)
背景: 由于项目中大量使用Json的转换工作,但是发现官方包在大量的转换过程中效率是很低的,下面以实际情况进行验证:1. json官方包type NumberRange struct { Min int `json:"min"` Max int `json:"max"`}func Benchmark1Pro1(b *testing.B) { s := "{\n \"deviceDataType\":\"int\",\n \"body\":{\n ...
2021-05-20 10:14:04 1256
原创 SpringBoot之对外Health心跳校验接口
背景: 当前因为业务需求,对外需要暴露一个Health接口,用于检测当前的服务是否挂掉,然后通知相关项目负责人员,进行及时的补救,但是因为只是暴露了一个接口,没有相关的安全校验,存在安全漏洞,为了防止不能让任何人都可以成功访问该接口,就需要进行相关的处理,这里采用的是一个比较成熟的wxpay的依赖包校验函数。具体如下:1. Maven依赖 <dependency> <groupId>com.github.w...
2021-03-20 15:14:51 3354 2
原创 Java工具集2(在线获取Maven库,AES加解密,线程池的使用,零拷贝,JVM调优,git拉取项目无法启动,SpringBoot环境配置)
1. Maven库的使用: 1)在开发中,如果遇到一个非Java的JDK系统库,而且我们使用的使用Spring的方式进行开发,那么我们就需要Maven的相关信息了;当然第一步是配置Maven,一般公司都有自己的Maven库,所以要使用公司提供的Maven配置文件,然后就是在IDEA中进行配置一下相关的设置,如下: 2)以上配置完成后,我们就可以愉快的进行Maven的使用了,例如我们要使用json工具包:通过百度了解到 fastjson是最快的转Json工具,但是他的依赖包...
2021-03-02 16:31:27 431
原创 SpringBoot之Slf4j日志实现根据业务不同将日志写进不同的文件
背景: 最近遇到一个工作业务需求:简单地将就是一个服务里面包含HTTP的入口服务,还包含TCP入口服务,这个时候正常情况下,我们使用@Slf4j的日志方式,会自动的将所有的日志写进一个文件,因为@Slf4j默认是按照系统日志进行写入,这个时候就增加了我们后期的排查工作,因为如果出问题,或者有需求将所有的TCP入口的日志全部拉取出来这个时候,就会很麻烦,根据这个需求,我们采用Slf4可自定义的特性进行相关的配置,具体的配置使用如下:1. 首先就是要写一个logback.xml...
2021-02-25 11:03:06 4588 1
原创 Go工具集-2(定时任务,TCP客户端,RPC基本实现,PProf 调优工具,map转Struct,以及Json转Struct工具包,二进制的位处理)
1.golang 定时任务time.Sleep和time.Tick实现结果比较https://blog.csdn.net/zkt286468541/article/details/894033062. GoLand开发一个性能不错的TCP客户端https://blog.csdn.net/niyuelin1990/article/details/77868574
2021-02-24 16:18:58 218
原创 不区分语言开发工具2(Mysql表名大小写那些事,检测IP是否可用,MongoDB的安装,阿里云OSS,手机短信验证码,Goole插件下载,mysql联合索引,查看Docker中项目日志)
1. Mysql表名大小写那些事: 由于最近在做项目的时候开发环境是Windows,但是后面部署的环境是Linux,之前开发后执行的服务一点没有问题,但是部署后发现,sql语句报错:具体就是表名找不到,最后发现是Mysql自带的大小写表名敏感问题,在Windows环境下默认是大小写不区分:但是Linux环境下默认是区分大小写的,所以这个就会造成表查找不到的问题。具体查看是否敏感的方式:具体的分析:lower_case_table_names = 0表示大小写敏感,可...
2021-02-06 16:49:46 122
原创 Java的Redis如何选择
背景:(使用Jedis和RedisTemplate如何选择) SpringBoot自带redis处理方式,那就是RedisTemplate,可以快速上手,只需要简单的配置和注解就可以了,但是它的底层原理使用的还是JedisAPI,并且Jedis是Redis官方提供的工具,在性能上面‘Jedis比RedisTemplate要快很多,但是如果项目中是Cache和Redis一起使用的话,那就是建议直接使用SpringBoot自带的RedisTemplate方式,因为这种方式在Spring...
2021-01-28 09:22:49 109
原创 SpringBoot设计对象池的那些事commons-pool2工具(注意事项)
背景: 现在开发过程中需要一个需求,那就是使用SpringBoot采用的是原生的单例模式进行设计,哪个类需要复用就直接将其注解注入容器,下次使用的时候直接进行@Autowired注入就可以了,很是方便。但是这种单例模式并不是适合所有的场景,如果该类涉及到全局变量或者其他的可能调用修改一个地方而影响其他地方使用的时候,就非常的不安全,还有就是如果要保持tcp多个连接提高性能的话也是需要进行优化的,下面我们就针对这个问题,可以采用对象池的方式进行优化,也就是我们的处理连接可以有多个连接同...
2021-01-22 11:47:33 1569
原创 Go-核心设计-sync.map实现并发安全使用、类型断言的应用
1.系统自带map和sync.Map的由来 map的使用在GO语言中非常的实用,但是系统自带的map直接使用,如果不涉及到并发读写业务,性能很强大,但是一旦出现并发读写的时候,就不建议使用,除非自己手动的进行加锁控制,不过性能不高,所以go推出了sync.map可以解决这种并发读写的问题。具体的使用:方式很简单: var sm sync.Map //存储Map sm.Store(u.age, u) // 获取数据...
2021-01-08 15:22:30 567
原创 Go-核心设计-写接口传输的参数实体类型和指针类型/ Switch(fallthrough)的那些事
1. Go写接口传输的参数实体类型和指针类型、(1)传输实体类型(结论:传输的是一种变量,是一种赋值拷贝,接口内修改实体本身,外部调用的时候是不会修改,还是初始化的值)type U struct { name string age int}func (u U)Hello(){ u.name="Tom2"}测试:func Test1(test *testing.T) { u:=U{ name: "Tom", age: 20, } u.Hello() fm..
2021-01-08 10:23:34 257
原创 Java工具集1(深浅拷贝,抽象类和接口,常量创建,ResponseEntity,回调实现线程数据传输,SpringBoot配置文件,线程池,同步队列,netty,ConcurrentHashMap)
1.深浅拷贝问题:在开发中遇到一个问题就是关于拷贝的,通过学习,发现,拷贝分为深浅两种类型(主要是针对引用类型),具体的学习网址如下所示:深浅拷贝只是针对Array与Object这样的引用数据类型。简单来说,浅拷贝只是拷贝了它在栈中存储的指针,它们指向的都是同一个堆内存地址,所以浅拷贝在某些情况会造成改变数据后导致别的另一份数据也同步被改变的情况;而深拷贝是直接将堆内存中存储的数据直接复制一份,不会有浅拷贝互相影响的问题。Object.assign() 实现的是浅拷贝。拷贝对象中的属性如果...
2020-12-10 09:51:11 220
原创 Go之按照模板实现文件的创建和更新实例(一般用于自动化代码实现)
背景: 近期学习了一下Go-Admin开源项目,里面的亮点就是可以自动配置化实现数据库的增删改查工作,然后自己看了一下源码其实实现原理很简单,就是采用IO流实现文件的创建和更新工作。里面主要就是根据模板语言的数据交互,这样就会实现按照不同的数据生成不同的文件:下面以一个很简单的实例进行解析实现的原理:步骤: 首先就是要撰写模板文件:文件名为 test1.template ,模板语言就是采用{{.}}的形式进行数据的交互,后台数据要传输的类型为map类型。pa...
2020-12-07 11:17:13 961
原创 Go语言之变量区分以及new()和make()的差异
背景: 关于Go语言的变量主要分为值类型和引用类型两种:1. Go语言中的值类型和引用类型值类型:int,float,bool,string,struct和数组(数组要特别注意,别搞混了)变量直接存储值,分配栈区的内存空间,这些变量所占据的空间在函数被调用完后会自动释放。引用类型:slice,map,chan和值类型对应的指针变量存储的是一个地址(或者理解为指针),指针指向内存中真正存储数据的首地址。内存通常在堆上分配,通过GC回收。注意: ...
2020-12-03 10:55:57 224
原创 JWT后台实现旧Token失效的问题(添加黑名单方式)
背景: 在开发设计中涉及到JWT的校验问题,但是发现一个漏洞同时也是JWT设计的理念,那就是后端不进行相关的Token存储,后端只进行相关的Token验证,同时还有就是token的生成和刷新,那么问题来了,那就是后端校验不会知道是否是最新的token也就是说,可能已经刷新过了token,但是发现旧的token还没过期,这个时候还可以进行使用,在我看来还是有安全风险的,我想要的设计是用户退出登录或者刷新Token后,旧的token要立即失效,这样才够安全,不然一旦被黑客拿到旧的token,那么它就可以..
2020-11-30 15:22:59 6048
原创 不区分语言开发工具1(服务压力测试,跨域问题解决,Redis进行密码的设置,设计模式,搭建FTP局域网服务,redis热key,redis哨兵,VueRouter模式)
1. Apache的ab工具:(压测的具体使用,可以实现添加参数进行相关的测试)压测的概念: 吞吐率(Requests per second) 概念:服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。 计算公式:总请求数 / 处理完成这些请求数所花费的时间,即 Request per second = Complete requests / Time taken for tests
2020-11-28 16:26:27 173
原创 Go之panic异常捕获处理
背景: 在项目开发中我们经常会遇到一个问题那就是,程序处理异常,但是我们捕获到异常又不想终止整个项目程序,简单点说就是一个业务出现问题,不想影响其他的业务。下面具体参考相关的代码:业务代码1连接数据库操作:func PanicTest2() { fmt.Println("测试捕获异常!") db, err := gorm.Open("mysql", "root:###@/gcg?charset=utf8&parseTime=True&loc=Loca...
2020-11-26 16:26:24 4182
原创 Go之zap的log包使用
背景: 当前项目需要,因为在项目部署后,会持续的产生大量的日志,那么其中最重要的就是我们所说的内存消耗问题了,一旦部署服务器,会每时每刻的产生日志,随着时间的推移,可能日志就会达到相当大的内存。如果项目很多可能堆积的大量日志会导致系统服务无法使用我就是根据这个需求,在网上找了一些相关的公共log包,看看有没有什么可以使用的,发现其中zap包性能和使用上面最为方便,下面就具体介绍相关的使用:(springBoot的log已经解决了这个问题,前面的博客已经进行了说明)首先:该包...
2020-11-26 14:19:57 1943
原创 SpringBoot热部署配置
背景: 因为开发过程中会遇到进场的调试程序代码,进行小部分的修改,但是每次都要自己进行重新启动项目,太麻烦,这里就可以用到SpringBoot自带的热部署机制进行相关的配置,和我之前使用的Go框架Beego差不多都是只做一点点的修改就可以实现代码的重新编译运行。相关的Maven依赖: <!-- 启动热部署--> <dependency> <groupId>org.springfra...
2020-11-26 09:20:58 2917
原创 Go之文件夹路径生成(先判断后生成)
背景: 自己在开发时候使用的Log4go日志包的时候,发现在指定日志文件夹路径的时候需要先确定有该文件夹,否则会进行报错,所以我们就需要提前进行相关的文件夹创建,下面就是一个小的方案,实现运行程序的时候先进行判断,是否需要进行相关的文件夹创建,如果查询没有该文件夹就会进行相关的创建,否则就不创建:具体的步骤:首先判断文件夹是否存在的方法: 如果存在就会返回true,否则返回false//判断文件夹是否存在func PathExists(path string) (bo...
2020-11-18 09:21:27 541
原创 Go之Gorm连接池的配置,解决更新空值问题
背景: 在开发过程中遇到一个瓶颈那就是,数据库的连接池设置,有两个需求第一个就是大量用户同时并发操作数据库的时候,会出现连接超时问题。其次就是用户少量的时候如何实现快速的实现数据的相关操作:针对这两个问题,我们需要进行相关的数据库的配置。首先我们采用的是Go语言开发,然后使用的就是Gorm包进行相关的数据库操作。1. Grom相关的学习文档如下:http://gorm.book.jasperxu.com/https://gorm.io/docs/generic_interf...
2020-11-16 14:06:28 24539 3
原创 Gin中Next和Abort的理解:(挂起和终止运行)
背景: 在项目开发中,我们会遇到一些需求,比如开发中我们可能在服务器与客户端交互的时候,通过中间件验证客户的合法性,如果合法则正常执行相关的操作,但是不合法的话,我们需要终止本次的请求。那么针对这个需求我们采用GO语言中的Web框架Gin进行简单的说明。首先Gin实现上面的功能就是通过Next和Abort这两个函数。next()顾名思义就是挂起继续向下走,然后执行完成下面的函数,会反过来最后执行该中间件abort()顾名思义就是终止的意思,也就是说执行该函数,会终止后面所有的...
2020-11-14 15:52:48 6344
原创 Go之JWT工具的开发使用(基于Gin框架)
背景: 开发中可能会存在客户端与服务器交互过程中数据安全问题,现在比较常见的方式有文件的签名校验,方式有很多,但是我感觉针对不同的业务需求我们用不同的加密校验方式:比如Oauth2:该方式适合第三方授权获取用户信息的业务需求,原理认证的Token存储在服务器端,然后用户根据服务器分配的ClientId和CllientSecret进行获取对应的Token信息,然后每次访问服务器将Token放在请求头,服务器验证是否有效,如果有效则返回对应的请求信息。 JWT:是一种...
2020-11-13 10:21:46 1390
原创 Go小工具之Viper高级用法
背景: 前面已经做了Viper等一些小工具的使用方法介绍,但是介绍的都是简单的入门级别的使用,真正的开发中不会那样使用,下面就写个简单地测试用例,介绍项目中该如何使用Viper具体的请看下面链接:https://blog.csdn.net/gcglhd/article/details/109243437。步骤: 首先还是配置文件的相关配置:settings: jwt: # token 密钥,生产环境时及的修改 secret: go-ad...
2020-11-11 15:27:34 1020
原创 IDE系列编译器实现代码提示补全且不区分大小写
@IDE系列编译器实现代码提示补全且不区分大小写我们以IDEA为例第一步就是进行相关的设置:然后就是相关测试,我们随便输入h字母,就会提示出以大H和以小h开头的所有的函数字段。最后针对其他的IDE编译器,比如Golang和WebStom也是相同的方式进行操作。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计 ,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式,Ma
2020-11-11 09:09:38 483
原创 Go之Cobra的命令行应用开发使用
环境搭建请参照如下博客: https://blog.csdn.net/gcglhd/article/details/109572324具体的开发设计使用:
2020-11-10 14:04:40 687
原创 Go之Cobra的命令行应用开发环境搭建(里面的环境搭建方式可用于其他go get拉取下载失败的包安装)
背景: 在学习开源项目go-admin的时候,看到作者采用了cobra命令行包的形式进行相关的命令行操作,所以对此技术很感兴趣,通过百度才知道,该包的使用非常的广泛,包括现在比较火的Kubernetes和Docker里面都涉及到该技术的使用。Cobra项目的gitHub地址:https://github.com/spf13/cobra。首先就是开发前的环境搭建: 它类似于go,git等的命令,所以我们先安装一下它的命令行执行依赖包:https://g...
2020-11-09 11:40:29 882 2
原创 转发-MQTT与kafka对比分析
背景: 针对订阅消费模式,现在比较火的就是MQTT和Kafka,针对这两个概念有很多大神做了总结如下所示:https://blog.csdn.net/Yeshenzzrff/article/details/79021479?utm_source=blogxgwz2
2020-11-06 13:42:53 737
原创 HTTP和HTTPS协议的区别和详解
背景: 在跑跑本地项目进行对接的时候遇到HTTP和HTTPS的问题,那就是,本地跑的程序,对接的URL路径,如果直接写对方的IP+端口号和域名是有问题的,因为默认不添加是HTTPS,这个协议是需要SSL验证的,同时还是一种真实外网可访问的域名,是需要收费的。所以在我们的本地对接的时候,需要主动添加HTTP否则将无法访问。例如:同一局域网的本地服务是 192.168.2.3/test 那么直接这样填写会报错,将无法请求,所以正确的写法是: http://19...
2020-11-06 08:45:13 287
原创 WebStom和Vscode前端编译器的插件配置安装
背景: 在开发前端项目的时候大佬介绍就是Vscode和Webstom这两种是比较火的编译器软件,所以我们下面就是介绍一下相关编译软件的插件安装,因为这些东西就是在开发前端的时候必须使用的插件,下面分别介绍吧相关链接都是可以行的,本人亲测效果很好。1. Webstom搭建Vue环境:https://blog.csdn.net/thumbs_up_sign_ygj/article/details/1049792722. Vscode搭建Vue环境:https://blog.cs...
2020-11-05 15:16:18 130
RedisCache.zip
2020-07-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人