网站首页 > 文章中心 > 其它

go语言rpc路由

作者:小编 更新时间:2023-09-09 08:01:31 浏览量:115人看过

GoLang -- gRPC框架四大服务

通过运行下面的命令克隆并安装grpc-go代码库:

安装golang-protobuf

第一步使用 protocol buffers去定义 gRPC service 和方法 request 以及 response 的类型.

要定义一个服务,必须在.proto 文件中指定 service:

go语言rpc路由-图1

服务.proto文件如下所示:

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

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 制定的安全协议.

go语言rpc路由-图2

可以选择是否配置白名单

API服务支持TLS证书

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

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

完整示例可以参考: 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解析器有点不太一样.

go语言实现一个简单的简单网关

网关=反向代理+负载均衡+各种策略,技术实现也有多种多样,有基于 nginx 使用 lua 的实现,比如 openresty、kong;也有基于 zuul 的通用网关;还有就是 golang 的网关,比如 tyk.

这篇文章主要是讲如何基于 golang 实现一个简单的网关.

转自: troy.wang/docs/golang/posts/golang-gateway/

整理:go语言钟文文档:

启动两个后端 web 服务(代码)

这里使用命令行工具进行测试

具体代码

直接使用基础库 httputil 提供的NewSingleHostReverseProxy即可,返回的reverseProxy对象实现了serveHttp方法,所以呢可以直接作为 handler.

director中定义回调函数,入参为*http.Request,决定如何构造向后端的请求,比如 host 是否向后传递,是否进行 url 重写,对于 header 的处理,后端 target 的选择等,都可以今天这一节完成.

director今天这一节具体做了:

modifyResponse中定义回调函数,入参为*http.Response,用于修改响应的信息,比如响应的 Body,响应的 Header 等信息.

最终依旧是返回一个ReverseProxy,然后将这个对象作为 handler 传入即可.

随便 random 一个整数作为索引,然后取对应的地址即可,实现比较简单.

使用curIndex进行累加计数,一旦超过 rss 数组的长度,则重置.

后端真实节点包含三个权重:

操作步骤:

一致性 hash 算法,主要是用于分布式 cache 热点/命中问题;这里用于基于某 key 的 hash 值,路由到固定后端,但是只能是基本满足流量绑定,一旦后端目标节点故障,会自动平移到环上最近的那么个节点.

实现:

每一种不同的负载均衡算法,只需要实现添加以及获取的接口即可.

然后使用工厂方法,根据传入的参数,决定使用哪种负载均衡策略.

作为网关,中间件必不可少,这类包括请求响应的模式,一般称作洋葱模式,每一层都是中间件,一层层进去,然后一层层出来.

中间件的实现一般有两种,一种是使用数组,然后配合 index 计数;一种是链式调用.

以上就是土嘎嘎小编为大家整理的go语言rpc路由相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章