项目作者: hwholiday

项目描述 :
Go 学习、Go 进阶、Go 实用工具类、Go-kit ,Go-Micro 微服务实践、Go 推送
高级语言: Go
项目地址: git://github.com/hwholiday/learning_tools.git
创建时间: 2018-06-14T13:14:38Z
项目社区:https://github.com/hwholiday/learning_tools

开源协议:Apache License 2.0

下载


LEARNING_TOOLS

博客: hwholiday

  • 🤪 golang 基础,微服务,架构,web,k8s,DDD 各种工具任君取用
  • 📫 contact me: WECHAT HW_loner
  • 📫 contact me: QQ 3355168235

go-kit 微服务实践,从入门到精通

go-kit 系列文章归档地址 (详细介绍)

1: v1 go-kit 微服务 基础使用 (HTTP)
2: v2 go-kit 微服务 添加日志(user/zap ,并为每个请求添加UUID)
3: v3 go-kit 微服务 身份认证 (JWT)
4: v4 go-kit 微服务 限流 (uber/ratelimit 和 golang/rate 实现)
5: v5 go-kit 微服务 使用GRPC(并为每个请求添加UUID)
6: v6 go-kit 微服务 服务注册与发现(etcd实现)
7: v7 go-kit 微服务 服务监控(prometheus 实现)
8: v8 go-kit 微服务 服务熔断(hystrix-go 实现)
9: v9 go-kit 微服务 服务链路追踪(jaeger 实现)(1)
10: v10 go-kit 微服务 服务链路追踪(jaeger 实现)(2)
11: v11 go-kit 微服务 日志分析管理 (ELK + Filebeat)

用 go 实现的高性能长连接网络库

dove 用 go 实现的高性能长连接网络库 https://github.com/hwholiday/ghost

gRPC负载均衡(自定义负载均衡策略—etcd 实现)

