跳到主要内容

go-micro 简介

go-micro 简介 ⚫ Go Micro 是一个插件化的基础框架,基于此可以构建微服务,Micro 的设计哲学是可插拔的插件化架构 ⚫ 在架构之外,它默认实现了 consul 作为服务发现(2019 年源码修改了默认使用mdns),通过 http 进行通信,通过 protobuf 和 json 进行编解码 1.2 go-micro 的主要功能 服务发现: 负载均衡: 消息编码: 请求/响应: Async Messaging: 可插拔接口: 插件地址:https://github.com/micro/go-plugins 2.实践 2.1go-micro helloWorld 2.1.1hello.proto

syntax = "proto3";

//结构体
message InfoRequest{
string user = 1;
}
message InfoResponse {
string msg = 2;
}

//接口
service Hello {
rpc Info (InfoRequest) returns (InfoResponse){
}
}

运行如下命令,生成go代码 protoc -I . --micro_out . --go_out . ./hello.proto 4.微服务-go-micro

2.1.2server.go

package main
import (
"context"
"fmt"
"github.com/micro/go-micro"
"log"
pb "test/micro/proto"
)
//声明结构体
type Hello struct{}

func (g *Hello) Info(ctx context.Context, req *pb.InfoRequest, rep *pb.InfoResponse) error{
rep.Msg = "你好" + req.Username
return nil
}

func main() {
//1.得到服务端实例
service := micro.NewService(
//设置微服务的名字,用来访问
// micro call hello Hello.Info {"username":"zhangsan"}
micro.Name("hello"),
)
//2.初始化
service.Init()
//3.服务注册
err := pb.RegisterHelloHandler(service.Server(),new(Hello))
if err != nil{
fmt.Println(err)
}
//4.启动服务
if err := service.Run(); err != nil{
log.Fatal(err)
}
}

4.微服务-go-micro 4.微服务-go-micro

2.2go-micro 案例2

2.2.1api.proto
syntax = "proto3";

//结构体
message CallRequest{
string name = 1;
}
message CallResponse{
string message = 2;
}
service Call {
rpc CallFunc (CallRequest) returns (CallResponse){};
}

message EmptyRequest{}
message EmptyResponse{}

service Empty{
rpc EmptyFunc (EmptyRequest) returns (EmptyResponse){};
}

生成go代码 protoc -I . --micro_out . --go_out . ./api.proto 2.2.2server.go

package main
import (
"context"
"fmt"
"github.com/go-micro"
"github.com/go-micro/errors"
"log"
pb "test/micro/proto"
)

type Call struct {

}
type Empty struct {

}

func (c *Call) CallFunc(ctx context.Context, req *pb.CallRequest, rep *pb.CallResponse) error {
log.Println("收到了Call.CallFunc请求")
if len(req.Name) == 0{
return errors.BadRequest("go.micro.api.call","no name")
}
rep.Message = "Call.CallFunc接收到了你的请求" + req.Name
return nil
}
func (c *Empty) EmptyFunc(ctx context.Context, req *pb.EmptyRequest, rep *pb.EmptyResponse) error {
log.Println("收到Empty.EmptyFunc请求")
return nil
}
func main() {
service := micro.NewService(
micro.Name("go.micro.api.call"),
)
service.Init()
err := pb.RegisterCallHandler(service.Server(), new(Call))
if err != nil{
fmt.Println(err)
}
err = pb.RegisterEmptyHandler(service.Server(), new(Empty))
if err != nil{
fmt.Println(err)
}
if err := service.Run();err != nil{
log.Fatal(err)
}
}