Seata Failed to get available servers: endpoint format should like ip:port 报错原因/解决方案汇总版(看完本文必解决问题)

网友投稿 532 2022-11-30

Seata Failed to get available servers: endpoint format should like ip:port 报错原因/解决方案汇总版(看完本文必解决问题)

文章目录

​​一、详细报错信息​​​​二、原因分析​​

​​原因1:`service.vgroupMapping`配置的服务组名称不符合Seata默认要求;​​​​原因2:`service.vgroupMapping`配置的seata集群名称没有对应的grouplist​​

​​三、解决方案​​

​​方案1、将file.conf中service.vgroupMapping配置调整为`${spring.application.name}-seata-service-group`;​​​​方案二、在application.yml中指定`seata.tx-service-group`​​

​​spring.cloud.alibaba.seata.tx-service-group 和 seata.tx-service-group​​

​​四、seata集群名称的坑​​

一、详细报错信息

springcloud 集成 seata1.3.0 时报错:

2022-08-04 00:00:00.000 ERROR 78958 --- [eoutChecker_2_1] i.s.c.r.netty.NettyClientChannelManager : Failed to get available servers: endpoint format should like ip:portjava.lang.IllegalArgumentException: endpoint format should like ip:port at io.seata.discovery.registry.FileRegistryServiceImpl.lookup(FileRegistryServiceImpl.java:95) ~[seata-all-1.3.0.jar:1.3.0] at io.seata.core.rpc.netty.NettyClientChannelManager.getAvailServerList(NettyClientChannelManager.java:217) ~[seata-all-1.3.0.jar:1.3.0] at io.seata.core.rpc.netty.NettyClientChannelManager.reconnect(NettyClientChannelManager.java:162) ~[seata-all-1.3.0.jar:1.3.0] at io.seata.core.rpc.netty.AbstractNettyRemotingClient$1.run(AbstractNettyRemotingClient.java:106) [seata-all-1.3.0.jar:1.3.0] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_275] at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [na:1.8.0_275] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_275] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) [na:1.8.0_275] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_275] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_275] at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [netty-all-4.1.58.Final.jar:4.1.58.Final] at java.lang.Thread.run(Thread.java:748) [na:1.8.0_275]

二、原因分析

本文基于seata1.3.0版本,代表这1.X的版本,0.x版本的略有不同。

在文件类型的注册服务时,会通过​​FileRegistryServiceImpl#lookup(String)​​方法根据VgroupMapping的key去寻找可用的Seata-server实例;报错的体现正是无法根据​​service.VgroupMapping​​这个配置找到具体的Seata实例(IP:PORT信息);

几个字符串常量值如下:

String PREFIX_SERVICE_MAPPING = "vgroupMapping."; String PREFIX_SERVICE_ROOT = "service"; String CONFIG_SPLIT_CHAR = "."; private static final String POSTFIX_GROUPLIST = ".grouplist"; private static final String ENDPOINT_SPLIT_CHAR = ";"; private static final String IP_PORT_SPLIT_CHAR = ":";

获取当前服务组名称对应的seata集群名称的代码逻辑如下:

针对 ​​service.vgroupMapping​​​,​​官方案例:Spring Cloud 快速集成 Seata​​是这么说的:

划重点:需要注意的是 ​​service.vgroupMapping​​这个配置,在 Spring Cloud 中默认是​​${spring.application.name}-fescar-service-group​​

再看博主debug时的默认 ​​service.vgroupMapping​​配置,居然是​​${spring.application.name}-seata-service-group​​;

我程序的​​spring.application.name​​​为​​trade-center​​​​service.vgroupMapping​​​的配置为​​trade-center-seata-service-group​​,不说好的是​​${spring.application.name}-fescar-service-group​​吗!!!!!!!

等下我们再继续说,先让我喷一会:​​***********​​​,官方文档不更新的吗?不注意版本之间的差异吗?不标明版本差异吗?​​******​​。