hlb-grpc (gRPC负载均衡(自定义负载均衡策略—etcd 实现)

实现基于版本(version)的grpc负载均衡器,了解过程后可自己实现更多的负载均衡功能

详细介绍

  • 注册中心
    • Etcd Lease 是一种检测客户端存活状况的机制。 群集授予具有生存时间的租约。 如果etcd 群集在给定的TTL 时间内未收到keepAlive,则租约到期。 为了将租约绑定到键值存储中,每个key 最多可以附加一个租约
  • 服务注册 (注册服务)
    • 定时把本地服务(APP)地址,版本等信息注册到服务器
  • 服务发现 (客户端发起服务解析请求(APP))
    • 查询注册中心(APP)下有那些服务
    • 并向所有的服务建立HTTP2长链接
    • 通过Etcd watch 监听服务(APP),通过变化更新链接
  • 负载均衡 (客户端发起请求(APP))
    • 负载均衡选择合适的服务(APP HTTP2长链接)
    • 发起调用
  1. ├── discovery
  2. ├── customize_balancer.go
  3. ├── discovery.go
  4. └── options.go
  5. ├── example
  6. ├── api
  7. └── api.pb.go
  8. ├── api.proto
  9. ├── client_test.go
  10. └── server.go
  11. └── register
  12. ├── options.go
  13. ├── register.go
  14. └── register_test.go

仿微信 auth2 授权登陆 DDD(领域设计驱动)+ 六边形架构

OAuth 2.0-授权码模式(authorization code)仿微信设计(战略篇)

OAuth 2.0-授权码模式(authorization code)仿微信设计(战术篇)

AUTH2 代码地址

Golang DDD 的项目分层结构(六边形架构)

DDD (DDD 项目分层结构)

  1. ├── cmd 存放 main.go
  2. ├── adapter
  3. ├── grpc
  4. └── http
  5. └── facade 引用其他微服务(接口防腐层)
  6. ├── application
  7. ├── assembler 负责将内部领域模型转化为可对外的DTO
  8. └── cqe CommandQueryEvent -- 入参
  9. └── dto Application层的所有接口返回值为DTO -- 出参
  10. └── service 负责业务流程的编排,但本身不负责任何业务逻辑
  11. ├── domain
  12. ├── aggregate 聚合
  13. ├── entity 实体
  14. ├── event 事件
  15. ├── publish
  16. └── subsctibe
  17. ├── repo 接口
  18. └── specification 统一封装查询
  19. ├── service 领域服务
  20. └── vo 值对象
  21. └── infrastructure
  22. ├── config 配置文件
  23. ├── pkg 常用工具类封装(DB,log,tool等)
  24. └── repository
  25. ├── converter domain内对象转化 do {互转}
  26. └── do 数据库映射对象
  27. └── types 封装自定义的参数类型,例如 phone 自校验参数

封装 zap 日志注入 trace 信息 Trace Id(内含 gin 例子)

hlog (源码地址)

  • 实现自动切割文件 (基于 lumberjack 实现)
  • 实现可传递 trace 信息 (基于 Context 实现)
  1. {"level":"info","ts":1639453661.4718382,"caller":"example/main.go:36","msg":"hconf example success"}
  2. {"level":"info","ts":1639453664.7402327,"caller":"example/main.go:19","msg":"AddTraceId success","traceId":"68867b89-c949-45a4-b325-86866c9f869a"}
  3. {"level":"info","ts":1639453664.7402515,"caller":"example/main.go:32","msg":"test","traceId":"68867b89-c949-45a4-b325-86866c9f869a"}
  4. {"level":"debug","ts":1639453664.7402549,"caller":"example/main.go:33","msg":"test","traceId":"68867b89-c949-45a4-b325-86866c9f869a"}

hconfig 插拔式配置读取工具可动态加载

  • 支持 etcd
  • 支持 kubernetes
  • 支持 apollo

    使用文档

    hconfig 配置不同的源

  1. //etcd
  2. cli, err := clientv3.New(clientv3.Config{
  3. Endpoints: []string{"127.0.0.1:2379"},})
  4. c, err := etcd.NewEtcdConfig(cli,
  5. etcd.WithRoot("/hconf"),
  6. etcd.WithPaths("app", "mysql"))
  7. //kubernetes
  8. cli, err := kubernetes.NewK8sClientset(
  9. kubernetes.KubeConfigPath("/home/app/conf/kube_config/local_kube.yaml"))
  10. c, err := kubernetes.NewKubernetesConfig(cli,
  11. kubernetes.WithNamespace("im"),
  12. kubernetes.WithPaths("im-test-conf", "im-test-conf2"))
  13. //apollo
  14. c, err := apollo.NewApolloConfig(
  15. apollo.WithAppid("test"),
  16. apollo.WithNamespace("test.yaml"),
  17. apollo.WithAddr("http://127.0.0.1:32001"),
  18. apollo.WithCluster("dev"),
  19. )

hconfig 使用

  1. conf, err := NewHConfig(
  2. WithDataSource(c),//c 不同的源
  3. )
  4. // 加载配置
  5. conf.Load()
  6. //读取配置
  7. val, err := conf.Get("test.yaml")
  8. t.Logf("val %+v\n", val.String())
  9. //监听配置变化
  10. conf.Watch(func(path string, v HVal) {
  11. t.Logf("path %s val %+v\n", path, v.String())
  12. })

go_push 一个实用的消息推送服务

go_push (推送服务)

  1. ```base
  2. ├── gateway // 长连接网关服务器
  3. │ ├── push_job.go // 分发任务
  4. │ ├── room.go // 房间,可作为某一类型的推送管理中心
  5. │ ├── room_manage.go // 房间管理
  6. │ ├── ws_conn.go // 简单封装的websocket方法
  7. │ ├── ws_handle.go // 处理websocket协议方法
  8. │ └── ws_server.go // websocket服务
  9. ├── logic //逻辑服务器
  10. │ ├── http_handle.go // 推送,房间相关
  11. │ └── http_server.go // http服务
  12. └── main.go
  13. ```

HConf (基于etcd与viper的高可用配置中心)

  • 可使用远程与本地模式
  • 本地有的配置远程没有会自动把本地配置传到远程(基于key)
  • 远程有的配置本地没有也会写一份到本地(退出程序会把远程配置写一份到本地)
  • 远程模式配置可以动态加载
  • 如远程连接不上会使用本地配置启动作为兜底
  1. var conf = Conf{}
  2. r, err := NewHConf(
  3. SetWatchRootName([]string{"/gs/conf"}),
  4. )
  5. if err != nil {
  6. t.Error(err)
  7. return
  8. }
  9. t.Log(r.ConfByKey("/gs/conf/net", &conf.Net))
  10. t.Log(r.ConfByKey("/gs/conf/net2222", &conf.Net2))
  11. t.Log(r.ConfByKey("/gs/conf/net3333", &conf.Net3))
  12. if err := r.Run(); err != nil {
  13. t.Error(err)
  14. return
  15. }
  16. t.Log(conf)
  17. t.Log(r.Close())

timezonefinder

  1. 1: 通过时区获取当前国家码和大洲码
  2. 2: Country to Continent Mapping
  3. 3: Timezone to Country Mapping

HEvent (基于channel )

  1. 1: 基于channel的简单事件订阅发布

设计模式

  1. 1: 并发设计模式之Active Object
  2. 2: Go 实现的责任链模式

micro_agent (micro微服务)

  1. 1: base 基础方法
  2. 2: conf 配置文件
  3. 3handler 对外处理方法
  4. 4model 数据格式
  5. 5proto protobuf 文件

all_packaged_library 里面封装了一些常用的库,有详细的介绍,持续更新

  1. 1: base 里面封装mysqlredismgominio文件储存库S3协议,雪花算法,退出程序方法,redis全局锁,日志库等(插件形式可单独引用)
  2. 2: logtool uber_zap日志库封装,可自动切分日志文件,压缩文件
  3. 3: perf ppoof小插件
  4. 4: push 集成苹果推送,google推送,华为推送
  5. 5: quit 优雅的退出程序
  6. 6: registrySelector 基于etcd实现的服务注册,发现,负载均衡

docker (为你的服务插上docker_compose翅膀)

  1. 1: docker 为你的服务插上docker_compose翅膀

kafka (分布式消息发布订阅系统)

  1. 1: main 消息队列

NATS_streaming (分布式消息发布订阅系统—是由NATS驱动的数据流系统)

  1. 1: main 消息队列

nsq (分布式实时消息平台)

  1. 1: main 消息队列

grpc (grpc学习)

  1. 1: bidirectional_streaming_rpc 双向流grpc
  2. 2: server_side_streaming_rpc 服务端流grpc,也可以写成客户端流grpc
  3. 3: simple_rpc 简单grpc

rpc (rpc学习)

  1. 1: main rpc学习

prometheus (监控报警系统)

  1. 1: server Prometheus监控报警系统

jaeger (jaeger分布式链路追踪)

  1. 1: main jaeger分布式链路追踪

service_load_balancing (负载均衡)

  1. 1: fisher_yates_test 添加fisher-yates算法 负载均衡节点

hystrix (熔断)

  1. 1: hystrix 学习并使用熔断(Hystrix

req_limit (限流)

  1. 1: main 使用带缓存的channel实现限流
  2. 2: uber_ratelimit 使用uber_ratelimit实现限流

ini (配置文件库)

  1. 1: main 配置文件ini的读取,以及自动匹配到结构体里面

minio (对象存储服务)

  1. 1: minio 对象存储服务使用

mysql (mysql服务器)

  1. 1: main 简单的mysql使用

redis (redis相关)

  1. 1: bloom_filter redis 实现BloomFilter过滤器
  2. 2: lock redis实现全局锁
  3. 3: pipeline redis事务
  4. 4: subscription redis发布订阅

mongodb (mongodb服务器)

  1. 1: mgo.v2 mgo.v2库的基础使用学习
  2. 2: mongo-go-driver 官方库的demo,以及事务提交(不能是单节点)

gin (web框架gin学习)

  1. 1: mvc 模式,swagger文档 可作为基础学习gin

jwt (JSON WEB TOKEN)

  1. 1: jwt 学习使用

snow_flake (雪花算法)

  1. 1: main 雪花算法

encryption_algorithm (双棘轮算法, KDF链,迪菲-赫尔曼棘轮,x3dh)

  1. 1: aes ase-(cfb,cbc,ecb)-(128,192,256)加解密方法
  2. 2: curve25519 椭圆曲线算法
  3. 3: 3curve25519 双棘轮算法,KDF

LRU (缓存淘汰算法)

  1. 1: list lru 缓存淘汰算法

tcp (tcp协议实现)

  1. 1: 实现网络库,封包,解包 len+tag+data 模式

websocket (websocket协议实现)

  1. 1: 实现网络库

binary_conversion (进制转换)

  1. 1: 10to36 10进制转36进制
  2. 2: 10to62 10进制转62进制
  3. 3: 10to76 10进制转76进制
  4. 4: binary 用一个int64来描述开关(用户设置很多建议使用)

job_worker_mode (job_worker模式)

  1. 1: worker job_worker模式,可提高系统吞吐量

filewatch (监控文件变化)

  1. 1: main 监控文件变化 可实现自动构建

prometheus (普罗米修斯)

  1. 1: main 普罗米修斯

goquery (网页解析工具)

  1. 1: main 可以作为爬虫解析网页使用

active_object (并发设计模式)

  1. 1: active_object Go并发设计模式之Active Object

heap (优先级队列)

  1. 1: heap 利用heap创建一个优先级队列

cli (go命令行交互)

  1. 1: main go命令行交互

context (context包学习)

  1. 1: main context包学习

err (error 相关)

  1. 1: main golang 1.13 error 相关

interface (interface包学习)

  1. 1: main interface包学习
  2. 2: middleware Golang 基于interface 实现中间件

syncPool (syncPool包学习)

  1. 1: main syncPool包学习

reflect (reflect包学习)

  1. 1: main reflect包学习

slog (slog包学习)

  1. 1: main slog包学习