go-micro入门 - Go语言中文社区

go-micro入门


安装go-micro

1.安装服务发现能力,docker安装consul

docker run -d --net=host -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}'  --name consul_server  consul agent -server -bind=192.168.0.111 -bootstrap-expect=1  -node=node1 -client 0.0.0.0 -ui

输入http://192.168.0.111:8500 能看到consul的UI页面表示正常启动

基础知识

go的包管理工具一直被人诟病。不像PHP的composer和node的npm那样好使。

https://segmentfault.com/a/1190000018389353?utm_source=tag-newest

go1.5版本之前没有包管理,都是基于GOPATH来进行依赖库管理的。
于是从 Golang1.5 开始推出 vendor 文件夹机制。
从 Golang1.6 正式开启这个功能。
Golang 1.11 开始, 实验性出现了可以不用定义 GOPATH 的功能,且官方有 go mod 支持。Golang 1.12 更是将此特征正式化。
也就是go mod 以后是主流,官方加持buff

配置go mod 代理

在国内拉go的包真的费劲。这个一定要配。
http://goproxy.io/
在goland里配置
可以参考下面新建vgo项目时直接配置上Proxy。
配置完如果没有生效的话,重启goland即可

Hello World

请记住我们脑子里只有go mod 这一个包管理工具。
以下为使用goland创建hello world的例子。

  1. 创建项目
    在这里插入图片描述
    项目目录里会出现go.mod文件

  2. 创建main.go文件,把以下代码拷贝进去。

package main
import (
	"github.com/micro/go-micro"
)
func main()  {
}
  1. import那里肯定报红,按alt+enter,选择sync package 同步包的操作。
    就会把依赖的包下载到GOPATH/pkg/mod里,也会在项目的External Libraries的Go Modules里创建索引。
    同步完包以后就不会报红了。根目录下会生成go.sum文件。
    也可以查看go.mod,查看项目的依赖关系。
以上步骤就是利用go mod来管理项目包依赖的。
创建项目就相当于在非GOPATH路径下新建一个项目文件夹,执行了 go mod init hello命令
同步包操作相当于执行了 go mod download命令
还有一些有用的 go mod tidy 删除没有用的依赖,增加新的依赖关系
接下来我们来创建go micro的hello 服务
  1. 因为go micro 使用了Google Protocol Buffer( 简称 Protobuf),安装protobuf、
    https://github.com/protocolbuffers/protobuf/releases
    在这里找到适合自己平台的版本。
    win下记得加入系统path里。
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。

同时在命令行里输入以下命令,分别安装protoc-gen-micro和protobuf/protoc-gen-go
go install github.com/micro/protoc-gen-micro
go install github.com/golang/protobuf/protoc-gen-go

2.在项目根目录创建proto目录,里面创建hello.proto文件

syntax = "proto3";

service Hello {
    rpc Hello(HelloRequest) returns (HelloResponse) {}
}

message HelloRequest {
    string name = 1;
}

message HelloResponse {
    string greeting = 2;
}

3.进入proto目录,执行命令protoc --micro_out=. --go_out=. hello.proto自动生成代码。

4.修改main.go代码,复制以下代码

package main

import (
	"context"
	"fmt"
	"github.com/micro/cli"
	"github.com/micro/go-micro"
	"os"
	proto "test/proto"
)

type Hello struct {
}

func (g *Hello) Hello(ctx context.Context, req *proto.HelloRequest, rsp *proto.HelloResponse) error {
	rsp.Greeting = "Hello " + req.Name
	return nil
}

func runClient(service micro.Service) {
	// Create new greeter client
	greeter := proto.NewHelloService("hello", service.Client())

	// Call the greeter
	rsp, err := greeter.Hello(context.TODO(), &proto.HelloRequest{Name: "John"})
	if err != nil {
		fmt.Println(err)
		return
	}

	// Print response
	fmt.Println(rsp.Greeting)
}

func main() {
	service := micro.NewService(
		micro.Name("hello"),
		micro.Version("latest"),
		micro.Metadata(map[string]string{
			"type": "helloword",
		}),
		micro.Flags(cli.BoolFlag{
			Name:  "run_client",
			Usage: "Launch the client",
		}),
	)
	service.Init(
		micro.Action(func(c *cli.Context) {
			if c.Bool("run_client") {
				runClient(service)
				os.Exit(0)
			}
		}),
	)
	proto.RegisterHelloHandler(service.Server(), new(Hello))

	// Run the server
	if err := service.Run(); err != nil {
		fmt.Println(err)
	}
}

5.启动hello服务go run main.go
在这里插入图片描述
表示服务启动成功

6.运行hello客户端 go run main.go --run_client
在这里插入图片描述

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/u013705066/article/details/88944745
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 21:20:48
  • 阅读 ( 2679 )
  • 分类:Go

2 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