Go-Micro客户端请求报500错误的解决方法

news/2024/10/4 18:59:33

Go-Micro客户端请求报500错误的解决方法

1.服务端代码

package mainimport ("github.com/gin-gonic/gin""github.com/micro/go-micro/registry""github.com/micro/go-micro/web""github.com/micro/go-plugins/registry/consul""net/http"
)func main() {consulReg := consul.NewRegistry(registry.Addrs(":8500"))engine := gin.Default()engine.POST("/hello", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"msg": "hello,world",})})service := web.NewService(web.Name("cas"),web.Address(":8001"),web.Registry(consulReg),web.Handler(engine),)service.Init()service.Run()
}

 

 

2.客户端代码

 
package mainimport ("context""github.com/micro/go-micro/client""github.com/micro/go-micro/client/selector""github.com/micro/go-micro/registry""github.com/micro/go-plugins/client/http""github.com/micro/go-plugins/registry/consul""log"
)func main() {consulReg := consul.NewRegistry(registry.Addrs(":8500"))selector := selector.NewSelector(selector.Registry(consulReg),selector.SetStrategy(selector.RoundRobin),)httpClient := http.NewClient(// 选择器
        client.Selector(selector),// 响应格式默认格式protobuf,设置为jsonclient.ContentType("application/json"),)req := map[string]string{}request := httpClient.NewRequest("cas", "/hello", req)rsp := map[string]interface{}{}err := httpClient.Call(context.Background(), request, &rsp)if err != nil {log.Fatalf("request err: %+v", err)}log.Printf("%+v",rsp)
}

 

 

3.发起请求报错

客户端请求报错如下:

代码语言:javascript
复制
{"id":"go.micro.client","code":500,"detail":"none available","status":"Internal Server Error"}

4.问题分析

1.顺着客户端调用的Call()方法,进入源码github.com\micro\go-plugins\client\http\http.go,找到获取服务节点的方法:

// get next nodes from the selectornext, err := h.next(req, callOpts)

 

2.再继续查看next()方法,找到第63行,这里为Selector节点选择器添加了过滤器,传递了两个参数"protocol", "http",可以发现是个键值对:

// only get the things that are of mucp protocolselectOptions := append(opts.SelectOptions, selector.WithFilter(selector.FilterLabel("protocol", "http"),))

 

	

3.进一步进入FilterLabel()方法,在第41行可以发现,上一步传的两个参数在这里做了校验,分别作为的Metadata(元数据)的map的键和值,相当于验证协议需要为http:

    if node.Metadata[key] == val {nodes = append(nodes, node)}

 

			

4.回到http.go的69行,如果不满足http协议,则获取服务节点失败,返回我们所遇到的这个err:

// get next nodes from the selectornext, err := h.opts.Selector.Select(service, selectOptions...)if err != nil && err == selector.ErrNotFound {return nil, errors.NotFound("go.micro.client", err.Error())} else if err != nil {return nil, errors.InternalServerError("go.micro.client", err.Error())}

 

	

到这里其实已经可以基本确定我们遇到的问题了:在使用go-plugins插件进行服务调用时,在服务发现时为选择器添加了过滤,限定了请求协议,要求Metadata的键值必须为"protocol":"http",否则返回的服务节点切片长度将为0。

5.解决方法

因此解决方法则是在服务端进行服务注册的时候,为注册的服务添加上Metadata配置,指定请求协议为http:

    service := web.NewService(web.Name("cas"),web.Address(":8001"),web.Registry(consulReg),web.Handler(engine),// 为注册的服务添加Metadata,指定请求协议为httpweb.Metadata(map[string]string{"protocol" : "http"}),)

 

在指定了服务的请求协议后,成功解决该问题~😄

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/67737.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

9-贪心算法

参考:代码随想录 题目分类大纲如下:贪心算法理论基础 什么是贪心? 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 贪心的套路(什么时候用贪心) 贪心算法并没有固定的套路,说白了就是常识性推导加上举反例。靠自己手动模拟,如果模拟可行,就可以试一试贪心策略…

【VMware VCF】使用 SoS 实用程序检查 VCF 环境的运行状态以及收集组件的日志信息。

VMware Cloud Foundation 解决方案中有一个叫 Supportability and Serviceability(SoS)可支持性和可维护性的实用程序,可能你在初始构建 VCF 管理域的时候使用过这个工具,当时使用这个工具在 VMware Cloud Builder 虚拟机中将用于部署的 VCF 管理域的 Excel 参数表转换为 J…

PbootCMS数据库配置,修改为Mysql数据库,配置Mysql出错解决办法

如果你在将PbootCMS从SQLite切换到MySQL时遇到了连接问题,可以按照以下步骤进行排查和解决: 步骤 1: 修改数据库连接驱动类型 确保你正确地修改了数据库连接驱动类型。PbootCMS支持多种数据库驱动,你可以逐一尝试不同的驱动类型。 步骤 2: 修改数据库服务器地址 将数据库服务…

第八届2024御网杯WP

WEBinput_data使用工具https://github.com/kost/dvcs-ripper./rip-svn.pl -u http://101.200.58.4:10005/.svn下载下来.svn目录然后查看结构发现几个文件cd进去目录,然后cat 文件名字即可看到 flag{5674938f-803d-4c41-8f84-a77f5164bb4f}Flag: flag{5674938f-803d-4c41-8f84…

给PbootCMS增加换行标签br=1

在 PbootCMS 中,如果你需要在前端显示一个包含换行符的简介字段,并且希望这些换行符能够正确显示为 HTML 中的换行,可以通过自定义解析器来实现这一功能。以下是详细的步骤: 步骤 1: 修改 ParserController.php 文件打开文件: 打开 \apps\home\controller\ParserControlle…

pbootcms如何显示按文章内容搜索,而不是搜索标题

在 PbootCMS 中,默认情况下搜索功能通常是基于文章标题进行的。如果你想让搜索功能基于文章内容进行,可以通过以下步骤实现: 步骤 1: 修改搜索表单 在搜索表单中添加一个隐藏字段 field,并将它的值设为 content。这样可以让系统知道搜索时应该针对文章内容进行匹配。 修改后…

PbootCMS文章列表序号怎么写?

根据你提供的信息,我们可以进一步了解如何使用 pboot:list 标签,并结合 [list:n]、[list:i] 和 [list:id] 进行一些实用的功能实现。下面是一些具体的示例和应用场景: 1. 显示列表序号 假设我们需要显示一个列表,并且希望序号从 0 开始:html{pboot:list num=10} <li>…

PbootCMS隐藏指定 scode 的菜单各种条件判断和标签

{pboot:nav} <li {pboot:if([nav:scode] == 2 || [nav:scode] == 4 || [nav:scode] == 6)}style="display: none;"{/pboot:if}><a href="[nav:link]">{nav:name}</a> </li> {/pboot:nav}扫码添加技术【解决问题】专注中小企业网站…