第二课 Go容器化微服务系统实战-微服务模块开发

第二课 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
  1. 第三步:新建domain(文件夹,写数据库相关的内容)
    • model:数据库模型
    • repository: 编写数据库映射关系
    • service:对数据库方法进行包装。业务逻辑
    • Handler:类似controller作用
      第二课 Go容器化微服务系统实战-微服务模块开发

1.2 Go module的使用

  1. Go module基本设置
    • Go >=1.13会自动默认使用Go Modules
    • Go Modules使用GOPROXY 环境变量来解决无法使用go get的问题
  2. 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
  1. 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基本介绍及使用

  1. GORM库是go语言中实现数据库访问的ORM(对象关系映射)库
  2. 使用GORM这个库,我们可以利用面向对象的方法
  3. GORM可以方便的对数据库中的数据进行CRUD(增删改查)
  4. 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 需求分析

  1. 用户信息管理 增删改查
  2. 用户登陆,注册(鉴权)
  3. 上面生成的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

  1. 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;
}
  1. 转换为go代码。
protoc *.proto --gofast_out=. --micro_out=. 

2.3 编写业务逻辑

  1. 第一步:编写proto文件,把暴露出去的服务编写一遍,明确message信息。通过proto自动生成go的文件。
  2. 第二步:开发domain。
    • 首先:在model文件夹下编写user模型。数据库模型。
    • 然后:在repository文件夹下编写文件使用gorm操作数据库。
    • 最后:在service文件加下编写我们的业务代码。
  3. 第三步: 在handler文件夹下写Handler是我们要暴露出去的接口,它和生成的pb.micro文件中的UserHandle接口中的函数一一对应。
  4. 第四步:在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 创建数据库环境

  1. 使用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常用命令

  1. FROM:定制的镜像都是基于FROM的镜像,后续的操作都是基于这个镜像
  2. RUN:用于执行后面跟着的命令行命令
  3. COPY,ADD:复制指令,从文件或者目录到容器里指定路径
  4. CMD,ENTRYPOINT:用于运行程序
  5. ENV︰设置环境变量,在后续的指令中,就可以使用这个环境变量。
  6. EXPOSE:声明端口
  7. WORKDIR:指定工作目录
  8. USER∶于指定执行后续命令的用户和用户组
FROM alpine
ADD user /user
ENTRYPOINT [ "/user" ]

3.2 构建镜像

  1. 首先交叉编译生成对应文件。
# 交叉编译 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简化命令

  1. 避免反复执行上面命令。
  2. 自己查找安装。

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 .
  1. 下面执行
# 通过.proto文件生成我们go文件 如果存在覆盖之前的
make proto 
# 生成执行文件
make build
# 打包成镜像
make dockerBuild
上一篇:本科毕业设计外文翻译原文以及翻译


下一篇:微前端框架 micro-app 踩坑记