所以原因本质上只有一个:无法根据​​service.VgroupMapping​​这个配置找到具体的Seata实例(IP:PORT信息);但导致该原因产生的方式会有很多种;

原因1:service.vgroupMapping配置的服务组名称不符合Seata默认要求;

前提:不在application.yml配置文件中手动通过​​seata.tx-service-group​​属性指定seata服务组名称。

默认 ​​service.vgroupMapping​​​这个配置,在 Spring Cloud 中默认是​​${spring.application.name}-seata-service-group​​

所以,当我们未按​​${spring.application.name}-seata-service-group​​​这个规则配置​​service.vgroupMapping​​时会报错。

报错配置样例:

解决方案对应下面的方案一、方案二。

原因2:service.vgroupMapping配置的seata集群名称没有对应的grouplist

比如:这里我配置的​​service.vgroupMapping​​​值为​​seata-server-sh​​​,而配置的grouplist是属于​​default​​的;

所以报错是因为通过​​service.vgroupMapping​​​配置找到seata集群名称​​seata-server-sh​​​,但是​​seata-server-sh​​没有对应的grouplist,即seata实例信息。

解决方案:把grouplist的的所属方调整为和​​service.vgroupMapping​​配置的seata集群名称一致;

三、解决方案

方案1、将file.conf中service.vgroupMapping配置调整为${spring.application.name}-seata-service-group;

就博主程序而言,application.yml、file.conf配置如下:

1> application.yml:

spring: application: name: trade-center

2> file.conf关键配置:

方案二、在application.yml中指定seata.tx-service-group

就博主程序而言,application.yml、file.conf配置如下:

1> application.yml:

spring: application: name: trade-centerseata: # tx-service-group的值一定要和file.conf中service.vgroupMapping配置对应上 tx-service-group:

或者使用:

spring: application: name: trade-center cloud: alibaba: seata: # tx-service-group的值一定要和file.conf中service.vgroupMapping配置对应上 tx-service-group:

2> file.conf关键配置:

我们注意到可以使用​​spring.cloud.alibaba.seata.tx-service-group​​ 或 ​​seata.tx-service-group​​ 属性指定​​service.vgroupMapping​​配置,为啥呢?

spring.cloud.alibaba.seata.tx-service-group 和 seata.tx-service-group

​​spring.cloud.alibaba.seata.tx-service-group​​​ 属于​​SpringCloudAlibabaConfiguration​​类:

​​seata.tx-service-group​​​ 属性属于​​SeataProperties​​类:

而​​SeataProperties​​​类又被注解​​@EnableConfigurationProperties(SpringCloudAlibabaConfiguration.class)​​​标注,所以会使​​SpringCloudAlibabaConfiguration​​​的配置生效;又​​SeataProperties​​​类中通过​​@Autowired​​​的方式组合了​​SpringCloudAlibabaConfiguration​​​,在通过​​getTxServiceGroup()​​​方法获取​​txServiceGroup​​​属性时如果​​SeataProperties​​​类自己没有配置​​txServiceGroup​​​,则从​​SpringCloudAlibabaConfiguration​​中获取;

简单来说;就是优先取 ​​seata.tx-service-group​​​ 属性值,没有则再取​​spring.cloud.alibaba.seata.tx-service-group​​属性值。

四、seata集群名称的坑

seata-server和 项目程序 部署在不同的机器上时,可能会出现 ​​can not connect to services-server​​。

如果配置的 ​​default.grouplist​​​ = “192.168.7.254:8091”,则并不会生效,​​default.grouplist​​​读取的还是默认的​​127.0.0.1:8091​​;

建议把seata集群名称调整为非dafault,例如:

service { vgroupMapping.saint_trade_tx_group = "seata-server-sh" seata-server-sh.grouplist = "127.0.0.1:8091"}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:小程序(1702H)
下一篇:spring validation多层对象校验教程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~