# starter-kit
**Repository Path**: micro-community/starter-kit
## Basic Information
- **Project Name**: starter-kit
- **Description**: No description available
- **Primary Language**: Go
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2020-04-15
- **Last Updated**: 2023-04-11
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Micro 快速开发工具包
> *项目进行中*
本仓库旨在提供面向Go-Micro生产环境的快速开发包。
## 目录
- 快速开始示例
- [控制台示例](/console#目录)
- 以最常见的登录流程为例,实现一个场景简单,但包含微服务各种治理能力的示例
- [Hipster Shop示例](/hipstershop)
- 参考[GoogleCloudPlatform/microservices-demo](https://github.com/GoogleCloudPlatform/microservices-demo/)实现一个业务场景比较复杂的微服务应用
- [架构设计](#架构设计)
- [目录结构](#目录结构)
- [目标功能](#目标功能)
- [开发环境](#开发环境)
- [部署环境](#部署环境)
- [参与贡献](#参与贡献)
## 架构设计
### 系统架构图
### 业务架构图
**[Console示例](/console)**
- [Hipster Shop示例](/hipstershop)
- 参考[GoogleCloudPlatform/microservices-demo](https://github.com/GoogleCloudPlatform/microservices-demo/)
**领域模型&整洁架构参考**
- [Clean Architecture in go](https://medium.com/@hatajoe/clean-architecture-in-go-4030f11ec1b1)
- [基于 DDD 的微服务设计和开发实战](https://www.infoq.cn/article/s_LFUlU6ZQODd030RbH9)
- [当中台遇上 DDD,我们该如何设计微服务?](https://www.infoq.cn/article/7QgXyp4Jh3-5Pk6LydWw)
## 目录结构
```bash
├── 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网关](gateway)
- [x] `JWT`认证
- [x] `Casbin`鉴权
- Tracing
- [x] Opentracing
- [x] TraceID [micro/go-plugins/micro/trace/uuid](https://github.com/micro/go-plugins/tree/master/micro/trace/uuid)
- [x] Metrics
- [ ] Access Log
- ...
- API服务
- 网关使用默认处理器(`handler=meta`),聚合服务通过`Endpoint`定义路由规则,实现统一网关管理`rpc`和`http`类型的聚合服务
- *注:`go-micro/web`服务注册不支持`Endpoint`定义,需要自定义`web.Service`([实现参考](https://github.com/hb-go/micro-plugins/tree/master/web)),[issue#1097](https://github.com/micro/go-micro/issues/1097)*
- [x] api
- [x] rpc
- proxy/http/web
- [x] [静态资源](/console/web/statik)
- *前后端分离场景将静态资源独立更好,但不排除使用Web模板框架的应用加入微服务体系,尤其在已有单体逐步拆分的演进过程中*
- [x] [echo](/console/web/echo)
- [x] [gin](/console/web/gin)
- [x] [iris](/console/web/iris)
- [x] [beego](/console/web/beego)
- API文档
- [x] swagger
- *使用[grpc-ecosystem/grpc-gateway](https://github.com/grpc-ecosystem/grpc-gateway)的`protoc-gen-swagger`生成swagger文档,适用于API`handler=rpc`的模式*
- [示例](/console#Swagger文档生成)
- 配置中心
- [ ] XConf
- 前后端分离`console`
- [x] [PanJiaChen/vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)
- [示例](/console/web/vue)
- [ ] [tookit/vue-material-admin](https://github.com/tookit/vue-material-admin)
- [ ] [view-design/iview-admin](https://github.com/view-design/iview-admin)
- 参数验证
- [x] [protoc-gen-validate](https://github.com/envoyproxy/protoc-gen-validate),适用于API`handler=rpc`的模式
- 规则配置[account.proto](/console/pb/api/account.proto#L21)
- 参数验证[account.go](/console/api/handler/account.go#L26)
- 领域驱动
- [x] 整洁架构
- 示例[console/account](/console/account)
- ORM
- [x] gorm
- [示例](/console/account/domain/repository/persistence/gorm)
- [x] xorm
- [示例](/console/account/domain/repository/persistence/xorm)
- 发布
- [x] 灰度
- [x] 蓝绿
- *注:由于 micro 默认的 api 和 web 网关均不支持**服务筛选**,需要自己改造,方案参考[微服务协作开发、灰度发布之流量染色](https://micro.mu/blog/cn/2019/12/09/go-micro-service-chain.html)*
- 自定义 Router 实现网关对服务筛选的支持,因为 micro 有 internal 库所以需要在 micro 内实现,参考我 fork 的分支版本 [hb-chen/micro/gateway](https://github.com/hb-chen/micro/tree/gateway-2.4.0/gateway),[gateway](gateway) 使用的便是此方案,可以快速实现流量染色
- 部署
- K8S
- [x] [helm](/deploy/k8s/helm)
- [x] Docker
- 示例[console](/console/docker-compose.yml)
- 安全
- CICD
- [Drone](https://drone.io/) [README](/deploy/docker/drone)
- [x] Go & Node编译
- [x] Docker镜像
- [x] Kubernetes发布
- [x] 缓存
- [ ] Jenkins
- 基础服务
- [ ] 日志收集
- `stdout`标准输出
- `log.file`日志文件
- [log-pilot](https://github.com/AliyunContainerService/log-pilot)
- [ ] 监控告警
- Prometheus
- Grafana
- [ ] Tracing
- Jaeger
- ...
## 开发环境
- 本地
- [x] [Docker Compose](/console#docker-compose启动)
- 在线
- [x] CICD
- [x] Drone
- [x] Kubernetes
- [x] 本地服务接入
- [x] Docker环境
- [ ] K8S环境
### 本地服务接入-Network代理
本地服务接入-Network代理
**Network代理测试**
以`console`的[docker-compose.yaml](/console/docker-compose.yml)为例,假设`compose`为在线环境,本地开发`account`服务。
- `compose`中加入`network`服务,参考[docker-compose-network.yml](/console/docker-compose-network.yml)
- `api`服务使用`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](https://github.com/micro/go-micro/pull/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](/pkg/plugin/wrapper/client/router_filter)
- 要做到`api`服务可以路由筛选,在网关层与[流量染色](https://micro.mu/blog/cn/2019/12/09/go-micro-service-chain.html)有相同的问题,不支持**服务筛选**,导致的代理服务被忽略,需要去掉`SelectOption`
- 另一个方案是在本地开`micro api` + `聚合服务`,聚合服务再通过`network`代理访问线上服务,可以满足一般场景的需求
- 网关及服务全部使用`network`做代理
```shell script
# 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
```
## 生产环境
[Kubernetes环境](/deploy/k8s)
## 可选服务
Jaeger
> 浏览器访问:http://localhost:16686/
```bash
$ 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](/gateway/plugin/metrics/prometheus.yml)
```bash
$ 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](/gateway/plugin/metrics/grafan.json)
```bash
$ docker run --name grafana -d -p 3000:3000 grafana/grafana
```
## 参与贡献
### 代码格式
- IDE IDEA/Goland,`Go->imports` 设置
- Sorting type `gofmt`
- [x] `Group stdlib imports`
- [x] `Move all stdlib imports in a single group`
- [x] `Move all imports in a single declaration`