go语言的微服务框架众多,有种百家争鸣的味道。在框架选型的时候,难免有点选择困难症。
笔者选取影响力比较高的几种微服务框架(gin、beego等web框架排除在外)进行比较:

框架名

开源时间

官网/主文档

github

github star

go-zero

2020

https://go-zero.dev

https://github.com/zeromicro/go-zero

15.9K

go-kratos

2019

https://go-kratos.dev/

https://github.com/go-kratos/kratos

17.1K

tars-go

2018

https://tarscloud.gitbook.io/tarsdocs/

https://github.com/TarsCloud/TarsGo

3K

dubbo-go

2019

https://dubbo.apache.org/zh/docs/languages/golang/

https://github.com/apache/dubbo-go

3.9K

go-micro

2015

-

https://github.com/asim/go-micro

17.9K

go-kit

2015

-

https://github.com/go-kit/kit

22.7K

jupiter

2020

https://jupiter.douyu.com/

https://github.com/zeromicro/go-zero

3.6K

 

go-zero

go-zero整体上做为一个稍重的微服务框架,提供了微服务框架需要具备的通用能力,同时也只带一部分的强约束,例如针对web和rpc服务需要按照其定义的DSL的协议格式进行定义,日志配置、服务配置、apm配置等都要按照框架定义的最佳实践来走。
社区建设: go-zero已经是CNCF项目,做为一个后起的微服务框架,不得不说在国内社区生态建设和维护上,完美适配国内开源的现状,在微信群、公众号、各种大会等多渠道进行推广,社区也时常有文章指导实践。

go-kratos

go-kratos整体上做为一个轻量级的微服务框架,B站开源项目; web和rpc服务的 DSL协议直接采用protobuf和grpc进行定义,采用wire做依赖注入、自动生成代码 。 框架定位于解决微服务的核心诉求。
社区建设:社区建设和维护上,算是做的中规中矩,官网更新一般,有公众号和微信群问题解答

tarsgo

tarsgo做为tars这个大的C++重量级微服务框架下的go语言服务框架,腾讯开源项目; 对于有个好爹的这个事情,总是喜忧参半的;好处在于很多能力不用从头开始做起,直接依托母体;劣势就是独立性相对较差,要选用这个tarsgo的前提,就是要先选用tars这个大的框架。
社区建设: Tars已经是linux基础会项目,社群上做的还算可以,毕竟tars作为腾讯开源影响力最大的项目之一,有QQ、微信群。

dubbo-go

dubbogo做为dubbo这个大的Java重量级微服务框架下的go语言服务框架,阿里开源项目;优劣基本跟tarsgo一样
社区建设: dubbo已经是apache基础会项目,社群上做的还算可以,有钉钉群。

go-mirco

go-micro是一个轻量级的微服务框架,做为一个在2015年就开源的项目,在当时那个市面上开源的微服务框架稀少的年代,它是为数不多的选择。主要槽点就是作者重心做云服务去啦,相应的社区维护力度较弱。
社区建设:弱

go-kit

go-kit从严格意义上来说,并不能做为一个微服务框架,而应该是一个微服务的工具集,其官方定义上也是这么说,提供各种选项让你自由选择。做为一个在2015年就开源的项目,也是当时很多go项目为数不多的选择之一。
社区建设:弱

jupiter

jupiter做为一个重量级的微服务框架,斗鱼开源项目;整体思路上跟tars和dubbo力图提供一个大一统的框架,更确切的说是一个微服务平台,也带类似tars和dubbo那样的管理控制台,提供各种控制和metric的继承,这也无形中给选用此框架带来了不少代价,tars和dubbo本身是有历史沉淀和大厂背景的,很多腾讯系、阿里系公司会采用。
社区建设:弱,有钉钉群,活跃度不高

 

docker运行mysql,redis,etcd

需要新建三个目录

mkdir mysqlData | mkdir redisData | mkdir etcdData

