微服务过载保护原理与实战
在微服务中由于服务间相互依赖很容易出现连锁故障,连锁故障可能是由于整个服务链路中的某一个服务出现故障,进而导致系统的其他部分也出现故障。例如某个服务的某个实例由于过载出现故障,导致其他实例负载升高,从而导致这些实例像多米诺骨牌一样一个个全部出现故障,这种连锁故障就是所谓的雪崩现象
比如...[2020/12/21]
我用go-zero开发了第一个线上项目我用go-zero开发了第一个线上项目
作者:结冰
前言
? 说在最前面,我是一个外表谦让,内心狂热,外表斯文,内心贪玩的一个普通人。我的职业是程序员,是一个golang语言爱好者,一半是因为golang好用,一半是因为其他语言学不好。我是从phper转为gopher的,写php的时候我认识了互联网软件,写go的时候感觉自己...[2020/12/21]
基于消息传递的并发模型:Actor和CSP的区别
An object oriented language is a language with good support for objects. A concurrency oriented language has good support for concurrency. --Joe ...[2020/12/21]
Goproxy.cn 核心代码探究;https://github.com/goproxy/goproxy 开源模块分析;
文章背景:
之前曾写过《GO语言环境探究与配置;1.14.5》一文;在文中,我提到了环境变量的GOPROXY的配置。国内,因为存在着防火墙的原因,很多国外的网站都需要特殊渠道访问。
然而,我们在go开发的时候,需要依赖国外很多服务来进行辅助开发,如各种开源的go模块。从GO1.11开...[2020/12/21]
我用 go-zero 一周实现了一个中台系统,已开源!
作者:Jack
最近发现golang社区里出了一个新星的微服务框架,来自好未来,光看这个名字,就很有奔头,之前,也只是玩过go-micro,其实真正的还没有在项目中运用过,只是觉得 微服务,grpc 这些很高大尚,还没有在项目中,真正的玩过,我看了一下官方提供的工具真的很好用,只需要定...[2020/12/21]
[GO]go redis实现滑动窗口限流-redis版[GO]go redis实现滑动窗口限流-redis版
上一篇是单机当前进程的滑动窗口限流 , 这一个是使用go redis list结构实现的滑动窗口限流 , 原理都一样 , 但是支持分布式
原理可以参考上一篇介绍
func LimitFreqs(queueName string, count uint, timeWindow int...[2020/12/14]
Go微服务实践之增删改查
从此篇文章开始,我们来陆续介绍 go-zero 开发一个项目所需要的组件和开发实践。
首先我们从 model 层开始,来说说go-zero 的API以及封装细节。首先 model 层连接的API集中在core tores。我们先来看看操作 mysql 这类数据库,API方法我们来到...[2020/12/14]
[Go]字符串转int64数值型
一般想到的strconv.Atoi()转成的是int型的
下面这种是转成int64型的
strconv.ParseInt("111", 10, 64)
func ParseInt(s string, base int, bitSize int) (i int64...[2020/12/14]
[Go] 获取当前时间戳和时间戳单位转换
1秒=1000毫秒 1毫秒=1000微秒 1微秒=1000纳秒
fmt.Printf("时间戳(秒):%v;\n", time.Now().Unix()) fmt.Printf("时间戳(纳秒):%v;\n",time.Now().UnixNano()) fmt.Printf...[2020/12/14]
[Go] redis分布式锁的go-redis实现
在分布式的业务中 , 如果有的共享资源需要安全的被访问和处理 , 那就需要分布式锁
分布式锁的几个原则;
1.「锁的互斥性」:在分布式集群应用中,共享资源的锁在同一时间只能被一个对象获取。
2. 「可重入」:为了避免死锁,这把锁是可以重入的,并且可以设置超时。
3. 「高效的加锁...[2020/12/14]
最简单的Go Dockerfile编写姿势,没有之一!
1. Dockerfile一些额外注意点
选择最简单的镜像
比如alpine,整个镜像5M左右
设置镜像时区
RUN apk add --no-cache tzdata
ENV TZ Asia/Shanghai
2. 多阶段构建
第一阶段构建否则构建出可执行文件,确...[2020/12/14]
手把手教你用notepad++搭建golang开发环境实战教程
Notepad++ 配置 Golang 开发环境
Notepad++小而轻便,对电脑配置要求低,下午详细讲述,如何用用notepad++搭建golang开发环境
注:本机安装都是win10,64位环境下进行的,网上看了很多文章,都讲解的很局限,步骤不详细,缺少截图及安装文件下载路径
...[2020/12/14]
goland2020.1中文破解版 附安装教程免激活码goland2020.1中文破解版 附安装教程免激活码
下载地址:http: www.ddooo.com oftdown/167216.htm#dltab
都2020了还在用2019版本的软件?小编今天为大家带来了jetbrains goland 2020.1,这是专为Go开发人员构建的跨平台 IDE 工具,拥有强大的内置工具可轻松帮助您运...[2020/12/14]
最简单的 K8S 部署文件编写姿势,没有之一!
1. 头疼编写K8S部署文件?
K8S yaml 参数很多,需要边写边查?
保留回滚版本数怎么设?
如何探测启动成功,如何探活?
如何分配和限制资源?
如何设置时区?否则打印日志是GMT标准时间
如何暴露服务供其它服务调用?
如何根据CPU和内存使用率来配置水平伸缩?
首先,你需要知...[2020/12/14]
golang API开发过程的中的自动重启(基于gin框架)
概要
实现方式
补充
syscall.Exec
概要
基于 golang Gin 框架开发 web 服务时, 需要时不时的 go build , 然后重启服务查看运行结果.
go build 的过程集成在编辑器中(emacs), 可以通过快捷键迅速完成, 但是每次重启服务都切...[2020/12/14]
[Go]GO实现滑动窗口限流算法-单机版
本代码基于原博客java版本的GO实现 , 原文解释也比较详细 , 这里也放上原文链接:https: www.cnblogs.com/dijia478/p/13807826.html
具体解释如下 , 代码在最下面
1.10秒内通过5次 , 这条线就是队列list,当第一个事件进来,...[2020/12/14]
Web基础_0x02_Go如何使得Web工作Web基础_0x02_Go如何使得Web工作
前面介绍了如果通过Go搭建一个web服务,我们可以看到简单应用一个net/http包就方便的搭建起来了。那么Go在底层到底是怎么做的呢?
Web工作方式的几个概念
以下均是服务器端的几个概念
Request:用户请求的信息,用来解析用户的请求信息,包括post,g...[2020/12/8]
[Go]Go语言实战-jwt-go会把存储的数值型转成float64[Go]Go语言实战-jwt-go会把存储的数值型转成float64
在jwt-go里存储一个map[string]interface{}
比如 info["id"]=10
解析出来的时候 info["id"]断言的时候 , 应该用float64断言 , info["id"].(float64) 然后再去强转
Go语言提供...[2020/12/8]
[Go] GO语言实战-使用append函数要重新赋值
使用append函数的时候 , 要把扩展后的新slice重新赋值给原变量名 , 因为当底层数组的空间不足的时候 , 会扩充内存空间 ,内存空间会重新分配
通常我们并不知道append调用是否导致了内存的重新分配,因此我们也不能确认新的slice和原始的slice是否引用的是相同的底层数...[2020/12/8]
[Go] GO语言实战-slice的初始化影响转换成json后的数据结构
1. 切片slice的声明和初始化 , 如果只是单纯的声明 var list []string , 那么list现在是nil , 转换成json会变成null
2. 声明后使用了append函数增加了数据 , 那么就是正常的列表了&n...[2020/12/8]
go-zero 如何扛住流量冲击(二)go-zero 如何扛住流量冲击(二)
本篇文章承接上一篇go-zero 如何扛住流量冲击(一)。
上一篇介绍的是 go-zero 中滑动窗口限流,本篇介绍另外一个 tokenlimit ,令牌桶限流。
使用
const (
burst = 100
rate = 100
seconds = 5
)
sto...[2020/12/8]
合并2个数组为1个无重复元素的有序数组--Go对比Python
Go实现:
1 package main
2
3 import (
4 "fmt"
5 "sort"
6 )
7
8 func main() {
9 var a = []int{1, 6, 45, 2, 9, 15, 7}
10 ...[2020/12/8]
Go 大数据生态迎来重要产品 CDS
项目地址:https: github.com/tal-tech/cds
ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。它有着优异的性能,可以快速部署和运行。
不过要想使用ClickHouse搭建起数仓用于数据分析,一个重要的问题就是数据如何进...[2020/12/8]
通过Consul Raft库打造自己的分布式系统
通用的CP系统有etcd和consul, 通用的对立面就是专用系统. 所以在某些场合是有这种需求的.
然而etcd embed的可用性极差, Windows上面跑会出现各种问题, 而且不能定制协议, 你必须得用etcd定义好的协议和客户端来和etcd集群通讯. 所以这时...[2020/12/8]
我的go练手项目--使用go实现“删除sql里面的注释和字符串”功能我的go练手项目--使用go实现“删除sql里面的注释和字符串”功能
项目里面有一个需求,要对sql进行简单的语法分析
为了避免sql里面的字符串和注释对语法分析做干扰,我写了一个java函数,对sql进行修剪,删除里面字符串和注释,用空格代替
周末闲着没事,我用go重新实现了这个功能,感觉应该会有后来人可以用上
说明:
sql里面的注释有两种单行...[2020/12/8]
密码学:一.异或加密
异或加密是密码学中一种简单的加密算法,常作为更为复杂的加密算法的组成部分。
原理
异或运算:首先异或表示当两个数用二进制表示,进行异或运算时,当前位的两个二进制不同则为1相同则为0。
A ⊕ 0 = A
A ⊕ A = 0
A ⊕ B ⊕ B = A
文本的每个字符可以通过与...[2020/12/8]
Golang性能分析与优化
在公司的分享,去除了相关的敏感信息。
(完)
朋友们可以关注下我的公众号,获得最及时的更新:
原文链接:http: www.cnblogs.com/zhangya...[2020/12/8]
Go 数组合并去重和排序
博客原文链接:http: www.zhoubotong.site/post/15.html
Sort包实现了四种基本排序算法:插入排序、归并排序、堆排序和快速排序。 但是这四种排序方法是不公开的,它们只被用于sort包内部使用。所以在对数...[2020/12/8]
发现了一个关于 gin 1.3.0 框架的 bug
gin 1.3.0 框架 http 响应数据错乱问题排查
问题概述
客户端同时发起多个http请求,gin接受到请求后,其中一个接口响应内容为空,另外一个接口响应内容包含接口1,接口2的响应内容,导致响应数据错乱(偶现问题)
图1红框标注部分为正常请求响应
图1蓝框标注部分为异常请求响...[2020/12/8]
【Go语言学习笔记一】基础语法
Go学习笔记
Go语言基础语法
行分隔行
在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,
但是可以使用分号;结尾,如果当你将多个语句写在同一行时,则必须使用分号;
一、变量
1.1 变量的声明
功能:存储用户的数据
注意: 变量...[2020/12/8]
golang拾遗:嵌入类型
这里是golang拾遗系列的第三篇,前两篇可以点击此处链接跳转:
golang拾遗:为什么我们需要泛型
golang拾遗:指针和接口
今天我们要讨论的是golang中的嵌入类型(embedding types),有时候也被叫做嵌入式字段(embedding fields)。
我们...[2020/12/8]
基于gRPC的注册发现与负载均衡的原理和实战基于gRPC的注册发现与负载均衡的原理和实战
gRPC是一个现代的、高性能、开源的和语言无关的通用RPC框架,基于HTTP2协议设计,序列化使用PB(Protocol Buffer),PB是一种语言无关的高性能序列化框架,基于HTTP2+PB保证了的高性能。go-zero是一个开源的微服务框架,支持http和rpc协议,其中rpc底...[2020/12/8]
go-zero 如何扛住流量冲击(一)go-zero 如何扛住流量冲击(一)
不管是在单体服务中还是在微服务中,开发者为前端提供的API接口都是有访问上限的,当访问频率或者并发量超过其承受范围时候,我们就必须考虑限流来保证接口的可用性或者降级可用性。即接口也需要安装上保险丝,以防止非预期的请求对系统压力过大而引起的系统瘫痪。
go-zero 集成了开箱即用的 限...[2020/11/23]
没有真实串口设备时使用"虚拟串口驱动"调试你的串口代码
目录前言示例代码总结
前言
很多时候需要编写串口代码,但是又没有真实串口设备来调试代码。以及本身就是要操作2个串口的情况,可以使用“虚拟串口驱动”工具方便的调试代码。
使用方法就是点击添加端口,此时“COM1 <-> COM2”是一组,即对COM1写数据会让COM2读...[2020/11/23]
go-zero之web框架
go-zero 是一个集成了各种工程实践的 web 和 rpc 框架,其中rest是web框架模块,基于Go语言原生的http包进行构建,是一个轻量的,高性能的,功能完整的,简单易用的web框架
服务创建
go-zero中创建http服务非常简单,官方推荐使用goctl工具来生成。为了...[2020/11/23]
[Go] gin框架中增加pprof分析性能
gofly客服websocket部分存在groutine泄露 , 在每次连接ws的时候都开启了groutine , 但是没有关闭
pprof是go标准库自带的功能 , 引进去就能分析程序中的性能问题 , 在gin框架下可以使用第三方的"github.com/gin-contrib/pp...[2020/11/23]
[Go]GO语言实战-类型声明语句
先来看一下概念:
一个类型声明语句创建了一个新的类型名称,和现有类型具有相同的底层结构。
type 类型名字 底层类型
gin框架中的实例:
type H map[string]interface{}
类型声明语句一般出现在包一级,因此如果新创建的类型名字的首字符大...[2020/11/23]
Go学习之mod的使用
一、Go mod 的使用
1、开启GO111MODULE
Go mod 的三种开启模式(GO111MODULE):
on:支持Go mod模式
off:不支持Go mod模式
auto (默认模式):如果代码在gopath下,则自动使用gopath模式;如果代码不...[2020/11/16]
端口重用
目录前言SO_REUSEADDR简介Python中的用法golang用法其他学习总结
前言
服务器重启进程时总会提示端口已经被绑定的报错,直到重试好几次才能重启成功。
这是因为端口尚未完全关闭的情况,这时如果不设置端口重用,则无法完成绑定,因为端口还处于被别的套接口绑定的状态之中...[2020/11/16]
Go安装OpenCV库(gocv)常见问题
gocv是OpenCV4在Go中的绑定,使用它可以在Go里做图像处理。
Windows安装官方介绍:https: gocv.io/getting-started/window
其中gocv库提供的win_build_opencv.cmd为安装过程命令:
下载openc...[2020/11/16]
Golang websocket 实现消息推送
服务端实现
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"golang.org/x/net/websocket"
)
func add(ws *websocket.Conn) {
msg :...[2020/11/16]
使用邮箱验证登录后台ssh,再也不怕被人攻击服务器了!
目录前言安装教程
前言
之前写过使用用户名密码,以及扫描二维码方式验证后台登录 h的文章:【点击跳转】。
但是这样还是不太保险,也存在被人利用的情况,因为别人破解你的后台你压根不知道。因此想到使用邮件验证码来提高验证服务器登录 h的安全性。
如果有人破解了你 h的用户名和密码,...[2020/11/16]
如何高效定义和验证restful请求的参数
go-zero针对文本的序列化和反序列化主要在三个地方使用
http api请求体的反序列化
http api返回体的序列化
配置文件的反序列化
完整示例可参照下面这篇文章:
快速构建高并发微服务
1. http api请求体的反序列化
在反序列化的过程中的针对请求数据的数据...[2020/11/9]
[GO] gin 框架gorm下使用logrus记录sql语句
使用gin gorm时 , 默认sql语句是打印在终端的 ,想要记录到文件中 , 可以使用logrus来记录到文件
先把logrus的一些配置做好
package tools
import (
"fmt"
"github.com/gin-gonic/gin"
...[2020/11/9]
企业级RPC框架zRPC
近期比较火的开源项目go-zero是一个集成了各种工程实践的包含了Web和RPC协议的功能完善的微服务框架,今天我们就一起来分析一下其中的RPC部分zRPC。
zRPC底层依赖gRPC,内置了服务注册、负载均衡、拦截器等模块,其中还包括自适应降载,自适应熔断,限流等微服务治理方案,是一...[2020/11/9]
[GO]解决request origin not allowed by Upgrader.CheckOrigin websocket跨域
在gin框架下使用websocket , 如果是跨域请求的时候会报这个错误
request origin not allowed by Upgrader.CheckOrigin
使用的websocket库是 "github.com/gorilla/webso...[2020/11/9]
如何让服务在流量暴增的情况下保持稳定输出如何让服务在流量暴增的情况下保持稳定输出
服务自适应降载保护设计
设计目的
保证系统不被过量请求拖垮
在保证系统稳定的前提下,尽可能提供更高的吞吐量
设计考虑因素
如何衡量系统负载
是否处于虚机或容器内,需要读取cgroup相关负载
用1000m表示100%CPU,推荐使用800m表示系统高负载
尽可能小的Overhe...[2020/11/9]
如何利用go-zero在Go中快速实现JWT认证
关于JWT是什么,大家可以看看官网,一句话介绍下:是可以实现服务器无状态的鉴权认证方案,也是目前最流行的跨域认证解决方案。
要实现JWT认证,我们需要分成如下两个步骤
客户端获取JWT token。
服务器对客户端带来的JWT token认证。
1. 客户端获取JWT Token...[2020/11/9]
[Go] 类型断言和类型判断 if 和 type-switch两种形式[Go] 类型断言和类型判断 if 和 type-switch两种形式
使用类型断言断定某个接口是否是指定的类型
if这种简化形式: if _,ok:=x.(T);ok{ }
type-switch 类型判断形式
switch t := x.(type) {
case int:
fmt.Printf(1)
case nil:
f...[2020/11/9]
go语言reflect包最佳实践之struct操作(遍历、赋值与方法调用)
go语言reflect包最佳实践之struct操作(遍历、赋值与方法调用)
1. 反射基本概念
反射是指在程序运行期对程序本身进行访问和修改的能力。程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。
支持反射的语言可以在程序...[2020/11/9]