漏桶、令牌桶限流的Go语言实现
本文首发于我的个人博客:liwenzhou.com,更多更详细的Go语言项目实战内容就在liwenzhou.com。
限流
限流又称为流量控制(流控),通常是指限制到达系统的并发请求数。
我们生活中也会经常遇到限流的场景,比如:某景区限制每日进入景区的游客数量为8万人;沙河地铁站早高峰通过站外排队逐一放行的方式限制同一时间进入车站 ...
go switch的用法
最近一直在写go, switch说实话用的不算多。但是今天用了下发现go的switch可真不太一样啊。
无需break
func main() {
i := 0
switch i {
case 0:
fmt.Println("0000000000")
fmt.Println("0")
case 1:
fmt.Println("1111111111")
fmt.Println("1")
case 2:
fmt.Println("2222222222") ...
Go中sync.map使用小结
sync.map
前言
深入了解下
查看下具体的实现
Load
Store
Delete
LoadOrStore
总结
流程图片
参考
sync.map
前言
Go中的map不是并发安全的,在Go1.9之后,引入了sync.Map,并发安全的map。
深入了解下
对于map,我们常用的做法就是加锁。
对于sync.Map这些操作则是不需要的,来看下sync.Map的特点:
1、以空间换效率 ...
使用Go env命令设置Go的环境
1 前言
在进行Go开发的时候,设置Go的环境变量信息是必须的。下面介绍windows和Linux,以及Go自身提供的命令进行设置的形式
2 设置
2.1 Linux的设置
In Linux or macOS, you can execute the below commands.(在Linux或者macOS,你可以执行下面的命令)
# Enable the go modules feature
export GO111MODULE=on
# Set ...
Go语言的原子操作atomic
atomic
原子操作
Go中原子操作的支持
CompareAndSwap(CAS)
Swap(交换)
Add(增加或减少)
Load(原子读取)
Store(原子写入)
原子操作与互斥锁的区别
atomic.Value
Load
Store
总结
参考
atomic
原子操作
原子操作即是进行过程中不能被中断的操作,针对某个值的原子操作在被进行的过程中,CPU绝不会再去进行其他的 ...
go select的用法
golang中的select语句格式如下
select {
case <-ch1:
// 如果从 ch1 信道成功接收数据,则执行该分支代码
case ch2 <- 1:
// 如果成功向 ch2 信道成功发送数据,则执行该分支代码
default:
// 如果上面都没有成功,则进入 default 分支处理流程
}
可以看到select的语法结构 ...
GitHub 热点速览 Vol.35:Let's Go,Rust 大放异彩
摘要:语言之争,一直存在于各类社群,不论是单个编程语言的交流群,亦或是 NoSQL、云开发等技术群,总能看到“要不要换 Go”、“Rust 比 C++ 更强”的影子。撇开语言特性,本周的热点趋势周榜上 Rust 和 Go 开发的项目表现都很良好,比如,搜索引擎:MeiliSearch,虽然 ES 在搜索这块独占鳌头,但是 MeiliSearch 凭借它 ...
Go | Go 语言打包静态文件以及如何与Gin一起使用Go-bindata
Go | Go 语言打包静态文件以及如何与Gin一起使用Go-bindata
系列文章目录
第一章 Go 语言打包静态文件以及如何与Gin一起使用Go-bindata
Table of Contents
系列文章目录
前言
一、go-bindata是什么?
二、使用步骤
1. 安装
2. 使用
3. 读取文件
三、和 Gin 一起使用
1. 使用 go-bindata-assetfs 进行打包
2. 安装 g ...
go语言gRPC系列(三) - 使用grpc-gateway同时提供HTTP和gRPC服务
1. gRPC提供HTTP服务
1.1 存在的意义
1.2 代码示例
1.3 使用postman尝试调用
1.4 gRPC客户端代码调用
2. 使用grpc-gateway同时提供HTTP和gRPC服务
2.1 前言
2.2 安装
2.3 目录结构
2.4 示例代码
2.4.1 编写proto描述文件:proto/hello_http.proto
2.4.2 编译proto
2.4.3 实现HTTP服务端
2.4.4 实现gRPC服务端
2.4.5 ...
Win10系统下设置Go环境变量
前言
本人安装Window系统下的Go语言的相关信息如下:
Go语言版本:go1.14.6
安装包:go1.14.6.windows-amd64.msi
安装路径:D:\Program Files\Go
Win10系统下配置Go语言环境变量
打开Win10下的环境变量设置界面
右键我的电脑->属性->高级系统设置->环境变量。
它有用户变量和系统变量。两者的区别是用户变量下配置只对 ...
go语言gRPC系列(一) - gRPC入门
1. 前言
2. gRPC与Protobuf简介
3. 安装
4. 中间文件演示
4.1 编写中间文件
4.2 运行protoc命令编译成go中间文件
5. 创建gRPC服务端
5.1 新建Product.protoc
5.2 运行protoc命令
5.3 实现RegisterProdServiceServer接口
5.4 准备工作完成,创建main函数将服务端跑起来
6. 创建gRPC客户端
6.1 拷贝Product.pb.go到客 ...
go微服务系列(一) - go micro入门
1. 什么是go micro
1.1 go micro作用
1.2 go micro架构组成
2. go micro入门
3. 结合consul进行服务注册/发现
3.1 consul的安装
3.2 服务注册代码示例
3.2 服务发现代码示例
1. 什么是go micro
1.1 go micro作用
它是一个可插入的RPC框架,用于在Go中编写微服务。开箱即用,您将收到:
服务发现: 应用程序自动注册 ...
GO语言获取文件的大小
在项目中,我们可能会需要获取一个文件的大小,在Go语言中,有很多方法来获取一个文件的大小
Read字节方式
func main() {
file,err:=os.Open("water")
if err ==nil {
sum := 0
buf:=make([]byte,2014)
for {
n,err:=file.Read(buf)
sum+=n
if err== ...
Go操作Redis
简介
Remote Dictionary Server, 翻译为远程字典服务, Redis是一个完全开源的基于Key-Value的NoSQL存储系统,他是一个使用ANSIC语言编写的,遵守BSD协议,支持网络、可基于内存的可持久化的日志型、Key-Value数据库,并提供多种语言的API.
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash) ...
Go语言如何将json时间格式化为dateime格式
目录问题一、示例:原生time.Time的json输出为UTC格式二、自定义结构体Datetime(缺点是需要手动转换类型)三、自定义结构体Datetime+自定义临时结构体(最佳方案)
问题
我们知道go语言的time.Time类型在转为json的时候,输出的是UTC的时间,而我们绝大部分时候使用的都是Datetime格式。
其实解决问题的核心就是使用自定义 ...
Go操作Elasticsearch
安装ES
拉取es到本地
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.3.0
创建一个网络
docker network create esnet
启动容器
docker run --name es -p 9200:9200 -p 9300:9300 --network esnet -e "discovery.type=single-node" bdaab402b220
安装ElisticHD
docker run -p 9800:9800 -d --link es:de ...
go操作elasticsearch
简介:
es包地址:https://github.com/olivere/elastic/ 这个版本被广泛使用,我们也用这个。
注意:es版本不同,要导入不同的包。6.0版本导入“github.com/olivere/elastic”
连接es:
var host = "http://xxx.com:9201"
func es_init() {
client, err := elastic.NewClient(
elastic.SetURL(hos ...
Go RPCX学习:快速入门
RPCX的产生
rpcx是一个类似阿里巴巴 Dubbo 和微博 Motan 的分布式的RPC服务框架,基于Golang net/rpc实现。
谈起分布式的RPC框架,比较出名的是阿里巴巴的dubbo,包括由当当网维护的dubbox。不知道dubbo在阿里的内部竞争中败给了HSF,还是阿里有意将其闭源了,官方的代码使用的spring还停留在2.5.6.SEC0 ...
go操作redis
golang操作redis主要有两个库,go-redis和redigo。两者操作都比较简单,区别上redigo更像一个client执行各种操作都是通过Do函数去做的,redis-go对函数的封装更好,相比之下redigo操作redis显得有些繁琐。但是官方更推荐redigo,所以项目中我使用了redigo。
redigo的使用入门可以去查godoc:http://godoc.org/github.com/ga ...
go template使用
以text/template为例, 而html/template的接口与前者一样,不再缀述。
模板文件一般由.tmpl或.tpl为后缀。
一些名词
dot:用表示.,相当于一个变量,保存着传进来的值,可以改变
pipeline:从字面上看,有点像管道|,但从文档上看,实际上指的是一切取值操作,包括{{ . }}、{{ $name }},而|与unix中的一样:作为函数的最 ...