Go-Micro构建学生rpc服务并注册到consul

xiaohai 2021-05-09 22:31:19 1986人围观 标签: Go 
简介Go-Micro构建学生rpc服务并注册到consul

1、目录结构

micro-student:项目目录
    service:服务目录
        controller:实现目录
        model:proto生成的目录
        proto:proto定义目录
    main.go:入口
    make_proto.bat:生成proto
    runAll.bat:运行多个服务

2、新建proto文件

文件名:models.proto,内容如下

syntax = "proto3";

package services;

//公共的模型
message StudentModel {
    int32 id = 1; //学生ID
    string name = 2; //学生名称
    string sex = 3; //性别
}

文件名:student_service.proto,内容如下

syntax = "proto3";

package services;

import "models.proto";

//学生列表请求
message StudentListRequest {
    int32 num = 1; //请求数量
}

//学生列表返回
message StudentListResponse {
    int32 status = 1; //状态
    repeated StudentModel data = 2; //学生模型数据
}

//学生列表请求方法
service StudentListService {
    rpc GetStudentListService (StudentListRequest) returns (StudentListResponse);
}

3、编写生成proto的批处理文件(make_proto.bat)

cd service/proto
protoc --go_out=../model models.proto
protoc --micro_out=../model --go_out=../model student_service.proto
cd ../../

执行批处理后,model目录下会生成对应的文件

4、编写服务的业务实现逻辑(controller目录下新建student_service.go文件)

package controller

import (
    "context"
    services "micro-api/service/model"
    "strconv"
)

type StudentService struct {
}

//业务实现
func (c *StudentService) GetStudentListService(ctx context.Context, req *services.StudentListRequest, rsp *services.StudentListResponse) error {

    var data []*services.StudentModel
    for i := 1; i <= int(req.Num); i++ {
        data = append(data, &services.StudentModel{
            Id:   int32(i),
            Name: "name_" + strconv.Itoa(i),
            Sex:  "男",
        })
    }
    rsp.Status = 200
    rsp.Data = data
    return nil
}

5、编写main.go

package main

import (
    "github.com/micro/go-micro"
    "github.com/micro/go-micro/registry"
    "github.com/micro/go-plugins/registry/consul"
    "micro-api/service/controller"
    services "micro-api/service/model"
)

func main() {
    register := consul.NewRegistry(func(options *registry.Options) {
        options.Addrs = []string{
            "192.168.1.171:8500",
            "192.168.1.177:8500",
            "192.168.1.178:8500",
        }
    })

    service := micro.NewService(
        micro.Name("student-service"),
        micro.Registry(register),
    )
    if err := services.RegisterStudentListServiceHandler(service.Server(), new(controller.StudentService)); err != nil {

    }
    service.Init()

    service.Run()
}

6、批量文件文件(runAll.bat)

@echo off



start cmd /k "cd/d E:\go\micro-student &&go run main.go --server_address=:50001"

start cmd /k "cd/d E:\go\micro-student &&go run main.go --server_address=:50002"

start cmd /k "cd/d E:\go\micro-student &&go run main.go --server_address=:50003"