- 博客(54)
- 收藏
- 关注
原创 grpc 打印日志到日志文件
在使用grpc时,有报错往往是一件很头疼的事情。虽然grpc的每个方法报错都会返回一些错误信息,但很多时候这些错误信息并不能引导我们直接发现问题的根本(尤其是排查一些连接层面的偶现问题时)。好在grpc的源码里也是有日志的,通过grpc源码中的日志,我们不但可以更深入的了解grpc的运行过程,也可以在遇到报错时更快速的定位问题。本篇我们就来研究一下,如何开启grpc的日志,并将其写入我们服务本身的日志文件中。如何开启grpc日志对于grpc这种使用者众多的开源项目,有问题最好的办法就是先看readm
2021-10-07 00:50:12
5443
1
原创 assigning the result of this type assertion to a variable could eliminate the followin assertion解决
今天给项目加上了golangci检测,结果运行gosimple的时候报了这样一个问题:xxx.go:289:10: S1034: assigning the result of this type assertion to a variable (switch err := err.(type)) could eliminate the following type assertions: xxx.go:291:14 (gosimple) switch err.(type) {
2020-10-20 23:48:13
5348
3
原创 golang项目 如何排查死锁
之前写过一篇如何用pprof检测golang代码中的死锁,讲了下如何发现代码中的死锁,发现了死锁怎么办?自然是要解之。。最近刚好解决了两个死锁,分享一下心得,希望能帮助到大家~我把死锁分为两种,一种为简单死锁,另一种为并发场景下的死锁,接下来我们分别来说一说。简单死锁所谓简单死锁,就是写代码的时候粗心大意写出来的,比如说我们写了一个这样的函数:函数A会在获取锁之后调用函数B,而B也要获取这个锁,这时候显然就会发生死锁,而且是百分百出现的。现在你看着我的这个图可能觉得,我怎么可能犯如此
2020-09-17 01:00:52
5999
1
原创 grpc进阶篇之resolver
当我们的服务刚刚成型时,可能一个服务只有一台实例,这时候client要建立grpc连接很简单,只需要指定server的ip就可以了。但是,当服务成熟了,业务量大了,这个时候,一个实例就就不够用了,我们需要部署一个服务集群。一个集群有很多实例,且可以随时的扩容,部分实例出现了故障也没关系,这样就提升了服务的处理能力和稳定性,但是也带来一个问题,grpc的client,如何和这个集群里的server建立连接?这个问题可以一分为二,第一个问题:如何根据服务名称,返回实例的ip?这个问题有很多种解决方案,我们可
2020-09-13 21:18:03
7619
4
原创 grpc进阶篇之retry拦截器
前言之前还在学校的时候,写过一篇go gRPC初体验,算是初步预习了一下grpc的用法,知道了如何使用grpc实现简单的rpc调用,当时写了一个demo,跑通了之后就觉得,应该够用了,然而到了公司之后才发现,grpc,远不止于此。。。于是我决定好好总结一下grpc的一些进阶知识,结合公司项目里的实际用法,分享给大家,帮助初学者们更好的掌握grpc。本篇,就先介绍一下grpc的retry拦截器。为什么要retryretry很好理解,就是重试,为什么需要重试?首先,grpc常用于移动端和跨机房调用的
2020-08-30 20:31:37
2705
原创 curl 发送带引号的字符串变量
今天遇到一个问题,场景是这样的:我想在程序异常退出之后,将最后一行日志通过curl发送到报警服务器,我的脚本是这么写的:log=$(tail -n 1 server.log)curl -X POST -H "Content-Type: application/json" -d "{\"text\":\"退出前日志:$(echo $log)\"}" https://xxx.xxx.xxx而我的日志一般是长这样的:log info 00:00:00 "event":"payment"js
2020-08-18 23:43:15
3088
1
原创 如何用pprof检测golang代码中的死锁
用golang做的后端项目,为了实现高性能,通常会在运行过程中开启多个goroutine,并行处理并发请求。并发处理请求提升效率的同时,也引入了资源并发读写的场景,这通常会带来一些问题,比如同时读写一个map会导致程序panic,为此,我们需要为那些不应被多个goroutine同时访问的资源加锁。一个复杂的后端项目,通常会包含很多很多的锁,我们很难保证我们写的程序不出现死锁,或者长时间的锁等待。锁的问题不像业务逻辑的问题那么容易被发现,它有时可能只是阻塞了某个goroutine,这种情况下整体的功能
2020-08-07 19:55:44
11125
2
原创 go 使用pprof分析,为什么你的代码在leetcode只能击败10%的人
当你在leetcode做完一道题的时候,你一定不会满足于只是通过,而是还希望你的代码至少击败90%+的人。然鹅,像我这样的算法渣渣,提交完往往是这样的。。。之前用C++做题的时候,遇到这种情况,我都是到提交记录去看最快的代码,瞅瞅大神跟我到底有啥不同:如果是思路上的问题,看了大神的代码,可能你立马就能发现问题,比如你用了双层循环,而大神只用了一层。但如果思路上差不多,那这个...
2020-04-16 17:47:04
577
原创 go 当参数是slice,传值还是传指针?
下午面试,面试官让我写二叉树的中序遍历。遥想半年前的秋招,管他什么算法题,我都是不假思索,手起刀落,转瞬间一段漂亮的C++代码就跃然纸上~好吧,这是我编的。。。实际情况是,每次听到题目,我都毫无思路,直到面试官给了无数个提示(就差把代码说出来了),我才懵懵懂懂的写出一段涂涂改改,不堪入目的代码。。。半年后的今天,经过了几个月的go语言学习,go学的咋样不敢说,反正C++是忘光了。。。...
2020-04-16 00:35:31
4909
5
原创 gorm 深度剖析using unaddressable value
使用gorm的时候遇到一个问题,想往一个设置了主键自增的表里加数据,心想主键既然是自增,那结构体赋值的时候主键那个变量空着就好了吧,于是乎我是这么写的: customer = Customer{ Name: name, Age: age, Address: address, Phone: phone, Score: score, }...
2020-04-14 20:28:07
10703
6
原创 redis跳跃表图解&插入详述
最近跟着黄健宏老师的《redis设计与实现》学习redis数据结构,看到跳跃表一节时,发现只有两节:如此简略,应该是很简单吧,嘿嘿,抱着这种想法,我打开了redis源码,查看了下跳跃表的插入函数,结果,完全看不懂啊。。。于是乎我又看了看网上的一些博文,虽然比起直接看源码更舒适了些,但还是不能完全理解。。。最终,自己硬啃了大半天,终于是彻底搞明白了,在此记录一下,以免自己以后忘记,也...
2020-04-13 01:05:02
9278
11
原创 go Thrift初体验(win10+普通网络)
之前写过一篇go gRPC初体验(win10+普通网络),今天写个姊妹篇,说一说thrift。thrift和gprc呢,使用都很广泛,以我现在的水平还无法评价孰好孰坏,反正实习的时候我看的程序里,grpc和thrift都有出现,所以说都学习一下,是最保险的。为什么我先写的grpc呢,因为grpc的官方文档有中文版,凡是先挑简单的做嘛,而thrift,我查了查,好像并没有中文文档,网上虽然也...
2020-04-09 22:17:05
1576
1
原创 go gRPC初体验(win10+普通网络)
在公司实习的时候,发现代码里面有grpc,当时啥也不懂,也不知道咋用的,好在实习期间并没有需要新增rpc调用的地方,但还是觉得趁早弄明白比较好,以后总会用到。既然是初体验,肯定是从啥都没有开始的,网上很多文章,安装各种包、命令讲的不是很系统,所以本篇就记录一下从安装开始,到运行一个小case的全过程。首先声明一下,我是在win10上操作的,我觉得吧,什么东西,如果能在windows上搞通了...
2020-04-08 21:36:15
3141
2
原创 go 队列&栈(双向链表实现)
本篇记录一下go语言自己实现的队列&栈。本人的情况是这样的,上学的时候用的C++,所以秋招也用的C++,结果签的工作是用go的。。。用C++的人都知道标准模板库,比如queue,stack这些,用起来很方便,但是go是不提供这些的,所以对于我来说,感觉很不方便,于是乎就想自己写个队列和栈。在网上搜了搜,实现队列和栈一般有两种方法,第一种用slice,我看leetcode上一些题...
2020-04-07 16:32:59
1984
2
原创 elasticsearch初体验
elasticsearch近年来可谓非常之火啊,大家都在用,我自然也是想简单体验一波,为啥写这篇呢,自然是体验过程中又踩坑了,所以,记录一波。。。体验环境为了避开繁琐且充满报错的安装过程,我选择了使用docker进行部署,es官方有打包好的镜像,在后台run起来就可以直接用的那种,超级方便,但是,还是有坑。。。既然是用docker,自然在windows,linux,macos上都欧克的...
2020-03-23 13:30:17
5983
原创 go 协程调度
本文不讨论通过channel、sync等实现协程调度的具体写法,只是简单聊聊协程调度这件事儿。非抢占式调度go语言的协程调度是一种非抢占式的调度,何为非抢占式?我们先说抢占式。我们知道操作系统的线程调度,会使用时间片轮转的方式调度各个线程,当时间片需要从线程A交给线程B时,不管线程A处于什么状态,都会先停掉。这种调度方式下会经常出现一种情况,就是线程A正在做一件事做到一半的时候,时间到...
2020-03-17 09:44:38
8702
原创 go defer需要弄清楚的三个点
本篇主要记录defer的三个关键点。我们知道defer调用会在函数结束时被执行,但除此之外,我们还应该弄清楚几个问题:函数结束前遇到panic,defer调用还会执行吗?多个defer的调用顺序是怎么样的?defer的参数是调用时确定的还是执行时?下面结合例子,逐个说明一下。遇到panic时,panic之前的defer会执行其实这点不算是defer的知识点,算是pani...
2020-03-15 14:13:58
8917
原创 go使用接口类型实现“模板类”
C++支持多态,可以通过重载和模板实现多态,其中模板类这个功能我感觉很方便,比如想写一个栈类型,可以通过模板类,只定义一个类,就能让这个栈支持int,double,char等多种数据类型。go语言呢,不支持多态,自然也就没有模板这个概念,但是没有关系,go语言的设计者自然知道多态的好处,只是觉得重载这个概念不好理解,所以把多态这个东西给去掉了,取而代之的是一种更简单的编程方式-接口。下面我...
2020-03-15 00:16:49
9738
原创 go 结构体方法的值接收与指针接收
首先,本篇不是为了讲值接收和指针接收的概念,因为概念本身很好理解,不过为了后面的验证还是先写一个例子,简单说明一下。type treeNode struct { value int left, right *treeNode}func (node *treeNode) setValue(val int) { node.value = val}func (node treeN...
2020-03-14 15:37:24
10493
原创 go语言入门指导
半年前的秋招,我拿到了一家公司的offer,当时加了mentor的微信,他告诉我公司开发用的是go,当时我还完全不会go,于是想着趁正式实习之前,先自己学学。自己学的时候,没有人指导,也没有制定什么计划,就是借了几本书看,敲了敲书上的代码,当时觉得只是换了一种语法,没什么难的。一个月以后,三方签好了,就进公司实习了,刚开始看代码感觉没什么问题,但是到了实际开发的时候问题就来了,怎么让项目代...
2020-03-13 22:02:11
9256
原创 rancher集群搭建
最近想学习一下docker容器的管理,本来想直接装k8s,但是直接装k8s的话,一大堆命令,按网上的教程执行几步就会报个错,最后实在搞不定了,就放弃了。。。后来看有人推荐rancher,于是我就试了一下。rancher也可以实现容器的管理,而且是开源的,我理解呢就是对k8s做了一层封装,把所有东西都封装到docker镜像里了,而这个docker镜像又放在了docker hub上,所以只需要...
2020-03-07 22:05:20
16390
7
原创 linux 根据进程号查看进程打开的所有文件描述符
最近调程序遇到一个问题,就是程序跑起来以后,打开的文件描述符数一直增长,也不知道是哪里没有关闭,好在,linux上可以直接查看每个进程打开的所有文件描述符~首先,每个进程开启,linux系统都会为其创建一个文件夹:/proc/pid/在进程关闭之后系统又会自动删除这个文件夹。这个文件夹里有下面这些东西:根据这些文件夹的名字可以大概推测里面放了些什么东西,我们要看的是文件描述符...
2020-02-26 22:51:33
17079
1
原创 gin html模板调用js函数
最近想用gin写个web服务器,发现gin提供了html模板这个功能,感觉贼方便,可以前后端一块开发了~可是,用着用着发现一个问题,就是,不能在html模板里直接定义js函数。。。对这个问题,我的理解是,html模板是个静态的文件,不支持js的解析。那咋办呢?话不多说,直接上步骤~自己写一个js文件首先,js函数不能定义在html模板里,那就得我们单独定义一个js文件,放我们需...
2020-02-26 16:50:45
17133
1
原创 go 安装gin(使用git clone)
安装go包最快捷的方法是go get,一步到位,但是需要翻墙,取而代之的方法是用git clone直接把需要的包从github拉下来,也很慢,但至少是可行的~另外,不是吹牛,用本文的方法安装一次gin,以后想安装其他的go包,相信你也就都可以自己搞定了,嘿嘿环境因为使用的是git,所以这种安装方法使用于所有系统(linux,mac,windows),我是在ubuntu上装的。在安装...
2020-02-24 14:25:56
12394
原创 ubuntu1404 安装php5.6-fpm
因为历史原因,不得不使用这么老的版本。。。现在很少有人用ubuntu1404了,也很少有人用php5.6了,所以安装过程中遇到的问题,很多百度出来的帖子说是系统不再维护导致的,好在我没有相信,最终还是装上了。。。添加php源如果直接apt-get install php-fpm,安装的是php7的版本,如果指定版本,apt-get install php5-fpm,则会报错Packag...
2020-02-22 17:29:56
3498
原创 linux C获取时间戳(精确到毫秒)
最近有个需求,需要数据库程序统计一次sql查询的过程耗时多久,于是乎就需要程序获取当前时间戳,由于这个时间非常短,因此需要精确的毫秒,话不多说,直接给程序~#include <stdlib.h>#include <stdio.h>#include <sys/time.h>#include <unistd.h>int main(){ ...
2020-02-18 15:26:48
18900
原创 docker基本操作(ubuntu)
本人使用docker,主要是为了将服务部署在容器里,需要的时候直接运行容器,这样就不用每次部署,都要在一个新的系统上从头开始装一遍各种库,配置各种环境变量之类的工作了。docker简介强烈推荐这篇文章10分钟看懂Docker和K8S,docker讲的非常清楚,也很生动(后面k8s的部分就不用看了)。安装docker环境:ubuntu1604/1804命令如下:apt-ge...
2020-02-13 22:55:12
16019
原创 ubuntu1804搭建mysql cluster
在网上看了几篇相关教程,虽然写的都很好,但是没有一个可以从头到尾做下来没有任何问题的,最终结合了各篇的精华,终于自己搭成了,趁着刚搭完,赶快记录下来~环境三台阿里云服务器(2v+4g+50g),在一个VPC网络里,就是在一个局域网里。三台机器的内网ip如下:服务器1:172.17.119.207服务器2:172.17.119.206服务器3:172.17.119.204其...
2020-02-12 21:02:09
2984
原创 ubuntu1804搭建zookeeper集群(docker)
环境三台阿里云服务器,在一个VPC网络里,就是三台服务器在一个局域网里。在这三台服务器上,我均以host网络模式启动了一个docker容器,容器内部是ubuntu1804操作系统。host网络模式就是容器内部直接使用宿主机的网络,所以和直接在宿主机上操作其实没有区别,因此本文的搭建方法在非docker环境完全适用。之所以选择docker,是希望可以一劳永逸,搭建这一次,搭好了把镜像存到...
2020-02-12 14:48:57
3262
原创 consul 公网集群搭建
背景在网上查了查consul集群搭建,虽然文章不少,但是讲的都是如何在局域网搭一个集群。其实这没什么不妥,实际生产环境里,一个集群一般部署在公司的一个机房里,确实是局域网环境。可问题是,我在百度云,腾讯云和华为云各买了一台学生优惠服务器,只有这三个云服务器,也想体验一下consul集群。好在,胡乱搜索资料的过程中,真的歪打正着,从一篇配置多数据中心的博客里获得了灵感,成功搭建了一个...
2020-02-10 15:17:47
4006
1
原创 go 使用consul实现服务注册发现
目标既然是学习使用consul实现服务注册发现,目标自然是实现一个程序,可以通过consul,发现另一个程序。为此我准备了3个机器:1.云服务器A(ubuntu):运行consul agent2.云服务器B(ubuntu):运行一个服务,并在服务启动时注册到consul上3.本机(mac):运行一个程序,可以通过云服务器A上的consul,发现云服务器B上的服务启动cons...
2020-02-09 21:48:20
23164
2
原创 go 安装consul包("github.com/hashicorp/consul/api")
注意:1.这里安装的不是consul本身,而是consul包,就是go程序里要import的那个。2.安装方法适用于所有系统,包括linux,windows,mac,只需要机器上有gitconsul源码就是用go写的,所有使用go程序调用consul包,只需要把整个go项目从github上clone下来即可。其实用go get也可以安装,但是因为源在国外,非常慢,且go get看不到进...
2020-02-09 15:19:44
6635
原创 go 解析字符串
场景有时,我们的程序收到的消息不是json或者xml这样的常用消息体格式,就是一个普通的string,比如下面这条消息:A调用失败率过高------业务方:X项目时间点:2020-01-10 16:25:00.360047+08:00------对程序而言,就是这样一个字符串:"A调用失败率过高\n------\n业务方:X项目\n时间点:2020-01-10 16:2...
2020-02-06 15:40:48
6277
原创 consul的kv使用
官网关于这部分的介绍:https://learn.hashicorp.com/consul/getting-started/kvconsul的kv功能可以用来做动态配置,kv的增加修改删除查询除了可以通过consul客户端,还可以通过http api和consul的ui,因此不管是集成到程序里,还是在管理界面查看/配置都很方便。consul客户端通过consul客户端使用kv功能我不知...
2020-02-05 22:08:13
20163
1
原创 ubuntu安装consul
官网有详细的安装和使用教程:https://learn.hashicorp.com/consul/getting-started/install具体安装命令如下,压缩包解压之后就是一个文件名为consul的二进制文件,把这个文件放到任意PATH中的路径下即可。wget https://releases.hashicorp.com/consul/1.6.3/consul_1.6.3_lin...
2020-02-01 19:19:15
4814
原创 goland远程调试
前言之前写过一个goland本地调试,为什么可以本地调试还要远程调试呢?首选声明一点,本地调试是首选,如果可以本地调试,那自然是本地调试最方便。但是,本地环境和实际环境很多时候是不一样的,很难在本机搭建出与线上完全相同的环境,比如我们想调试数据库、调试rpc、调试服务注册发现,这些线上都是现成的,但在我们本机就很难复制,再比如线上的网络和我们本机的网络环境是不一样的,这些场景下本地调试...
2020-01-31 17:07:40
43897
14
原创 ubuntu1604安装go1.13
操作环境:腾讯云服务器下载包从官网下载1.13.4版本,注意这个地址虽然带google,但是实际操作证明,并不需要翻墙,下载的还很快,哈哈。wget https://dl.google.com/go/go1.13.4.linux-amd64.tar.gz补充一句:如果你想装其他版本,只要改版本号就行了,1.12.4亲测可行。下载之后解压到/user/local/tar ...
2020-01-31 15:22:35
4902
原创 goland本地调试
配置当我们第一次用goland打开一个工程时,右上角的运行还有调试按钮都是灰色的,就是点不了的。为什么点不了呢?如果是你打开的是一个文件,goland可能会默认你想go run这个go文件,但是一个工程里有一大堆go文件,goland并不知道你是想运行其中某一个go文件,还是想把这一堆文件编译成一个二进制文件然后再运行,我们通常要做的事是后者。这个时候,我们就要配置一下,告诉gol...
2020-01-27 21:21:48
28204
2
原创 go 解析json
在实际接触json之前,我以为json全都是长这样的。{ "id":6, "name":"hbliuu" "marry":false}嗯,如果是这样,也就没必要写这篇blog了。实际上呢,第一次自己写程序的时候,遇到的json是这样的。{ "name": "jero", "parents": { "father": "h...
2020-01-27 19:52:23
3762
原创 新人入职手册之git
第一步,把代码拉到本地(clone)进公司第一件事应该就是看别人的代码,熟悉一下业务,而代码都是在github或者gitlab之类的代码仓库里的,所以我们首先要做的,就是把代码拉到本地。这是我的github,比如要拉图中这个goStudy项目,要做的就是把它clone到本地。首先点clone or download那个绿色的按钮,然后会弹出一个框,写着clone with ssh,...
2020-01-08 22:23:11
10200
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人