当前微服务已经成为服务端开发的主流架构,而Go语言因其简单易学、内置高并发、快速编译、占用内存小等特点也越来越受到开发者的青睐,微服务实战系列文章将从实战的角度和大家一起学习微服务相关的知识。本系列文章将以一个“博客系统”由浅入深的和大家一起一步步搭建起一个完整的微服务系统
该篇文章为微服务实战系列的第一篇文章,我们将基于go-zero+gitlab+jenkins+k8s构建微服务持续集成和自动构建发布系统,先对以上模块做一个简单介绍:
- go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验
- gitlab 是一款基于 Git 的完全集成的软件开发平台,另外,GitLab 且具有wiki以及在线编辑、issue跟踪功能、CI/CD 等功能
- jenkins 是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能
- kubernetes 常简称为K8s,是用于自动部署、扩展和管理容器化应用程序”的开源系统。该系统由Google设计并捐赠给Cloud Native Computing Foundation(今属Linux基金会)来使用。它旨在提供“跨主机集群的自动部署、扩展以及运行应用程序容器的平台
实战主要分为五个步骤,下面针对以下的五个步骤分别进行详细的讲解
- 第一步环境搭建,这里我采用了两台ubuntu16.04服务器分别安装了gitlab和jenkins,采用xxx云弹性k8s集群
- 第二步生成项目,这里我采用go-zero提供的goctl工具快速生成项目,并对项目做简单的修改以便测试
- 第三部生成Dockerfile和k8s部署文件,k8s部署文件编写复杂而且容易出错,goctl工具提供了生成Dockerfile和k8s部署文件的功能非常的方便
- Jenkins Pipeline采用声明式语法构建,创建Jenkinsfile文件并使用gitlab进行版本管理
- 最后进行项目测试验证服务是否正常
![experiment_step](https://i-blog.csdnimg.cn/blog_migrate/1d2f162c05e63c2f5d1c988bb5170ed7.png)
环境搭建
首先我们搭建实验环境,这里我采用了两台ubuntu16.04服务器,分别安装了gitlab和jenkins。gtilab使用apt-get直接安装,安装好后启动服务并查看服务状态,各组件为run状态说明服务已经启动,默认端口为9090直接访问即可
gitlab-ctl start // 启动服务
gitlab-ctl status // 查看服务状态
run: alertmanager: (pid 1591) 15442s; run: log: (pid 2087) 439266s
run: gitaly: (pid 1615) 15442s; run: log: (pid 2076) 439266s
run: gitlab-exporter: (pid 1645) 15442s; run: log: (pid 2084) 439266s
run: gitlab-workhorse: (pid 1657) 15441s; run: log: (pid 2083) 439266s
run: grafana: (pid 1670) 15441s; run: log: (pid 2082) 439266s
run: logrotate: (pid 5873) 1040s; run: log: (pid 2081) 439266s
run: nginx: (pid 1694) 15440s; run: log: (pid 2080) 439266s
run: node-exporter: (pid 1701) 15439s; run: log: (pid 2088) 439266s
run: postgres-exporter: (pid 1708) 15439s; run: log: (pid 2079) 439266s
run: postgresql: (pid 1791) 15439s; run: log: (pid 2075) 439266s
run: prometheus: (pid 10763) 12s; run: log: (pid 2077) 439266s
run: puma: (pid 1816) 15438s; run: log: (pid 2078) 439266s
run: redis: (pid 1821) 15437s; run: log: (pid 2086) 439266s
run: redis-exporter: (pid 1826) 15437s; run: log: (pid 2089) 439266s
run: sidekiq: (pid 1835) 15436s; run: log: (pid 2104) 439266s
jenkins也是用apt-get直接安装,需要注意的是安装jenkins前需要先安装java,过程比较简单这里就不再演示,jenkins默认端口为8080,默认账号为admin,初始密码路径为/var/lib/jenkins/secrets/initialAdminPassword,初始化安装推荐的插件即可,后面可以根据自己的需要再安装其它插件
k8s集群搭建过程比较复杂,虽然可以使用kubeadm等工具快速搭建,但距离真正的生产级集群还是有一定差距,因为我们的服务最终是要上生产的,所以这里我选择了xxx云的弹性k8s集群版本为1.16.9,弹性集群的好处是按需收费没有额外的费用,当我们实验完成后通过kubectl delete立马释放资源只会产生很少的费用,而且xxx云的k8s集群给我们提供了友好的监控页面,可以通过这些界面查看各种统计信息,集群创建好后需要创建集群访问凭证才能访问集群
若当前访问客户端尚未配置任何集群的访问凭证,即 ~/.kube/config 内容为空,可直接将访问凭证内容并粘贴入 ~/.kube/config 中
若当前访问客户端已配置了其他集群的访问凭证,需要通过如下命令合并凭证
KUBECONFIG=~/.kube/config:~/Downloads/k8s-cluster-config kubectl config view --merge --flatten > ~/.kube/config export KUBECONFIG=~/.kube/config
配置好访问权限后通过如下命令可查看当前集群
kubectl config current-context
查看集群版本,输出内容如下
kubectl version
Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.9", GitCommit:"a17149e1a189050796ced469dbd78d380f2ed5ef", GitTreeState:"clean", BuildDate:"2020-04-16T11:44:51Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"16+", GitVersion:"v1.16.9-eks.2", GitCommit:"f999b99a13f40233fc5f875f0607448a759fc613", GitTreeState:"clean", BuildDate:"2020-10-09T12:54:13Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
到这里我们的试验已经搭建完成了,这里版本管理也可以使用github
生成项目
整个项目采用大仓的方式,目录结构如下,最外层项目命名为blog,app目录下为按照业务拆分成的不同的微服务,比如user服务下面又分为api服务和rpc服务,其中api服务为聚合网关对外提供restful接口,而rpc服务为内部通信提供高性能的数据缓存等操作
├── blog
│ ├── app
│ │ ├── user
│ │ │ ├── api
│ │ │ └── rpc
│ │ ├── article
│ │ │ ├── api
│ │ │ └── rpc
项目目录创建好之后我们进入api目录创建user.api文件,文件内容如下,定义服务端口为2233,同时定义了一个/user/info接口
type UserInfoRequest struct {
Uid int64 `form:"uid"`
}
type UserInfoResponse struct {
Uid int64 `json:"uid"`
Name string `jso