1、配置完成后,启动seata-server服务器,注册到nacos,启动client后访问接口,报错如下:
io.seata.common.exception.FrameworkException: No available service
at io.seata.core.rpc.netty.AbstractNettyRemotingClient.loadBalance(AbstractNettyRemotingClient.java:257)
at io.seata.core.rpc.netty.AbstractNettyRemotingClient.sendSyncRequest(AbstractNettyRemotingClient.java:133)
at io.seata.rm.AbstractResourceManager.branchRegister(AbstractResourceManager.java:67)
at io.seata.rm.DefaultResourceManager.branchRegister(DefaultResourceManager.java:96)
at io.seata.rm.datasource.ConnectionProxy.register(ConnectionProxy.java:238)
信息显示,seata没有可用的服务,此时一般为seata服务器中register的配置与client项目中register配置不一致导致。查看源码。
进入AbstractNettyRemotingClient报错位置。
发现address为null导致。打断点,发现inetSocketAddressList的size为空,所以进入lookup方法中。
我是用的是nacos,所以进入的NacosRegistryServiceImpl的lookup方法。
此处发现,service的获取与4个参数相关,对应配置为
#seata-server的应用名称
seata.registry.nacos.application=flyc-seata-server
#seata-server的组名
seata.registry.nacos.group=myseatagroup
#事务分组名称
seata.tx-service-group=service-order-group
#nacos中的配置
service.vgroupMapping.service-order-group default
分别对应seata-server中的配置register.conf
除此之外,还有一个参数,namespace,此处源码没有体现,但是在请求nacos获取seata的service列表中有体现。如下图,在NamingProxy中的请求中。
此处为想nacos请求注册在nacos的所有service,获取所有service的信息。如何到这一步的可以查看源码,一步步得到。同时,seata-client也有启动一个定时线程,定时更新注册在nacos中的service。在HostReactor中。
综上所述,如果seata报错,io.seata.common.exception.FrameworkException: No available service,需要检查client和sever的参数匹配情况,共有四个参数。
application = "flyc-seata-server"
group = "myseatagroup"
namespace = "1"
cluster = "default"
在使用nacos的情况下,client的配置是
#seata-server的应用名称
seata.registry.nacos.application=flyc-seata-server
#seata-server的组名
seata.registry.nacos.group=myseatagroup
#事务分组名称
seata.tx-service-group=service-order-group
#nacos中的配置
service.vgroupMapping.service-order-group=default
seata.registry.nacos.namespace=1