安装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的例子。
-
创建项目
项目目录里会出现go.mod文件
-
创建main.go文件,把以下代码拷贝进去。
package main
import (
"github.com/micro/go-micro"
)
func main() {
}
- 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 服务
- 因为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
|
请发表评论