go微服务调用报错too many colons in address

  • 问题描述:
  • 问题分析
  • 解决方案
  • 两种方案的区别

问题描述:

我提取了关键部分的代码编写了单元测试,方便测试问题。给大家参考一下。这原先是大佬给的案例,我没见过这种写法,出于兴趣就按照案例写了一个demo,结果一写就出现报错。

func TestSrvConn(t *testing.T) {consulInfo := global.ServerConfig.Consuladdress := fmt.Sprintf("consul://%s:%d/%s?wait=14s", consulInfo.Host, consulInfo.Port, global.ServerConfig.GrpcSrv.Name)var bulider = NewBuilder()userConn, err := grpc.Dial(address,grpc.WithTransportCredentials(insecure.NewCredentials()),grpc.WithDefaultServiceConfig(`{"loadBalancingPolicy": "round_robin"}`),grpc.WithResolvers(bulider),)if err != nil {//zap.S().Fatal("[InitSrvConn] 连接 【用户服务失败】")fmt.Println("111", err)}//下面这段时尝试调用PingPong方法,测试是否在正常输出userSrvClient := proto.NewFileStoreGreeterClient(userConn)ping := proto.Ping{Stroke: 1111}res, err := userSrvClient.PingPong(context.Background(), &ping)fmt.Println("res", res)fmt.Println("err:::", err)fmt.Println("end")
}

然后,直接调用srv服务没问题,调用通过consul发现的srv服务会有此报错;

transport: Error while dialing dial tcp: address consul://192.168.32.90:8500/fileStore-srv?wait=14s: too many colons in address

问题分析

简单来说就是解析器的问题。如果你不是和我一样基于 conusl协议的,可以尝试把地址写成[协议://ip地址]:端口/endpoint 或者 [账号@密码:地址]:端口/endpoint这样说不定就解决了(也就是:端口前面的内容用中括号括起来)。

而grpc的包中,没有consul协议的解析器。所以会报错。

但是我对大佬给的模板debug时惊奇地发现,居然能看到consul.Resolver这个解析器,也就是说,它被自动引入了。

我在模板代码里找了半天,又去grpc的包中找,再去consul的包中去查找,都找不到哪里有些这个解析器。

快要放弃了的时候,突然灵光一闪,自动引入…


解决方案

其实在发现问题原因前,已经找到替代方案了。这样钻牛角尖,纯粹为了技术研究,拖这个问题的福,我对gprc底层的通信的实现原理全新的理解。

最终方案1:

import _ "github.com/mbobakov/grpc-consul-resolver"

就这么简单,懂的都懂…

替代方案:
通过client.Agent().ServicesWithFilter这个方法来发现服务并调用

//代码内容做了删减,只保留了重要部分
improt ""github.com/hashicorp/consul/api""
client, err := api.NewClient(cfg)
if err != nil {panic(err)
}//根据服务名或id查询grpc服务端地址
data, err := client.Agent().ServicesWithFilter(fmt.Sprintf(`Service=="%v"`, srvName))
if err != nil {panic(err)
}for _, value := range data {//把连接的gprc服务地址和端口复制到全局变量global.ServerConfig.GrpcSrv.Host = value.Addressglobal.ServerConfig.GrpcSrv.Port = value.Portbreak
}

两种方案的区别

grpc-consul-resolver 这个包导入即用,不需要关心任何实现过程。是基于grpc接口实现的专门针对consul的通信协议解析器。这个解析器的特点是每次进行函数请求时,都会通过consul来转发到服务端,而不是直接和服务端通信

client.Agent().ServicesWithFilter 这个方法是consul包内置的。可以用来自定义负载均衡的策略。简单易于理解,新手也有能力自行开发新功能。但是这个方法是基于http请求的,如果每次请求时,都调用这个方法,会损失一定性能。

go微服务调用报错too many colons in address相关推荐

  1. 【MS】微服务调用时,开放某个接口设置不需要oauth2 认证即可访问

    微服务调用时,开放某个接口设置不需要oauth2 认证即可访问 目标 是把不需要认证的接口给资源服务permitAll 思路 创建一个自定义的注解 把所有带注解的URL给资源服务permitAll 1 ...

  2. Feign调用报错:failed and no fallback available

    Feign调用报错:failed and no fallback available 这个问题耽误我半天,这里记下希望可以帮助有需要的人 网上搜了半天也改了半天硬是没找出问题在哪里,大部分是说改这个 ...

  3. 服务间调用报错:Load balancer does not have available server for client

    使用微服务架构后,不同团队使用同一个eureka和zuul,各团队之间注册到eureka的方式不一样,有的是指明instanceId为机器IP+端口,有的服务是指明instanceId为机器名称+端口 ...

  4. 记一次feign调用报错:feign.codec.DecodeException: Error while extracting response for type [java...

    弯路: 报错的内容就是feign被调用方返回的结果无法解析. 所以一直以为是被调用法的返回对象类型和调用方接收的对象类型不一致导致的解析失败,经检查字段完全一致: 又因为我们用了lombok,所以类上 ...

  5. 远程调用报错java.net.UnknownHostException 解决方法

    服务本来好好的,突然调用远程接口一直报java.net.UnknownHostException 解决方法,检查了一遍ip和路径都没问题,同一个接口用postman调用又没有问题,百思不得解... 最 ...

  6. 企业微信中打开的小程序wx.qy.getEnterpriseUserInfo接口调用报错42013

    当在企业微信中打开已关联的小程序,发现调用wx.qy.getEnterpriseUserInfo的接口是报错,如下图: 在调用wx.qy.getEnterpriseUserInfo之前,我是有先调wx ...

  7. CXF 客服端调用报错

    服务端已经发布了WSDL,现在在客服端生成web service客服端代码,在eclipse中新建一个project,然后new->web services->web service cl ...

  8. c mysql分页存储过程_mysql 分页存储过程调用报错

    以前没有写过存储过程,第一次写遇到了这个问题,没弄明白.希望哪位大神能给出的建议!!! sql 语句如下: CREATE DEFINER=`root`@`%` PROCEDURE `pager` ( ...

  9. cxf调用报错Could not find conduit initiator for address:

    依赖 <dependency> <groupId>org.apache.cxf</groupId>      <artifactId>cxf-rt-fr ...

  10. fegin get请求调用报错

    fegin get请求调用报错 Request method 'POST' not supported Result getDetailById(@RequestParam("couponP ...

最新文章

  1. 基于Picture Library创建的图片文档库中的上传多个文件功能(upload multiple files)报错怎么解决?...
  2. c++将小数化为二进制_C++版进制转换(十进制,二进制,十六进制整数和小数)
  3. 2021湖南高考成绩分段查询,2021年湖南高考分数一分一段位次表,湖南高考个人成绩排名查询方法...
  4. python代码基础题-python每日经典算法题5(基础题)+1(中难题)
  5. Python 学习笔记(1)Hello Python
  6. js粘贴板为什么获取不到图片信息_JavaScript 学习笔记(3):图片库
  7. C语言main()函数详解
  8. 新到的电脑BIOS中无法识别U盘
  9. idea+selenium代码_你试过使用selenium爬虫抓取数据吗
  10. 配置suse syslog服务器
  11. java程序中,如何设置周一为一周的开始?如何设置周一为一周的第一天? 或者说,如何理解java的setFirstDayOfWeek()方法?
  12. 100 个网络基础知识普及,看完成半个网络高手!
  13. mySQL插入数据自动生成时间
  14. h3c无线管理 dns服务器,H3C FIT AP与AC连接时三种的注册流程
  15. 2022年Work-Life Balance能实现吗?
  16. awgn信道中的噪声功率谱密度_Ruminate: 噪声的功率谱密度与方差
  17. Tensorflow 笔记 XIV——生成式对抗网络:GAN 与 CGAN
  18. 谁是IPFS中国区“奶王”?IPFS.FUND周欢当仁不让
  19. Mysql优化之使用短索引
  20. 边缘检测 Hough变换 轮廓提取 种子填充 轮廓跟踪

热门文章

  1. TV(电视)应用开发指南
  2. centOS7安装redis单例配置主从+哨兵+VIP
  3. Paypal 与Moneybookers
  4. 《运动改造大脑》总结
  5. MySQL错误Got error -1 from storage engine
  6. DUBBO启动为啥不用web容器启动
  7. 视频像素、分辨率、清晰度关系及区别
  8. 调用百度地图进行路线规划
  9. 房产过户给子女,那种方式比较合适
  10. 手把手教你申请CSDN博客专家(2021新鲜出炉)