4.微服务-go-micro

DevOperater · · 758 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

1.介绍

1.1go-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)
    }
}

4.微服务-go-micro

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


有疑问加站长微信联系(非本文作者)

本文来自:51CTO博客

感谢作者:DevOperater

查看原文:4.微服务-go-micro

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

758 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传