项目进行中
本仓库旨在提供面向Go-Micro生产环境的快速开发包。
- 快速开始示例
- 控制台示例
- 以最常见的登录流程为例,实现一个场景简单,但包含微服务各种治理能力的示例
Hipster Shop示例- 参考GoogleCloudPlatform/microservices-demo实现一个业务场景比较复杂的微服务应用
- 暂时放弃这个目标,继续以 console 为例增加更多特性进来
- 控制台示例
- 架构设计
- 目录结构
- 目标功能
- 开发环境
- 部署环境
- 参与贡献
领域模型&整洁架构参考
├── console 控制台示例
│ ├── account go.micro.srv.account,Account服务
│ │ ├── domain 领域
│ │ │ ├── model 模型
│ │ │ ├── repository 存储接口
│ │ │ │ └── persistence ①存储接口实现
│ │ │ └── service 领域服务
│ │ ├── interface 接口
│ │ │ ├── handler micro handler接口
│ │ │ └── persistence ②存储接口实现
│ │ ├── registry 依赖注入,根据使用习惯,一般Go中不怎么喜欢这种方式
│ │ └── usecase 应用用例
│ │ ├── event 消息事件
│ │ └── service 应用服务
│ ├── api go.micro.api.console,API服务
│ ├── pb 服务协议统一.proto
│ └── web go.micro.api.console,Web服务,集成gin、echo、iris等web框架
├── deploy 部署
│ ├── docker
│ └── k8s
├── doc 文档资源
├── gateway 网关,自定义micro
└── pkg 公共资源包
- 自定义micro网关
-
JWT
认证 -
Casbin
鉴权 - Tracing
- Opentracing
- TraceID micro/go-plugins/micro/trace/uuid
- Metrics
- Access Log
- ...
-
- API服务
- 网关使用默认处理器(
handler=meta
),聚合服务通过Endpoint
定义路由规则,实现统一网关管理rpc
和http
类型的聚合服务- 注:
go-micro/web
服务注册不支持Endpoint
定义,需要自定义web.Service
(实现参考),issue#1097
- 注:
- api
- rpc
- proxy/http/web
- API文档
- swagger
- 使用grpc-ecosystem/grpc-gateway的
protoc-gen-swagger
生成swagger文档,适用于APIhandler=rpc
的模式,因为文档生成是将 proto 中的 request 和 response 做映射,像handler=api
是没有接口的实际定义的,所以无法在文档中反应接口信息 - 示例
- 使用grpc-ecosystem/grpc-gateway的
- swagger
- 网关使用默认处理器(
- 配置中心
- XConf
- 前后端分离
console
- 参数验证
- protoc-gen-validate,适用于API
handler=rpc
的模式,以及普通srv
服务- 规则配置account.proto
- 参数验证account.go
server.HandlerWrapper
和client.CallWrapper
自动参数验证wrapper/validate
- protoc-gen-validate,适用于API
- 领域驱动
- 整洁架构
- ORM
- 发布
- 灰度
- 蓝绿
- 注:由于 micro 默认的 api 和 web 网关均不支持服务筛选,需要自己改造,方案参考微服务协作开发、灰度发布之流量染色,此方案仅适用于测试,具体 asim 在 PR#1388 给了反馈,但可以自定义 Router 实现
- 自定义 Router 实现网关对服务筛选的支持,因为 micro 有 internal 库所以需要在 micro 内实现,参考我 fork 的分支版本 hb-chen/micro/gateway,gateway 模块使用的便是此方案,可以快速实现流量染色
- 部署
- 安全
- CICD
- 基础服务
- 日志收集
- Fluentbit + Elasticsearch
- docker-compose
- Kubernetes
- Fluentbit + Elasticsearch
- 监控告警
- Prometheus
- Grafana
- Tracing
- Jaeger
- 日志收集
- ...
- 本地
- 在线
- CICD
- Drone
- Kubernetes
- 本地服务接入
- Docker环境
- K8S环境
- CICD
本地服务接入-Network代理
Network代理测试
以console
的docker-compose.yaml为例,假设compose
为在线环境,本地开发account
服务。
compose
中加入network
服务,参考docker-compose-network.ymlapi
服务使用network
做代理MICRO_PROXY=go.micro.network
,注意测试时compose
中仅api
服务使用代理- 本地启动
network
micro --registry=etcd --transport=tcp network --nodes=127.0.0.1:8085 --address=:8086 --advertise_strategy=local
- 剩下的工作使用
proxy
对route
的筛选功能,参考PR#897- 查看本地
router
,micro --registry=etcd --transport=tcp network routes
curl -XPOST -H "Micro-Router: 6832f8ff-1217-4119-8a56-9a90adf19fef" -d '{"username" : "admin","password":"123456"}' http://localhost:8080/account/login
- 查看本地
真实场景
- 考虑所有服务都可以自助路由到本地,不能直接使用
Micro-Router
(因为Micro-Router
会在全链路生效),可以自定义header
来定义router
筛选的应用范围,通过Client/Call Wrap
实现,参考实现router_filter - 要做到
api
服务可以路由筛选,在网关层与流量染色有相同的问题,不支持服务筛选,导致的代理服务被忽略,需要去掉SelectOption
- 另一个方案是在本地开
micro api
+聚合服务
,聚合服务再通过network
代理访问线上服务,可以满足一般场景的需求
- 另一个方案是在本地开
- 网关及服务全部使用
network
做代理
# api服务路由到本地
curl -XPOST -H "X-Micro-Router-Filter: go.micro.api.console:6832f8ff-1217-4119-8a56-9a90adf19fef" -d '{"username" : "admin","password":"123456"}' http://localhost:8080/account/login
# account服务理由到本地
curl -XPOST -H "X-Micro-Router-Filter: go.micro.srv.account:6832f8ff-1217-4119-8a56-9a90adf19fef" -d '{"username" : "admin","password":"123456"}' http://localhost:8080/account/login
# api和account服务都路由到本地
curl -XPOST -H "X-Micro-Router-Filter: go.micro.api.console:6832f8ff-1217-4119-8a56-9a90adf19fef;go.micro.srv.account:6832f8ff-1217-4119-8a56-9a90adf19fef" -d '{"username" : "admin","password":"123456"}' http://localhost:8080/account/login
Jaeger
浏览器访问:http://localhost:16686/
$ docker run -d --name=jaeger -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p5775:5775/udp -p6831:6831/udp -p6832:6832/udp -p5778:5778 -p16686:16686 -p14268:14268 -p9411:9411 jaegertracing/all-in-one:latest
Prometheus
浏览器访问:http://localhost:9090/
prometheus.yml
参考gateway
插件`metrics/prometheus.yml
$ docker run -d --name prometheus -p 9090:9090 -v ~/tmp/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
Grafana
浏览器访问:http://localhost:3000/
Grafana
仪表盘import
metrics/grafan.json
$ docker run --name grafana -d -p 3000:3000 grafana/grafana
- IDE IDEA/Goland,
Go->imports
设置- Sorting type
gofmt
-
Group stdlib imports
-
Move all stdlib imports in a single group
-
-
Move all imports in a single declaration
- Sorting type