{"id":13575649,"url":"https://github.com/hwholiday/learning_tools","last_synced_at":"2025-05-13T20:13:08.041Z","repository":{"id":37432414,"uuid":"137360315","full_name":"hwholiday/learning_tools","owner":"hwholiday","description":"Go 学习、Go 进阶、Go 实用工具类、Go DDD 项目落地、Go-kit 、Go-Micro 、Go 推送平台、微服务实践","archived":false,"fork":false,"pushed_at":"2024-12-30T16:13:13.000Z","size":848,"stargazers_count":3985,"open_issues_count":0,"forks_count":703,"subscribers_count":53,"default_branch":"master","last_synced_at":"2025-04-28T10:58:01.664Z","etag":null,"topics":["aes","auth2","ddd-example","discovery","gin","go-kit","golang","jwt","micro","minio","mongodb","prometheus","push","redis","rpc-grpc","signal-protocol","tcp-socket","x3dh","zap"],"latest_commit_sha":null,"homepage":"https://www.hwholiday.com/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hwholiday.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-06-14T13:14:38.000Z","updated_at":"2025-04-28T09:59:39.000Z","dependencies_parsed_at":"2023-11-09T13:38:29.729Z","dependency_job_id":"a4dec3f2-a0fc-4443-9a4f-0718f1d8cd5f","html_url":"https://github.com/hwholiday/learning_tools","commit_stats":{"total_commits":569,"total_committers":5,"mean_commits":113.8,"dds":"0.061511423550087874","last_synced_commit":"a23575331a866f60a7547dbd3424aa9034b31c77"},"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hwholiday%2Flearning_tools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hwholiday%2Flearning_tools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hwholiday%2Flearning_tools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hwholiday%2Flearning_tools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hwholiday","download_url":"https://codeload.github.com/hwholiday/learning_tools/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254020616,"owners_count":22000755,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aes","auth2","ddd-example","discovery","gin","go-kit","golang","jwt","micro","minio","mongodb","prometheus","push","redis","rpc-grpc","signal-protocol","tcp-socket","x3dh","zap"],"created_at":"2024-08-01T15:01:02.937Z","updated_at":"2025-05-13T20:13:03.022Z","avatar_url":"https://github.com/hwholiday.png","language":"Go","readme":"#  LEARNING_TOOLS\n## 博客: [hwholiday](https://www.hwholiday.com/posts/)\n- 🤪 golang 基础，微服务，架构，web，k8s,DDD 各种工具任君取用\n- 📫 contact me: WECHAT HW_loner\n- 📫 contact me: QQ 3355168235\n\n\n\n\n\n# go-kit 微服务实践，从入门到精通\n\n### [go-kit 系列文章归档地址](https://github.com/hwholiday/learning_tools/tree/master/go-kit) (详细介绍)\n\n1:  [v1 go-kit 微服务 基础使用 （HTTP）](https://www.hwholiday.com/2019/go_kit_v1/)  \n2:  [v2 go-kit 微服务 添加日志（user/zap ,并为每个请求添加UUID）](https://www.hwholiday.com/2020/git_kit_v2/)   \n3:  [v3 go-kit 微服务 身份认证 （JWT）](https://www.hwholiday.com/2020/go_kit_v3/)  \n4:  [v4 go-kit 微服务 限流 （uber/ratelimit 和 golang/rate 实现）](https://www.hwholiday.com/2020/go_kit_v4/)  \n5:  [v5 go-kit 微服务 使用GRPC（并为每个请求添加UUID）](https://www.hwholiday.com/2020/go_kit_v5/)   \n6:  [v6 go-kit 微服务 服务注册与发现（etcd实现）](https://www.hwholiday.com/2020/go_kit_v6/)  \n7:  [v7 go-kit 微服务 服务监控（prometheus 实现）](https://www.hwholiday.com/2020/go_kit_v7/)  \n8:  [v8 go-kit 微服务 服务熔断（hystrix-go 实现）](https://www.hwholiday.com/2020/go_kit_v8/)  \n9:  [v9 go-kit 微服务 服务链路追踪（jaeger 实现）(1)](https://www.hwholiday.com/2020/go_kit_v9/)  \n10: [v10 go-kit 微服务 服务链路追踪（jaeger 实现）(2)](https://www.hwholiday.com/2020/go_kit_v10/)  \n11: [v11 go-kit 微服务 日志分析管理 （ELK + Filebeat）](https://www.hwholiday.com/2020/go_kit_v12/)  \n\n# 用 go 实现的高性能长连接网络库\n\n### [dove](https://github.com/hwholiday/ghost)  用 go 实现的高性能长连接网络库  https://github.com/hwholiday/ghost\n\n# gRPC负载均衡（自定义负载均衡策略--etcd 实现）\n\n### [hlb-grpc](https://github.com/hwholiday/learning_tools/tree/master/hlb-grpc) (gRPC负载均衡（自定义负载均衡策略--etcd 实现)\n\n##### 实现基于版本（version）的grpc负载均衡器，了解过程后可自己实现更多的负载均衡功能\n\n### [详细介绍](https://www.hwholiday.com/2021/etcd_grpc/)\n\n+ 注册中心\n    - Etcd Lease 是一种检测客户端存活状况的机制。 群集授予具有生存时间的租约。 如果etcd 群集在给定的TTL 时间内未收到keepAlive，则租约到期。 为了将租约绑定到键值存储中，每个key 最多可以附加一个租约\n+ 服务注册 (注册服务)\n    - 定时把本地服务（APP）地址,版本等信息注册到服务器\n+ 服务发现 (客户端发起服务解析请求（APP）)\n    - 查询注册中心（APP）下有那些服务\n    - 并向所有的服务建立HTTP2长链接\n    - 通过Etcd watch 监听服务（APP），通过变化更新链接\n+ 负载均衡 (客户端发起请求（APP）)\n    - 负载均衡选择合适的服务（APP HTTP2长链接）\n    - 发起调用\n\n```\n├── discovery\n│   ├── customize_balancer.go\n│   ├── discovery.go\n│   └── options.go\n├── example\n│   ├── api\n│   │   └── api.pb.go\n│   ├── api.proto\n│   ├── client_test.go\n│   └── server.go\n└── register\n    ├── options.go\n    ├── register.go\n    └── register_test.go\n\n```\n\n# 仿微信 auth2 授权登陆 DDD（领域设计驱动）+ 六边形架构\n### [OAuth 2.0-授权码模式（authorization code）仿微信设计（战略篇）](https://www.hwholiday.com/2022/auth2_strategy/)\n### [OAuth 2.0-授权码模式（authorization code）仿微信设计（战术篇）](https://www.hwholiday.com/2022/auth2_tactics/)\n\n### [AUTH2 代码地址](https://github.com/hwholiday/learning_tools/tree/master/ddd-auth2-example)\n\n# Golang DDD 的项目分层结构（六边形架构）\n\n### [DDD](https://github.com/hwholiday/learning_tools/tree/master/ddd-project-example) （DDD 项目分层结构）\n\n```base\n├── cmd 存放 main.go 等\n├── adapter\n│   ├── grpc\n│   └── http\n│   └── facade  引用其他微服务（接口防腐层）\n├── application \n│   ├── assembler   负责将内部领域模型转化为可对外的DTO\n│   └── cqe Command、Query和Event --  入参\n│   └── dto Application层的所有接口返回值为DTO -- 出参\n│   └── service 负责业务流程的编排，但本身不负责任何业务逻辑\n├── domain\n│   ├── aggregate 聚合\n│   ├── entity 实体\n│   ├── event 事件\n│   │   ├── publish\n│   │   └── subsctibe\n│   ├── repo 接口\n│   │   └── specification 统一封装查询\n│   ├── service 领域服务\n│   └── vo 值对象\n└── infrastructure\n│   ├── config 配置文件\n│   ├── pkg 常用工具类封装（DB,log,tool等）\n│   └── repository\n│   ├── converter domain内对象转化 do {互转}\n│   └── do 数据库映射对象\n└── types 封装自定义的参数类型,例如 phone 自校验参数        \n```\n\n# 封装 zap 日志注入 trace 信息 Trace Id（内含 gin 例子）\n\n### [hlog](https://github.com/hwholiday/learning_tools/tree/master/hlog) (源码地址)\n\n- 实现自动切割文件 (基于 lumberjack 实现)\n- 实现可传递 trace 信息 （基于 Context 实现）\n\n```base\n{\"level\":\"info\",\"ts\":1639453661.4718382,\"caller\":\"example/main.go:36\",\"msg\":\"hconf example success\"}\n{\"level\":\"info\",\"ts\":1639453664.7402327,\"caller\":\"example/main.go:19\",\"msg\":\"AddTraceId success\",\"traceId\":\"68867b89-c949-45a4-b325-86866c9f869a\"}\n{\"level\":\"info\",\"ts\":1639453664.7402515,\"caller\":\"example/main.go:32\",\"msg\":\"test\",\"traceId\":\"68867b89-c949-45a4-b325-86866c9f869a\"}\n{\"level\":\"debug\",\"ts\":1639453664.7402549,\"caller\":\"example/main.go:33\",\"msg\":\"test\",\"traceId\":\"68867b89-c949-45a4-b325-86866c9f869a\"}\n```\n\n### [hconfig 插拔式配置读取工具可动态加载](https://github.com/hwholiday/learning_tools/tree/master/hconfig)\n- 支持 etcd\n- 支持 kubernetes\n- 支持 apollo\n#### [使用文档](https://www.hwholiday.com/2022/hconfig/)\n#### hconfig  配置不同的源\n\n```base\n//etcd\ncli, err := clientv3.New(clientv3.Config{\n\tEndpoints: []string{\"127.0.0.1:2379\"},})\n\t\nc, err := etcd.NewEtcdConfig(cli,\n\tetcd.WithRoot(\"/hconf\"),\n\tetcd.WithPaths(\"app\", \"mysql\"))\n\n//kubernetes\ncli, err := kubernetes.NewK8sClientset(\n     kubernetes.KubeConfigPath(\"/home/app/conf/kube_config/local_kube.yaml\"))\n     \nc, err := kubernetes.NewKubernetesConfig(cli, \n\tkubernetes.WithNamespace(\"im\"),\n\tkubernetes.WithPaths(\"im-test-conf\", \"im-test-conf2\"))\n\t\n//apollo\nc, err := apollo.NewApolloConfig(\n    apollo.WithAppid(\"test\"),\n    apollo.WithNamespace(\"test.yaml\"),\n    apollo.WithAddr(\"http://127.0.0.1:32001\"),\n    apollo.WithCluster(\"dev\"),\n    )\n```\n\n\n#### hconfig  使用\n\n```base\nconf, err := NewHConfig(\n\tWithDataSource(c),//c 不同的源\n)\n\n// 加载配置\nconf.Load() \n\n//读取配置\nval, err := conf.Get(\"test.yaml\")\nt.Logf(\"val %+v\\n\", val.String())\n\n//监听配置变化\nconf.Watch(func(path string, v HVal) {\n\tt.Logf(\"path %s val %+v\\n\", path, v.String())\n})\n```\n\n# go_push 一个实用的消息推送服务\n\n### [go_push](https://github.com/hwholiday/learning_tools/tree/master/go_push) (推送服务)\n\n    ```base\n    ├── gateway // 长连接网关服务器\n    │   ├── push_job.go    // 分发任务\n    │   ├── room.go        // 房间，可作为某一类型的推送管理中心\n    │   ├── room_manage.go // 房间管理\n    │   ├── ws_conn.go     // 简单封装的websocket方法\n    │   ├── ws_handle.go   // 处理websocket协议方法\n    │   └── ws_server.go   // websocket服务\n    ├── logic  //逻辑服务器    \n    │   ├── http_handle.go // 推送，房间相关\n    │   └── http_server.go // http服务\n    └── main.go\n    ```\n\n### [HConf (基于etcd与viper的高可用配置中心)](https://github.com/hwholiday/learning_tools/tree/master/hconf)\n\n- 可使用远程与本地模式\n- 本地有的配置远程没有会自动把本地配置传到远程（基于key）\n- 远程有的配置本地没有也会写一份到本地(退出程序会把远程配置写一份到本地)\n- 远程模式配置可以动态加载\n- 如远程连接不上会使用本地配置启动作为兜底\n\n```base\nvar conf = Conf{}\nr, err := NewHConf(\n\tSetWatchRootName([]string{\"/gs/conf\"}),\n)\nif err != nil {\n\tt.Error(err)\n\treturn\n}\nt.Log(r.ConfByKey(\"/gs/conf/net\", \u0026conf.Net))\nt.Log(r.ConfByKey(\"/gs/conf/net2222\", \u0026conf.Net2))\nt.Log(r.ConfByKey(\"/gs/conf/net3333\", \u0026conf.Net3))\nif err := r.Run(); err != nil {\n\tt.Error(err)\n\treturn\n}\nt.Log(conf)\nt.Log(r.Close())\n```\n\n### [timezonefinder](https://github.com/hwholiday/learning_tools/tree/master/timezonefinder)\n    1: 通过时区获取当前国家码和大洲码\n    2: Country to Continent Mapping\n    3: Timezone to Country Mapping\n\n### [HEvent (基于channel )](https://github.com/hwholiday/learning_tools/tree/master/hevent)\n    1: 基于channel的简单事件订阅发布\n\n### [设计模式](https://github.com/hwholiday/learning_tools/tree/master/design-patterns)\n    1: 并发设计模式之Active Object\n    2: Go 实现的责任链模式\n\n### [micro_agent](https://github.com/hwholiday/learning_tools/tree/master/micro_agent) (micro微服务)\n\n    1: base 基础方法\n    2: conf 配置文件\n    3：handler 对外处理方法\n    4：model 数据格式\n    5：proto protobuf 文件\n\n### [all_packaged_library](https://github.com/hwholiday/learning_tools/tree/master/all_packaged_library) 里面封装了一些常用的库，有详细的介绍，持续更新\n\n    1: base 里面封装mysql，redis，mgo，minio文件储存库S3协议，雪花算法，退出程序方法，redis全局锁，日志库等（插件形式可单独引用）\n    2: logtool uber_zap日志库封装，可自动切分日志文件，压缩文件\n    3: perf ppoof小插件\n    4: push 集成苹果推送，google推送，华为推送\n    5: quit 优雅的退出程序\n    6: registrySelector 基于etcd实现的服务注册，发现，负载均衡\n\n### [docker](https://github.com/hwholiday/learning_tools/tree/master/docker) (为你的服务插上docker_compose翅膀)\n\n     1: docker 为你的服务插上docker_compose翅膀   \n\n### [kafka](https://github.com/hwholiday/learning_tools/tree/master/kafka) (分布式消息发布订阅系统)\n\n    1: main 消息队列\n\n### [NATS_streaming](https://github.com/hwholiday/learning_tools/tree/master/NATS_streaming) (分布式消息发布订阅系统--是由NATS驱动的数据流系统)\n\n    1: main 消息队列\n\n### [nsq](https://github.com/hwholiday/learning_tools/tree/master/nsq) (分布式实时消息平台)\n\n    1: main 消息队列\n\n### [grpc](https://github.com/hwholiday/learning_tools/tree/master/grpc) (grpc学习)\n\n    1: bidirectional_streaming_rpc 双向流grpc\n    2: server_side_streaming_rpc 服务端流grpc，也可以写成客户端流grpc\n    3: simple_rpc 简单grpc\n\n### [rpc](https://github.com/hwholiday/learning_tools/tree/master/rpc) (rpc学习)\n\n    1: main rpc学习\n\n### [prometheus](https://github.com/hwholiday/learning_tools/tree/master/prometheus) (监控报警系统)\n\n    1: server Prometheus监控报警系统\n\n### [jaeger](https://github.com/hwholiday/learning_tools/tree/master/jaeger) (jaeger分布式链路追踪)\n\n    1: main jaeger分布式链路追踪\n\n### [service_load_balancing](https://github.com/hwholiday/learning_tools/tree/master/service_load_balancing) (负载均衡)\n\n    1: fisher_yates_test  添加fisher-yates算法 负载均衡节点\n\n### [hystrix](https://github.com/hwholiday/learning_tools/tree/master/hystrix) (熔断)\n\n    1: hystrix 学习并使用熔断（Hystrix）\n\n### [req_limit](https://github.com/hwholiday/learning_tools/tree/master/req_limit) (限流)\n\n    1: main 使用带缓存的channel实现限流\n    2: uber_ratelimit 使用uber_ratelimit实现限流       \n\n### [ini](https://github.com/hwholiday/learning_tools/tree/master/ini) (配置文件库)\n\n    1: main 配置文件ini的读取，以及自动匹配到结构体里面\n\n### [minio](https://github.com/hwholiday/learning_tools/tree/master/minio) (对象存储服务)\n\n    1: minio 对象存储服务使用\n\n### [mysql](https://github.com/hwholiday/learning_tools/tree/master/mysql) (mysql服务器)\n\n    1: main 简单的mysql使用\n\n### [redis](https://github.com/hwholiday/learning_tools/tree/master/redis) (redis相关)\n\n    1: bloom_filter redis 实现BloomFilter过滤器\n    2: lock redis实现全局锁\n    3: pipeline redis事务\n    4: subscription redis发布订阅    \n\n### [mongodb](https://github.com/hwholiday/learning_tools/tree/master/mongodb) (mongodb服务器)\n\n    1: mgo.v2  mgo.v2库的基础使用学习\n    2: mongo-go-driver  官方库的demo，以及事务提交（不能是单节点）\n\n### [gin](https://github.com/hwholiday/learning_tools/tree/master/gin) (web框架gin学习)\n\n    1: mvc 模式，swagger文档 可作为基础学习gin\n\n### [jwt](https://github.com/hwholiday/learning_tools/tree/master/jwt) (JSON WEB TOKEN)\n\n    1: jwt 学习使用   \n\n### [snow_flake](https://github.com/hwholiday/learning_tools/tree/master/snow_flake) (雪花算法)\n\n    1: main 雪花算法    \n\n### [encryption_algorithm](https://github.com/hwholiday/learning_tools/tree/master/encryption_algorithm) (双棘轮算法, KDF链,迪菲-赫尔曼棘轮,x3dh)\n\n    1: aes ase-(cfb,cbc,ecb)-(128,192,256)加解密方法\n    2: curve25519 椭圆曲线算法\n    3: 3curve25519 双棘轮算法,KDF链\n\n### [LRU](https://github.com/hwholiday/learning_tools/tree/master/LRU) (缓存淘汰算法)\n\n    1: list lru 缓存淘汰算法 \n\n### [tcp](https://github.com/hwholiday/learning_tools/tree/master/tcp) (tcp协议实现)\n\n    1: 实现网络库，封包，解包 len+tag+data 模式\n\n### [websocket](https://github.com/hwholiday/learning_tools/tree/master/websocket) (websocket协议实现)\n\n    1: 实现网络库\n\n### [binary_conversion](https://github.com/hwholiday/learning_tools/tree/master/tool/binary_conversion) (进制转换)\n\n    1: 10to36 10进制转36进制\n    2: 10to62 10进制转62进制\n    3: 10to76 10进制转76进制\n    4: binary 用一个int64来描述开关（用户设置很多建议使用）       \n\n### [job_worker_mode](https://github.com/hwholiday/learning_tools/tree/master/job_worker_mode) (job_worker模式)\n\n    1: worker job_worker模式，可提高系统吞吐量\n\n### [filewatch](https://github.com/hwholiday/learning_tools/tree/master/filewatch) (监控文件变化)\n\n    1: main 监控文件变化 可实现自动构建\n\n### [prometheus](https://github.com/hwholiday/learning_tools/tree/master/prometheus) (普罗米修斯)\n\n    1: main 普罗米修斯    \n\n### [goquery](https://github.com/hwholiday/learning_tools/tree/master/goquery) (网页解析工具)\n\n    1: main 可以作为爬虫解析网页使用\n\n### [active_object](https://github.com/hwholiday/learning_tools/tree/master/active_object) (并发设计模式)\n\n    1: active_object Go并发设计模式之Active Object\n\n### [heap](https://github.com/hwholiday/learning_tools/tree/master/container/heap) (优先级队列)\n\n    1: heap 利用heap创建一个优先级队列\n\n### [cli](https://github.com/hwholiday/learning_tools/tree/master/cli) (go命令行交互)\n\n    1: main go命令行交互\n\n### [context](https://github.com/hwholiday/learning_tools/tree/master/context) (context包学习)\n\n    1: main context包学习 \n\n### [err](https://github.com/hwholiday/learning_tools/tree/master/err) (error 相关)\n\n    1: main golang 1.13 error 相关\n\n### [interface](https://github.com/hwholiday/learning_tools/tree/master/interface) (interface包学习)\n\n    1: main interface包学习\n    2: middleware Golang 基于interface 实现中间件\n\n### [syncPool](https://github.com/hwholiday/learning_tools/tree/master/syncPool) (syncPool包学习)\n\n    1: main syncPool包学习\n\n### [reflect](https://github.com/hwholiday/learning_tools/tree/master/reflect) (reflect包学习)\n\n    1: main reflect包学习\n### [slog](https://github.com/hwholiday/learning_tools/tree/master/slog) (slog包学习)\n\n    1: main slog包学习\n","funding_links":[],"categories":["Go","资源"],"sub_categories":["教程"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhwholiday%2Flearning_tools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhwholiday%2Flearning_tools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhwholiday%2Flearning_tools/lists"}