go-micro接口调用

go-micro在微服务框架中提供了开箱即用的灵活接口,但是官方文档以及版本过于混乱,导致很难上手,初次使用很多调用都需要去阅读源码才能使用,微服务之间最核心的功能就是接口调用,当你使用go-micro的微服务去调用另一个go-micro的微服务时,使用起来简单,但是如果跨语言呢,grpc是没有语言限制的,假设你用go-micro实现了一个微服务,使用java作为客户端去调用呢?本教程主要记录go-micro在跨语言上调用接口的方法,希望对你有所帮助。

环境准备

使用micro创建一个微服务,提供给接口用来测试。

$ micro new geeter
$ cd geeter
$ make proto
$ go mod tidy
$ go run main

2022-07-21 11:31:35  file=v2@v2.9.1/service.go:200 level=info Starting [service] go.micro.service.geeter
2022-07-21 11:31:35  file=grpc/grpc.go:864 level=info Server [grpc] Listening on [::]:53294
2022-07-21 11:31:35  file=grpc/grpc.go:881 level=info Broker [http] Connected to 127.0.0.1:53295
2022-07-21 11:31:35  file=grpc/grpc.go:697 level=info Registry [mdns] Registering node: go.micro.service.geeter-12413e0b-a51a-45da-954c-38b99a80d276
2022-07-21 11:31:35  file=grpc/grpc.go:730 level=info Subscribing to topic: go.micro.service.geeter

默认使用mdns作为注册中心,系统随机分配端口53294

go-micro微服务接口调用

使用go-micro微服务调用必须要能从注册中心发现服务

    // New Service
    service := micro.NewService(
        micro.Name("go.micro.client.geeter"),
        micro.Version("latest"),
    )

    // Initialise service
    service.Init()

这里客户端仅实现了服务发现,并没有实现服务注册,所以在注册中心时发现不了该客户端的

cli := geeter.NewGeeterService("go.micro.service.geeter", client.DefaultClient)
resp, err := cli.Call(context.TODO(), &geeter.Request{
  Name: "micro call.",
})
fmt.Println(resp, err)

go.micro.service.geeter:微服务名称,这里不需要关心微服务的端口,因为走注册中心通过微服务名称调用,比较灵活

client.DefaultClient:实例化默认客户端

client.DefaultClient是go-micro默认的客户端,其内部实现如下:

// DefaultClient is a default client to use out of the box
    DefaultClient Client = newRpcClient()
    // DefaultBackoff is the default backoff function for retries
    DefaultBackoff = exponentialBackoff
    // DefaultRetry is the default check-for-retry function for retries
    DefaultRetry = RetryOnError
    // DefaultRetries is the default number of times a request is tried
    DefaultRetries = 1
    // DefaultRequestTimeout is the default request timeout
    DefaultRequestTimeout = time.Second * 5
    // DefaultPoolSize sets the connection pool size
    DefaultPoolSize = 100
    // DefaultPoolTTL sets the connection pool ttl
    DefaultPoolTTL = time.Minute

    // NewClient returns a new client
    NewClient func(...Option) Client = newRpcClient

支持自定义客户端,对客户端的超时、重试、线程池按需定义

其他框架调用go-micro服务接口

使用其他框架调用go-micro服务必须要重新生成protoc文件,这里也是使用Go作为演示,不同的是使用grpc标准方法调用

protoc --go_out=plugins=grpc:. *.proto 

仅生成geete.pb.go文件

首先初始化grpc链接

// 创建客户端连接
conn, err := grpc.Dial("127.0.0.1:53294", grpc.WithInsecure())
if err != nil {
  fmt.Println("grpc Dial err: ", err)
  return
}
defer conn.Close()

创建远程调用的客户端

// 创建远程服务的客户端
cli := geete.NewGeeterClient(conn)
resp, err := cli.Call(context.TODO(), &geete.Request{
  Name: "micro call.",
})
fmt.Println(resp, err)

127.0.0.1:53294:需要注意,使用grpc标准接口调用,必须指定ip和端口,这种情况下,要求服务端必须要指定端口启动

好了,以上就是本文的主要内容。

老规矩,代码已经上传到Github,欢迎访问: https://github.com/casiphia/go-micro-examples

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容