2.3 服务编写
作用
在 1.1 涉及的组件、框架介绍 中已经大致介绍了一下我们微服务的整个请求流程。我们这章就开始编写一个最简单的服务——account
,作为服务A
注意:这个系列的重心在整个微服务的创建以及部署上,所以会尽可能地简化业务逻辑代码。
目录结构
我们来看一下account
的最终目录结构
├─account
├─deploy (部署相关)
├─handler
└─account.go
├─proto (proto文件)
├─account.pb.go
└─account.pb.micro.go
├─accountservice.go (入口文件)
├─go.mod
└─go.sum
文件夹大家根据结构自行创建~
编写
好,那我们现在开始编写相关文件。
最终的代码和部署文件,已经传至github,欢迎star。
github.com/guaosi/go-micro-build
proto
account
的proto
相关文件已经在之前的 GO微服务系列-2.1 proto文件的编写与生成 已经编写并且成功好了,我们复制到proto
文件夹中即可。
实现服务接口
handler/account.go
package handler
import (
"account/proto"
"context"
"fmt"
)
type AccountService struct {
}
func (a *AccountService) AccountRegister(c context.Context, req *proto.ReqAccountRegister, res *proto.ResAccountRegister) error {
fmt.Println("hit here")
if req.Username == "guaosi" && req.Password == "guaosi" {
res.Code = 0
res.Message = ""
return nil
}
res.Code = -1
res.Message = "账号或者密码不正确"
return nil
}
我们做一个小小的限制,只有当请求时Username
和Password
都为guaosi
时才返回正确,否则返回账号或者密码不正确
的提示。当被请求时,我们都会在标准输出中打印hit here
,以便我们高可用时可以进行验证。
开启服务
accountservice.go
package main
import (
"account/handler"
"account/proto"
"github.com/micro/go-micro/v2"
// 这里使用 kubernetes 是为了之后可以通过命令行指定注册中心用 kubernetes
_ "github.com/micro/go-plugins/registry/kubernetes/v2"
"log"
)
func main() {
service := micro.NewService(
micro.Name("micro.service.account"),
)
// 初始化相关操作
service.Init()
// 注册实现了服务的handler
if err := proto.RegisterAccountServiceHandler(service.Server(), new(handler.AccountService)); err != nil {
log.Print(err.Error())
return
}
// 运行server
if err := service.Run(); err != nil {
log.Print(err.Error())
return
}
}
编写完毕后,我们运行
go run .
如果提示以下相关内容,则表明此时我们使用mdns来服务发现,服务开启成功~
2020-07-11 18:35:27 file=v2@v2.9.0/service.go:200 level=info Starting [service] micro.service.account
2020-07-11 18:35:27 file=grpc/grpc.go:864 level=info Server [grpc] Listening on [::]:57088
2020-07-11 18:35:27 file=grpc/grpc.go:697 level=info Registry [mdns] Registering node: micro.service.account-d3fbac56-26ab-4916-ae2d-0a56ee396300
然后我们接着将服务发现,服务注册切换为使用etcd
。
安装etcd
我们直接使用docker
来安装etcd
# etcd单一节点
docker run -d \
-p 2379:2379 \
-p 2380:2380 \
--name etcd1 \
quay.io/coreos/etcd:v3.3.8 \
/usr/local/bin/etcd \
--name s1 \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://0.0.0.0:2379
如果想在etcd
容器中使用cli
# 进入容器
docker exec -it etcd1 sh
# 设置docker中环境变量
export ETCDCTL_API=3
# 切换至etcdctl目录
cd /bin
然后我们可以顺便看一下在etcd
中注册的服务的信息
etcdctl get /micro/registry/ --prefix
切换服务注册为etcd
请先确保你的etcd跟你的服务在一个网络下,因为go-micro
默认查找组件的地址为127.0.0.1
go run . --registry=etcd
如果不在同一个网络下,或者端口不是2379
,那个可以使用--registry_address
来手动指定(比如在192.168.1.1
下,并且端口为23790
)
go run . --registry=etcd --registry_address=192.168.1.1:23790