Go Micro

安装依赖

  Go Micro  

$ go get github.com/micro/go-micro

  

  Protobuf (如果您使用代码生成,您还需要使用protoc-gen-go)

$ go get github.com/micro/protobuf/{proto,protoc-gen-go}

  

  工具包 (Micro工具包提供了访问微服务的各种方法)

$ go get github.com/micro/micro

  

  Docker (可用预制docker images)

$ docker pull microhq/micro

  

  尝试CLI

    运行greeter服务
$ go get github.com/micro/examples/greeter/srv && srv

 

    服务清单
$ micro list services
consul
go.micro.srv.greeter

  

   获取服务
$ micro get service go.micro.srv.greeter
service  go.micro.srv.greeter

version 1.0.0

Id	Address	Port	Metadata
go.micro.srv.greeter-34c55534-368b-11e6-b732-68a86d0d36b6	192.168.1.66	62525	server=rpc,registry=consul,transport=http,broker=http

Endpoint: Say.Hello
Metadata: stream=false

Request: {
	name string
}

Response: {
	msg string
}

  

    查询服务 
$ micro query go.micro.srv.greeter Say.Hello '{"name": "John"}'
{
	"msg": "Hello John"
}

  

    调用服务
 $ micro call hello Greeter.Greet '{"name":"SngZhibin","msg":"null"}'
{
        "name": "SngZhibin",
        "msg": "SngZhibin您好"
}

// hello是服务名 Greeter.Greet是.proto中定义的服务

  

创建服务实例 

// demo.proto

syntax = "proto3"; // 指定版本
package pb; // 包名

message Request {
    string name = 1;
    string msg = 2;
}
message Response {
    string name = 1;
    string msg = 2;
}
service Greeter {
    // 服务
    rpc Greet (Request) returns (Response) {
    }
}

  

使用protoc工具生成对应代码后服务代码

// 服务代码
package main

import (
	"Songzhibin/raftRealize/microDemo/pb"
	"context"
	"fmt"
	"github.com/micro/go-micro"
)

// 自定义结构体
type server struct{}

func (s server) Greet(ctx context.Context, req *pb.Request, rep *pb.Response) error {
	rep.Name = req.Name
	rep.Msg = req.Name + "您好"
	return nil
}
func main() {
	// 创建服务
	s := micro.NewService(
		// micro.Name("服务名")
		micro.Name("hello"),
	)
	// 初始化
	s.Init()
	// 注册
	pb.RegisterGreeterHandler(s.Server(), &server{})
	err := s.Run()
	if err != nil {
		fmt.Println(err)
	}
}

 

// PS: 这里遇到一个问题就是本地下载包后无法正常启动编译服务 使用go mod 正常

终端调用

$ micro call hello Greeter.Greet '{"name":"SngZhibin","msg":"null"}'
{
        "name": "SngZhibin",
        "msg": "SngZhibin您好"
}

 

代码调用 

package main

import (
	"Songzhibin/raftRealize/microDemo/pb"
	"context"
	"fmt"
	"github.com/micro/go-micro"
)

func main() {
	s := micro.NewService(
		// micro.Name("服务名")
		micro.Name("hello"),
	)
	greeter := pb.NewGreeterClient("hello", s.Client())
	rep, err := greeter.Greet(context.TODO(), &pb.Request{
		Name: "Songzhibin",
		Msg:  "null",
	}, )
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Printf("%#v",rep)
}

  

http Api调用

// 先开启api
$  micro api --handler=rpc 
// 在启动服务
// PS:服务名有要求 go.micro.api.xxx
2020-03-01 11:24:41.173184 I | Transport [http] Listening on [::]:54896
2020-03-01 11:24:41.173269 I | Broker [http] Connected to [::]:54897
2020-03-01 11:24:41.173562 I | Registry [mdns] Registering node: go.micro.api.hello-7269ef09-b1bd-40eb-b6e2-627023af0009
// 有 connect to 即可判断连接成功
// 在postman 调用
http://localhost:8080/hello/Greeter/Greet -> post
// hello 服务名 Greeter 注册服务  Greet调用方法
body:
{
 "name":"Songzhibin",
 "msg":"Null"
}

res:
{
    "name": "Songzhibin",
    "msg": "Songzhibin您好"
}

  

更多使用访问中文文档

Songzhibin
原文地址:https://www.cnblogs.com/binHome/p/12381511.html