Go - Micro微服务框架实践 - API(十三)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go - Micro微服务框架实践 - API(十三)相关的知识,希望对你有一定的参考价值。

参考技术A

Micro的api就是api网关

API参考了 API网关模式 为服务提供了一个单一的公共入口。基于服务发现,使得micro api可以提供具备http及动态路由的服务。

Micro的API基于HTTP协议。请求的API接口通过HTTP协议访问,并且路由是基于服务发现机制向下转发的。 Micro API在 go-micro 之上开发,所以它集成了服务发现、负载均衡、编码及基于RPC的通信。

因为micro api内部使用了go-micro,所以它自身也是可插拔的。 参考 go-plugins 了解对gRPC、kubernetes、etcd、nats、及rabbitmq等支持。另外,api也使用了 go-api ,这样,接口handler也是可以配置的。

ACME( Automatic Certificate Management Environment)是由 Let’s Encrypt 制定的安全协议。

可以选择是否配置白名单

API服务支持TLS证书

API使用带分隔符的命名空间来在逻辑上区分后台服务及公开的服务。命名空间及http请求路径会用于解析服务名与方法,比如 GET /foo HTTP/1.1 会被路由到 go.micro.api.foo 服务上。

API默认的命名空间是 go.micro.api ,当然,也可以修改:

我们演示一个3层的服务架构:

完整示例可以参考: examples/greeter

先决条件:我们使用Consul作为默认的服务发现,所以请先确定它已经安装好了,并且已经运行,比如执行 consul agent -dev 这样子方式运行。

向micro api发起http请求

HTTP请求的路径 /greeter/say/hello 会被路由到服务 go.micro.api.greeter 的方法 Say.Hello 上。

绕开api服务并且直接通过rpc调用:

使用JSON的方式执行同一请求:

micro api提供下面类型的http api接口

请看下面的例子

Handler负责持有并管理HTTP请求路由。

默认的handler使用从注册中心获取的端口元数据来决定指向服务的路由,如果路由不匹配,就会回退到使用”rpc” hander。在注册时,可以通过 go-api 来配置路由。

API有如下方法可以配置请求handler:

通过 /rpc 入口可以绕开handler处理器。

API处理器接收任何的HTTP请求,并且向前转发指定格式的RPC请求。

RPC处理器接收json或protobuf格式的HTTP POST请求,然后向前转成RPC请求。

代理Handler其实是内置在服务发现中的反向代理服务。

事件处理器使用go-micro的broker代理接收http请求并把请求作为消息传到消息总线上。

Web处理器是,它是内置在服务发现中的HTTP反向代理服务,支持web socket。

/rpc 端点允许绕过主handler,然后与任何服务直接会话。

示例:

更多信息查看可运行的示例: github.com/micro/examples/api

解析器,Micro使用命名空间与HTTP请求路径来动态路由到具体的服务。

API命名的空间是 go.micro.api 。可以通过指令 --namespace 或者环境变量 MICRO_NAMESPACE= 设置命名空间。

下面说一下解析器是如何使用的:

RPC解析器示例中的RPC服务有名称与方法,分别是 go.micro.api.greeter , Greeter.Hello 。

URL会被解析成以下几部分:

带版本号的API URL也可以很容易定位到具体的服务:

代理解析器只处理服务名,所以处理方案和RPC解析器有点不太一样。

URL会被解析成以下几部分:

go微服务学习 go-micro框架-—— micro安装

由于 Micro3.0直接放弃维护 go-micro,所以网上很多文章都是已经过时的了。那些安装方法根本装不上了。此贴主要根据官方文档进行摸索,感觉官方文档似乎也没来得及更新,所以部分操作也没能成功。就只记录一下自己成功的操作和遇到的问题。

依赖

我们需要protoc-gen-micro来生成代码
protobuf
protoc-gen-go
protoc-gen-micro

#Download latest proto releaes
#https://github.com/protocolbuffers/protobuf/releases
go get github.com/golang/protobuf/protoc-gen-go
go get github.com/micro/micro/v3/cmd/protoc-gen-micro

安装micro

使用go安装

go get -u -v github.com/micro/micro

go install github.com/micro/micro

这种安装可能会报错
错误1:
micro/util/acme/options.go:19:8: cannot find package "github.com/go-acme/lego/v3/challenge" in any of: /usr/local/go/src/github.com/go-acme/lego/v3/challenge (from $GOROOT) /Users/demon/StudyFile/go/src/github.com/go-acme/lego/v3/challenge (from $GOPATH) micro/service/api/server/server.go:9:2: cannot find package "github.com/go-acme/lego/v3/providers/dns/cloudflare" in any of: /usr/local/go/src/github.com/go-acme/lego/v3/providers/dns/cloudflare (from $GOROOT) /Users/demon/StudyFile/go/src/github.com/go-acme/lego/v3/providers/dns/cloudflare (from $GOPATH) ../xanzy/go-gitlab/gitlab.go:38:2: cannot find package "golang.org/x/oauth2" in any of: /usr/local/go/src/golang.org/x/oauth2 (from $GOROOT) /Users/demon/StudyFile/go/src/golang.org/x/oauth2 (from $GOPATH) ../../golang.org/x/crypto/ssh/terminal/terminal.go:14:2: cannot find package "golang.org/x/term" in any of: /usr/local/go/src/golang.org/x/term (from $GOROOT) /Users/demon/StudyFile/go/src/golang.org/x/term (from $GOPATH) ../xanzy/go-gitlab/gitlab.go:39:2: cannot find package "golang.org/x/time/rate" in any of: /usr/local/go/src/golang.org/x/time/rate (from $GOROOT) /Users/demon/StudyFile/go/src/golang.org/x/time/rate (from $GOPATH)
这是因为https://github.com/micro/micro里没有v3这个网页了,我们将micro/micro目录下的Makefile中的GIT_IMPORT=github.com/micro/micro/v3/cmd改为GIT_IMPORT=github.com/micro/micro/cmd即可正常执行。

如果遇到以下错误,则是由于protobuf版本不兼容导致。
#github.com/coreos/etcd/clientv3/balancer/resolver/endpoint ../../../../pkg/mod/github.com/coreos/etcd@v3.3.17+incompatible/clientv3/balancer/resolver/endpoint/endpoint.go:114:78: undefined: resolver.BuildOption ../../../../pkg/mod/github.com/coreos/etcd@v3.3.17+incompatible/clientv3/balancer/resolver/endpoint/endpoint.go:182:31: undefined: resolver.ResolveNowOption #github.com/coreos/etcd/clientv3/balancer/picker ../../../../pkg/mod/github.com/coreos/etcd@v3.3.17+incompatible/clientv3/balancer/picker/err.go:37:44: undefined: balancer.PickOptions ../../../../pkg/mod/github.com/coreos/etcd@v3.3.17+incompatible/clientv3/balancer/picker/roundrobin_balanced.go:55:54: undefined: balancer.PickOptions
解决办法:
打开go.mod文件,添加

replace google.golang.org/grpc => google.golang.org/grpc v1.26.0

再重新执行即可。

docker镜像安装

docker pull micro/micro

这里坑太多了~,先踩踩,后面再更吧。😭

以上是关于Go - Micro微服务框架实践 - API(十三)的主要内容,如果未能解决你的问题,请参考以下文章

go-micro微服务框架

go微服务框架go-micro深度学习-目录

go微服务学习 go-micro框架

go微服务学习 go-micro框架

微服务学习--micro和go-micro

go微服务学习 go-micro框架-—— micro安装