自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 资源 (2)
  • 收藏
  • 关注

原创 windows 安装 go lint 踩坑记录

go lint 介绍是什么Golint 是一个源码检测工具用于检测代码规范Golint 不同于gofmt, Gofmt用于代码格式化能干啥package注释 必须按照 “Package xxx 开头”package命名 不能有大写字母、下划线等特殊字符struct、interface等注释 必须按照指定格式开头struct、interface等命名变量注释、命名函数注释、命名各种语法规范校验等踩坑记录笔者也是刚接触golang 不久 然后就照着网上一顿骚操作,发现解决不了问

2020-05-30 12:59:43 1318

原创 go-echo实现对gprc的代理

前言目前公司框架准备开源自研的go微服务框架,而HTTP模块则是用的业界比较成熟的echo框架,考虑到后期框架的使用者会使用HTTP协议访问GRPC服务,本文章会详细对这块的设计以及实现做详细说明.如何实现入口: // 正常往ECHO中注册路由 echo.GET("/ping", func(ctx echo.Context) error { return ctx.JSON(200, "pong") }) echo.GET("/hehe", func(context echo.Con

2020-05-19 22:46:38 536

原创 将包含大量数据中的List的指定元素置顶解决方案

问题背景公司有个业务场景就是在程序中将ES聚合的数据按照管理平台的配置,对ES聚合返回的集合中指定匹配的元素进行置顶(所谓置顶:将元素往集合的前面放)落地方案v1.0傻瓜式操作:将ES聚合数据进行遍历,然后equals配置项,将匹配到的document存放到新的集合中,遍历结束后,将新的集合添加至ES聚合的document集合前面。此方案缺点:当聚合数据量较少时,此操作OK,不会...

2020-03-04 14:07:39 2608

原创 Mysql中的锁

前言大家都知道锁是用来保护并发访问的资源的,Mysql中根据锁的粒度分为了全局锁、表锁以及行锁。今天这篇文章我们一起一起探讨下Mysql中的这三种锁全局锁全局锁是Mysql中粒度最粗的锁,它的作用是给数据库实例进行上锁。一旦该数据库实例被上了全局锁,那么该实例就处于了只读状态,像一些DDL(create/alter table等)语句更新语句(update/insert)就会被阻塞。你可以使用以下命令给一个数据库实例上全局锁Flush tables with read lock 解锁UNL

2022-04-12 20:19:37 924 1

原创 mysql架构浅析

前言mysql作为当前比较流行的开源关系型数据库之一,想必在很多公司中都有使用。今天这边文章我来和大家一起探讨下mysql的整体构架,让大家在宏观上能大致了解mysqlmysql架构图如上图所示,mysql内部大体分为Server层和存储引擎层其中Server层:连接器管理Client连接,同时还可以处理Client的权限验证等问题分析器对Client的SQL语法进行合法性分析优化器生成SQL执行计划,选择索引等执行器与存储引擎进行交互,获取SQL操作

2022-04-11 20:56:06 1089

原创 Golang中的panic

前言Golang中当程序发生致命异常时(比如数组下标越界,注意这里的异常并不是error),Golang程序会panic(运行时恐慌)。当程序发生panic时,程序会执行当前栈中的defer 函数列表。然后打印引发panic的具体信息,最后进程退出,本篇文章我们一起探讨Golang中的panic以及如何利用defer 和 recover 来恢复这种致命的异常分析造成panic堆栈信息func main() { f1() fmt.Println("main func end")}func f1

2022-04-10 15:09:16 6788

原创 Golang中的channel

前言先来看看Rob Pick关于Golang并发的哲学不要通过共享内存来通信,而应该通过通信来共享内存下面我仅以我个人观点来描述我对这句话的理解:Golang不同于其他语言使用线程(比如Java)实现并发处理,它使用了更为轻量级的goroutine(协程来处理并发)。 \要理解「不要通过共享内存来通信」这句话,我们以Java中的并发举例 Java中多线程来并发操作一块临界资源时,本质上就是通过操作的一块共享资源,多线程之间通过这块共享资源进行通信。多线程之间需要依靠同步锁、信号量等同步机制来

