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

accountproto相关文件已经在之前的 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
}

我们做一个小小的限制,只有当请求时UsernamePassword都为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

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~