Go-Micro构建学生rpc服务并注册到consul
简介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"
最近在做Golang的web框架日志,想将一个请求的所有日志上都绑定一个请求ID,由于最初框架的搭建没有解耦好,所以很难在日志中输出请求ID。于是想到了能否用协程ID来记录一个对应的请求ID,然后进行获取。
为了能让虚拟机能连接网络,并且能与宿主机能相互进行访问,所以需要多虚拟机几种网络模式进行学习,以便后期能快速的进行配置。
php中的array_walk_recursive函数对数组中的每个成员递归地应用用户函数
Composer 是 PHP 的一个依赖管理工具。我们可以在项目中声明所依赖的外部工具库,Composer 会帮你安装这些依赖的库文件,有了它,我们就可以很轻松的使用一个命令将其他人的优秀代码引用到我们的项目中来。
某些时候如果想快速将服务器中的某些资源共享给其他人,可以使用python来实现,python自带了一个快速创建HTTP服务的方式,可以将允许时目录下的所有文件以文件服务器供他人进行访问和下载。
快速生成表格
Electron页面跳转、浏览器打开链接和打开新窗口
在使用Git的过程中,不想每次都输入用户名和密码去拉取代码,所以就需要保存这些信息,那么既然有保存了,就必须有清除功能。
在Mac电脑中,如何对Git的用户名和密码进行修改呢?起初不懂Mac,所以整了很久,本文将记录如何对这个进行操作,以便后期使用。
Docker编译镜像出现:fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.12/main: temporary error (try again later)
WARNING: Ignoring APKINDEX.2c4ac24e.tar.gz: No such file or directory问题