2022-04-07 14:58:08 756

原创 Golang中的map

前言和大部分编程语言一样,Golang也提供了一种数据类型用来存储键值对(hash)数据,这篇文章我们一起来探讨Golang中map的使用方法以及常见的注意事项map的底层结构我们通过以下代码来看下,当我们创建一个map,并往map中添加键值对时,底层都做了些啥func main() { // 声明一个map m1 m1 := make(map[string]int) // 添加键值对 a:1 m1["a"] =1}map会初始时,内部有一个hash表,该表中有一定数量的hash桶。

2022-04-06 20:33:45 883

原创 Golang数组和切片

前言Golang中的「数组」和「切片」都是存储同一数据类型的容器,只不过Golang中的数组长度是固定的,而切片的长度是可变化的。我们日常应用中还是切片的占比还是比较大的,本篇文章我们来详细探讨下这两种数据类型Golang数组Golang中的数组长度是固定的,并且在声明时就必须指定他的长度数组声明func main() { // 声明数组 var a1 [2]string // 声明时并初始化数组 // 这里我声明了,string类型的数组a,他的长度为2 a2 := [2]string

2022-04-06 18:35:57 3131 1

原创 kafka系列文章四(Consumer Group)

前言简单来讲Kafka的Consumer Group是由多个Consumer实例共同组成的一个消费组,Consumer Group由一个Group ID来标识,该组内的所有Consumer共同协调来消费Topic下的所有分区,当然一个Consumer实例只能够消费一个分区。所以最为理想的情况下当你的Consumer Group下的Consumer实例个数和你的Topic分区个数相同时,那么每个Consumer都能消费一个分区的数据。但如果你的Consumer个数比分区数还多的话,比如: 3个Consu

2022-04-02 18:37:04 3580

原创 kafka系列文章三(如何避免消息丢失)

前言想必大家在实际使用过程都遇到过消息的丢失的问题,这里的消息丢失其实涉及到两个方面,一个是Producer生产的数据丢失,一个是Consumer消费的过程中因Offset问题而产生的漏消费。文章中我们会从这两个角度来和大家探讨如何尽量避免消息丢失的问题避免Producer消息丢失Kafka会对已提交的消息进行持久化存储,那么这里「已提交」的消息是什么意思呢?这里就得看Producer层面是如何定义消息是否发送成功了。所以接下来有两个比较重要的属性「RequiredAcks」,「Async」需要重点

2022-04-01 18:26:51 2242

原创 kafka系列文章二(Producer消息分区策略)

前言上一篇文章kafka系列文章一(kafka介绍)

2022-03-31 18:43:54 2858

原创 Redis中Rehash浅析

前言我们都知道Redis是以Key-Value的形式来保存数据的,而Value的数据类型有String、List、Hash、Set、Sorted Set等。Redis之所以能够快速的进行数据读写的原因是什么呢?下文我会和你一起探讨Redis是如何组织这些数据结构的Redis 键值对结构HashTableRedis中有一个「全局哈希表」,该哈希表中保存锁所有的键值对。对于Hash表的查找操作时间复杂度为O(1)Bucket哈希表中的每一个元素称为哈希桶(Bucket),哈希桶中保存

2022-03-30 16:34:39 5498 1

原创 kafka系列文章一(kafka介绍)

介绍我们都知道kafka是一个分布式流处理平台. 在大数据领域有着很广泛的应用。而它究竟有哪些特性能够支撑起海量的数据呢,带着这个疑问我将在后续的文章中来和大家一起探讨消息类型点对点(p2p)就拿微信聊天来讲,点对点类型类似于小明和老王之间私聊一样,「小明」说话的内容是只有「老王」才能收到的,其他人是接受不到该消息的发布/订阅(pup/sub)同样我们还是拿微信聊天举例,假设此时小明在群里发布了一条消息。发布/订阅类型中的「订阅者」就好比群中的张三,李四,老王。「发布者」就好比群中的小

2022-03-28 20:58:07 1493

原创 基于SAML 2.0对接阿里云的SSO(单点登录)

对接阿里云SSO

2022-01-25 13:01:07 5070 17

原创 redis的incr+expire的坑

使用redis的incr+expire做请求次数限制的问题

2022-01-14 11:46:10 982

转载 gRPC的错误处理实践

基于石墨文档基于K8S的Go微服务实践,我们这次把该内容中的错误码做了一个详细的介绍。0 背景我们内部系统全部统一采用gRPC协议和protobuf编解码。统一的好处在于不需要在做任何协议、编解码转换,这样就可以使我们所有业务采用同一个protobuf仓库,基于CI/CD工具实现许多自动化功能。我们要求所有服务提供者提前在独立的路径下定义好接口和错误码的protobuf文件,然后提交到GitLab,我们通过GitLab CI的check阶段对变更的protobuf文件做format、lint、bre

2021-11-17 21:53:22 3468 1

原创 Mac(M1)使用confluent-kafka-go

1.准备环境安装pkg-config,librdkafka,opensslbrew install pkg-config brew install librdkafkabrew install openssl2.golang中配置运行环境PKG_CONFIG_PATH=/opt/homebrew/opt/openssl@1.1/lib/pkgconfig-tags dynamic3.debug运行

2021-10-21 11:58:13 1288 2

原创 go项目接入华为严选模板代码

背景公司为了扩展销售渠道,将saas产品上架到华为严选。作为服务提供商来说需要开发对应的回调接口提供给华为,华为根据新购,续费等事件来回调服务提供商接入前准备参见官方文档:https://support.huaweicloud.com/accessg-marketplace/zh-cn_topic_0070649060.html模板代码语言:golangweb框架: https://github.com/gotomicro/ego该框架基于斗鱼的微服务框架jupiter演进而来,如何使用

2021-10-13 20:19:20 261

原创 gitlab接入公司内部单点登录

背景公司内部有基于oauth2协议自建的单点登录服务,现将原有的各子系统单独维护的登录统一迁移至单点登录。在迁移gitlab时,遇到的坑比较多,所以在这里记录下。安装gitlab实验环境是通过dokcer安装的ce版本的gitlab,gitlab版本号: 13.12.1编辑gitlab.rb文件如果你是基于源码的方式安装,请编辑 gitlab.yml 文件gitlab官网地址gitlab_rails['omniauth_enabled'] = true # 开启omniauthgitlab

2021-07-14 10:38:37 7875 20

原创 HTTP接口设计规范

简介RepresentationalStateTransfer(REST),一组描述资源状态转换的约束条件和原则,满足这些约束条件和原则的设计或应用称之为RESTful。本文仅仅涉及HTTP中的REST。遵守REST的意义在于,除了能统一URI⻛格外,主要是为了:能充分利用HTTP协议的语义,无需重复自定义一些不够通用的自定义header或者 body格式。遵从HTTP相关规范,对推进其他服务治理的中间件有积极意义,如网关/API管理等概念资源(Resou

2021-06-22 20:44:48 3490

原创 gorm升级V1至V2

Count() 入参类型变化V1 : Count(int)V2: Count(int64)Limt()\Offset()入参类型由 interface{} -> intOrderv1: 参数为空字符串会被忽略,从而正常执行: Order("") 生成的sql中不带order byv2: 空字符串也会被生成 order by 语句,从而导致 sql 执行失败。需要自行判空Find在 V1 版本中, Find(&User{}) 当记录不存在时会返回 ErrRecordNotFou

2021-04-28 18:39:42 2305 1

原创 使用sync.map做内存缓存

背景实际业务场景中有些需求对于数据实时性要求不高,但是对于吞吐量和响应有着极高的要求,这个时候我们可以建立多级缓存来解决此类问题,本篇文章我们讨论的是内存缓存(golang)来实现实现方案想到内存缓存,想必大家第一个想到的是golang中的map+mutex、sync.map的方式来实现.对于读多写少的场景,一般建议大家用sync.map来实现(具体场景的性能测试如下)引用自: https://blog.csdn.net/wyg_031113/article/details/106282340

2021-04-21 13:52:23 1200

原创 二叉树的层序遍历

原二叉树: 3 / \ 9 20 / \ 15 7要求遍历结果:[ [3], [9,20], [15,7]]代码及注释package mainimport "fmt"func main() { root := buildTree() fmt.Println(levelOrder(root))}type TreeNode struct { Val int Left *TreeNode Right *TreeNode}

2021-04-17 11:36:12 89

原创 求一个数的所有因数

求一个数的所有因数func GetFactor(num uint64) []uint64 { res := make([]uint64, 0) for i := 1; i <= int(num); i++ { if int(num)%i == 0 { res = append(res, uint64(i)) } } return res}测试

2021-02-20 20:35:47 871

原创 redis-rename

rename简介语法redis 127.0.0.1:6379> RENAME OLD_KEY_NAME NEW_KEY_NAME返回改名成功时提示 OK ,失败时候返回一个错误。当 OLD_KEY_NAME 和 NEW_KEY_NAME 相同,或者 OLD_KEY_NAME 不存在时,返回一个错误。 当 NEW_KEY_NAME 已经存在时, RENAME 命令将覆盖旧值。例子# key 存在且 newkey 不存在redis> SET message "hello worl

2020-11-11 11:05:48 421 2

原创 go学习笔记

1.time.NewTicket 疑问点记录:package mainimport ( "fmt" "time")func main() { ticker := time.NewTicker(time.Second) intChan := make(chan int, 1) go func() { for _ = range ticker.C { select { case intChan <- 1: case intChan <- 2: ca

2020-08-16 15:10:52 194

原创 对GO切片的无知,我所踩下的坑

需求背景:从切片中删除指定元素废话不多说直接上代码package mainimport ( "fmt")var datas []intvar filter intfunc init() { datas = append(datas, 11, 22, 33, 44) filter = 11}func main() { filterData(datas, filter) fmt.Println("datas:", datas)}// 从recordedDatas 删除f

2020-06-19 21:36:09 236

原创 protoc-gen-go的坑

@protoc-gen-go的坑问题背景最近从java转go学习grpc过程中,由于要使用用protoc和protoc-gen-go,所以在安装相关grpc环境中出现了一些坑,这里给各位刚入门的朋友分享下,避免踩坑安装protoc-gen-go1.go get -u github.com/golang/protobuf/protoc-gen-go然后就出现了一堆错误package google.golang.org/protobuf/compiler/protogen: unrecognize

2020-05-10 15:49:42 3077

原创 解决IDEA中JAVA项目WEB-INF/lib目录下的jar包无法用maven打包

产生问题的原因项目中的jar包一部分是基于pom文件依赖,一部分是用BuildPath放入WEB-INF/lib目录下,最后在使用maven打包的时候,发现无法把WEB-INF/lib下的jar包打到war包里面,从而导致maven install时出现各种奇葩的类或者包找不到的异常如何解决在pom文件里面加入如下maven插件:<build> <plugins...

2020-01-14 17:03:23 3971 2

原创 达梦数据库将TEXT类型的字段更改为VARCHAR失败

达梦数据库将TEXT类型的字段更改为VARCHAR失败问题原因mysql数据库迁移至达梦系统后,查询TEXT大文本类型的字段时发现返回的是对象信息而不是文本信息查询截图排查半天没发现问题,后面想到将TEXT类型的字段改成VARCHAR类型,所以马上去数据库进行修改修改截图然后发现又不能修改,简直不忍直视的管理工具和数据库 - -问题解决经过与达梦的研发沟通,发现大文本类型不能直接...

2019-11-12 10:04:36 9794 9

grafana.zip

牛叉的grafana,普罗米修斯的好基友,推荐各位老铁使用和学习! 牛叉的grafana,普罗米修斯的好基友,推荐各位老铁使用和学习! 牛叉的grafana,普罗米修斯的好基友,推荐各位老铁使用和学习!

2020-05-10

prometheus-2.1.0.windows-amd64.tar.gz

go,服务监控,服务治理 windows版本的prometheus,解决了官网上不去的难题,收集资源不易

2020-05-10

空空如也

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

TA关注的人

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