第二课 Go容器化微服务系统实战-微服务模块开发
tags:
- GO
- 慕课网
categories:
- 项目目录搭建
- GORM
文章目录
第一节 开发目录和依赖包
1.1 项目目录搭建
# 使用容器方式micro/micro 这个容器创建不了--type=api 只能创建service 估计版本问题
sudo docker pull micro/micro
sudo docker run --rm -v $(pwd):$(pwd) -w $(pwd) micro/micro new user(user是我们需要开发的模块)
# 使用容器方式microhq/micro 这个容器暂时用不起来 老报错GOPATH路径找不到 改天研究一下
sudo docker run --rm -v $(pwd):$(pwd) -w $(pwd) microhq/micro new user(user是我们需要开发的模块)
# 直接安装环境 验证micro是否安装成功:micro --version
# 官网https://micro.mu/introduction 这里的最新版本已经不支持consul建议使用etcd
go get github.com/micro/micro
micro new user
- 第三步:新建domain(文件夹,写数据库相关的内容)
- model:数据库模型
- repository: 编写数据库映射关系
- service:对数据库方法进行包装。业务逻辑
-
Handler:类似controller作用
1.2 Go module的使用
-
Go module基本设置
- Go >=1.13会自动默认使用Go Modules
- Go Modules使用GOPROXY 环境变量来解决无法使用go get的问题
-
Go module私有仓库设置, GOPRIVATE
- 使用go env命令查看本机参数
- GOPRIVATE="*.imooc.com"
# windows
SET GO111MODULE=on
SET GOPROXY=https://goproxy.cn
# liunx
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
-
Go module 设置慕课网git转发
- go get内部使用git clone命令,默认只支持公有仓库
- 替换https 为ssh请求(注意,慕课网ssh端口是80不是22)
git config --global url."ssh://git@git.imooc.com:80/".insteadOf "https://git.imooc.com/"
1.3 GORM基本介绍及使用
- GORM库是go语言中实现数据库访问的ORM(对象关系映射)库
- 使用GORM这个库,我们可以利用面向对象的方法
- GORM可以方便的对数据库中的数据进行CRUD(增删改查)
- GORM依赖库
go get github.com/jinzhu/gorm
go get github.com/go-sql-driver/mysql
gorm.Open("mysql",
"root:123456@/test?charset=utf8&parseTime=True&loc=Local")
第二节 用户功能开发
2.1 需求分析
- 用户信息管理 增删改查
- 用户登陆,注册(鉴权)
- 上面生成的mod是user,我们想重新生成并导包。删除之前的go.mod.
go mod init git.imooc.com/qnhyn/user
go mod tidy
# 然后修改main中的导包路径之前user 变成 git.imooc.com/qnhyn/user
2.2 编写proto
- proto下的user.proto文件删除。新建文件夹,创建新的user.proto
syntax = "proto3";
package go.micro.service.user;
service User{
// 注册
rpc Register(UserRegisterRequest) returns (UserRegisterResponse){}
// 登录
rpc Login(UserLoginRequest) returns (UserLoginResponse) {}
// 查询用户信息
rpc GetUserInfo(UserInfoRequest) returns (UserInfoResponse){}
}
message UserInfoRequest {
string user_name = 1;
}
message UserInfoResponse {
int64 user_id = 1;
string user_name = 2;
string first_name = 3;
}
message UserRegisterRequest {
string user_name = 1;
string first_name = 2;
string pwd = 3;
}
message UserRegisterResponse {
string message = 1;
}
message UserLoginRequest {
string user_name = 1;
string pwd = 2;
}
message UserLoginResponse {
bool is_success = 1;
}
- 转换为go代码。
protoc *.proto --gofast_out=. --micro_out=.
2.3 编写业务逻辑
- 第一步:编写proto文件,把暴露出去的服务编写一遍,明确message信息。通过proto自动生成go的文件。
- 第二步:开发domain。
- 首先:在model文件夹下编写user模型。数据库模型。
- 然后:在repository文件夹下编写文件使用gorm操作数据库。
- 最后:在service文件加下编写我们的业务代码。
- 第三步: 在handler文件夹下写Handler是我们要暴露出去的接口,它和生成的pb.micro文件中的UserHandle接口中的函数一一对应。
- 第四步:在mian.go中创建服务参数,初始化服务和中间件实例化比如:数据库。
- 这里注意:“github.com/micro/go-micro” 这个包如果是新版本v3, 编译会报错
- 修改如下
# 先删除go.mod中的所有引入,重新引入包
# 修改"github.com/micro/go-micro/v2" 执行下面, 用到的包给我导入进来即可
go mod tidy
# 如果编译仍然出错比如:Service不存在之类的 检查这两个都是v2.重新生成go文件。
go get github.com/micro/go-micro/v2
go get github.com/micro/protoc-gen-micro/v2
2.4 创建数据库环境
- 使用docker创建
# 最后创建数据库micro即可
docker pull mysql:5.6
sudo docker run -p 3306:3306 -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d --name micro-mysql mysql:5.6
第三节 Dockerfile打包user模块
3.1 Dockerfile常用命令
- FROM:定制的镜像都是基于FROM的镜像,后续的操作都是基于这个镜像
- RUN:用于执行后面跟着的命令行命令
- COPY,ADD:复制指令,从文件或者目录到容器里指定路径
- CMD,ENTRYPOINT:用于运行程序
- ENV︰设置环境变量,在后续的指令中,就可以使用这个环境变量。
- EXPOSE:声明端口
- WORKDIR:指定工作目录
- USER∶于指定执行后续命令的用户和用户组
FROM alpine
ADD user /user
ENTRYPOINT [ "/user" ]
3.2 构建镜像
- 首先交叉编译生成对应文件。
# 交叉编译 user文件夹下
CGO_ENABLED=0 GooS=linux GOARCH=amd64 go build -o user *.go
# 生成镜像
docker build -t user:latest .
# 运行
docker run -d user
docker logs 74fdsdfa
# 删除
docker rm -f 74fdsdfa
3.3 Makefile简化命令
- 避免反复执行上面命令。
- 自己查找安装。
GOPATH:=$(shell go env GOPATH)
.PHONY: proto
proto:
#sudo docker run --rm -v $(shell pwd):$(shell pwd) -w $(shell pwd) znly/protoc -I ./ --go_out=./ --micro_out=./ ./proto/user/*.proto
# 这个还是手动执行吧
# protoc ./proto/user/*.proto --gofast_out=. --micro_out=.
.PHONY: build
build:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o user *.go
.PHONY: test
test:
go test -v ./... -cover
.PHONY: dockerBuild
dockerBuild:
sudo docker build -t user:latest .
- 下面执行
# 通过.proto文件生成我们go文件 如果存在覆盖之前的
make proto
# 生成执行文件
make build
# 打包成镜像
make dockerBuild