mysql

镜像名:mysql:latest

docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest

redis

镜像名:redis:latest
docker run -p 6379:6379 --name redis  -v /redisData/:/redisData -d redis:latest redis-server

etcd

镜像名:bitnami/etcd:latest
  # 写到一行
  docker run -d --name etcd-server --network app-tier --publish 2379:2379 --publish 2380:2380 --env ALLOW_NONE_AUTHENTICATION=yes --env ETCD_ADVERTISE_CLIENT_URLS=http://ling11.top:2379 bitnami/etcd:latest

docker run -it --rm --network app-tier --env ALLOW_NONE_AUTHENTICATION=yes bitnami/etcd:latest etcdctl --endpoints http://ling11.top:2379 set /message Hello

o-zero环境搭建常见的坑

  • go版本大于1.16 go get 改为go install
  • sudo vim /etc/profile 添加,然后sudo source /etc/profile;或者把/go/bin 的所有文件拷贝到 /usr/local/go/bin
export PATH=$PATH:$GOPATH/bin
export GOBIN=$GOROOT/bin
  • /usr/local/go/bin 的权限777
sudo chmod 777 /usr/local/go/bin
  • goctl 在命令行窗口下执行,不要再vscode下执行
  • go代理使用
export GOPROXY=https://goproxy.cn/,direct

完整的调用

先启动, 注意启动顺序,先启动transform.rpc再启动API Gateway

go run transform.go -f etc/transform.yaml

go run shorturl.go -f etc/shorturl-api.yaml

测试调用:

# curl -i "http://localhost:8888/shorten?url=http://www.xiaoheiban.cn"
HTTP/1.1 200 OK
Content-Type: application/json
X-Trace-Id: b0e50284f8ea8baf3800c0c1f90457c4
Date: Mon, 17 Jan 2022 09:19:46 GMT
Content-Length: 20

{"shorten":"f35b2a"}
12345678
# curl -i "http://localhost:8888/expand?shorten=f35b2a"
HTTP/1.1 200 OK
Content-Type: application/json
X-Trace-Id: 524f6bdd04e6e11191130fe9d7a17dfa
Date: Mon, 17 Jan 2022 12:21:07 GMT
Content-Length: 34

{"url":"http://www.xiaoheiban.cn"}

DDD和DTO

DDD:领域驱动开发(Domain Drive Design)

DDD指的是Domain Drive Design,也就是领域驱动开发,DDD实际上也是建立在这个基础之上,因为它关注的是Service层的设计着重于业务的实现,将分析和设计结合起来,不再使他们处于分裂的状态,这对于我们正确完整的实现客户的需求,以及建立一个具有业务伸缩性的模型

DTO(Data Transfer Object)数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象

golang项目开发流程

golang微服务架构 golang 微服务 框架 知乎_服务框架

 

 

代码管理模式

golang微服务架构 golang 微服务 框架 知乎_redis_02

 

CI/CD 持续集成、持续部署

CI 持续集成 (Continuous Integration):帮助开发者更加方便地将代码更改合并到主分支。

开发人员将改动的代码合并到主分支,系统就会通过自动构建应用,并运行不同级别的自动化测试(通常是单元测试和集成测试)来验证这些更改,确保这些更改没有对应用造成破坏。

如果自动化测试发现新代码和现有代码之间存在冲突,CI 可以更加轻松地快速修复这些错误。

CD 持续交付(Continuous Delivery):自动把已验证的代码发布到企业自己的存储库。

CD 持续部署(Continuous Deployment):自动将应用发布到生产环境。

一个请求如何进入微服务

注册中心,微服务提供方和消费方

  1. 一个接口或一个前端的界面入口普通链接(调用微服务)
  2. 请求来到Nginx(配置访问转发到的地址,这里是gateway,系统的唯一入口)
  3. gatway routes路由配置
  4. ETCD(Eureka)注册中心上找到服务,访问服务