golang 微服务
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项目开发流程
代码管理模式
CI/CD 持续集成、持续部署
CI 持续集成 (Continuous Integration):帮助开发者更加方便地将代码更改合并到主分支。
开发人员将改动的代码合并到主分支,系统就会通过自动构建应用,并运行不同级别的自动化测试(通常是单元测试和集成测试)来验证这些更改,确保这些更改没有对应用造成破坏。
如果自动化测试发现新代码和现有代码之间存在冲突,CI 可以更加轻松地快速修复这些错误。
CD 持续交付(Continuous Delivery):自动把已验证的代码发布到企业自己的存储库。
CD 持续部署(Continuous Deployment):自动将应用发布到生产环境。
一个请求如何进入微服务
注册中心,微服务提供方和消费方
- 一个接口或一个前端的界面入口普通链接(调用微服务)
- 请求来到Nginx(配置访问转发到的地址,这里是gateway,系统的唯一入口)
- gatway routes路由配置
- ETCD(Eureka)注册中心上找到服务,访问服务