问题记录
- 一、问题描述
- 1.1 问题复现
- 1.1.1 将Linux中的部分微服务启动
- 1.1.2 在本地启动当时出错的服务
- 1.2 解决思路
- 1.2.1 Nacos中seata相关的信息
- 1.2.2 Linux中seata相关的信息
- 二、问题解决
- 2.1 seata的配置错误
- 2.1.1 Nacos中seata的配置问题
- 2.1.2 命名空间问题的发现
- 2.2 网络连接(一个小失误)
- 三、问题总结
一、问题描述
1.1 问题复现
1.1.1 将Linux中的部分微服务启动
docker start xxx
docker ps -a
- 然后这些服务都会被注册到nacos中
- 包含一些通用的配置服务
1.1.2 在本地启动当时出错的服务
- 启动后,刷新前端页面,出现了报错异常,报错信息为
no available service found in cluster 'default',please make sure registry config correct and keep your seata server running
- 看报错内容说明是在集群default中没有找到可用的服务,确保配置文件正确并保证seata服务正常启动
1.2 解决思路
根据这个异常提示信息,我先是查看了nacos中的seata相关的配置信息,然后又去linux中查看了seata的日志信息
1.2.1 Nacos中seata相关的信息
- 首先seata服务启动是正常的
- 检查seata的yaml文件内容,没有发现什么问题
1.2.2 Linux中seata相关的信息
- 查看linux中seata的日志信息,看看有没有报错提示
docker logs -f seata
- 发现了一些与Mysql相关的错误信息,好像是Mysql没有连接上
- 然后查看MySql的日志信息
docker logs -f mysql
- MySQL中没有发现特别的报错信息,但是有一个“不允许操作”的提示
二、问题解决
由于我这篇文章是解决完问题之后才总结的,我觉得应该会有一些读者大佬在看到我上面的问题复现时就已经看出问题所在了,我当时在找的时候确实没有发现,不过后来发现后在解决的时候又有一个小失误
2.1 seata的配置错误
- 其实问题一开始就可以找到,只是我对这块不是很熟悉,我这里的错误需要对照两块内容:
-
- 一个就是异常中提到的集群‘default’中找不到可用的微服务,这是因为我的Nacos中seata的配置文件里没有配置集群‘default’
-
- 至于另一个当时没有发现命名空间的问题,这还是在看到Linux中seata的配置文件里的命名空间跟Nacos中的不一样才明白过来
2.1.1 Nacos中seata的配置问题
错误版本:
seata:registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址type: nacos # 注册中心类型 nacosnacos:server-addr: 192.168.113.128:8848 # nacos地址namespace: "c975b6f4-de7e-40ad-9b15-4a245ce7a2ef" # namespace,默认为空group: DEFAULT_GROUP # 分组,默认是DEFAULT_GROUPapplication: seata-server # seata服务名称username: nacospassword: nacostx-service-group: tjxt # 事务组名称service:vgroup-mapping: # 事务组与cluster的映射关系tjxt: "default"
- 这里是没有配置集群cluster及后面发现的命名空间的错误
正确版本:
seata:registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址type: nacos # 注册中心类型 nacosnacos:server-addr: 192.168.113.128:8848 # nacos地址namespace: "f923fb34-cb0a-4c06-8fca-ad61ea61a3f0"cluster: "default"group: DEFAULT_GROUP # 分组,默认是DEFAULT_GROUPapplication: seata-server # seata服务名称username: nacospassword: nacostx-service-group: tjxt # 事务组名称service:vgroup-mapping: # 事务组与cluster的映射关系tjxt: "default"
2.1.2 命名空间问题的发现
- 这个问题起初是在Linux中seata的配置文件中发现的
docker exec -it seata bash
ls
cd resources/
cat application.yml
- 找到seata的部分,发现命名空间不一样
- 其实最后才发现,这里的命名空间就是Nacos中微服务—>服务列表后面的内容:
2.2 网络连接(一个小失误)
- 解决完这些后发现还是报错,尝试了好久发现网络ping不通,最后发现是我的Windows防火墙没关,这样才导致我本地访问不到Linux中的IP和端口。
- 至此,问题解决!
三、问题总结
导致这次问题出现的原因有两个:
- 1.第一个就是seata的配置问题,这里要注意检查Nacos中的配置和Linux容器中seata的配置
- 2.第二个是网络连接的问题,在本地与虚拟机之间要进行网络连接,需要关闭双方的防火墙,避免访问不到对方的IP和端口。