Soul网关-day05
Soul-plugin-sofa测试
开始经过了一些曲折,首先不小心拉了最新的soul-master分支,启动了以后一切看起来十分正常;但是在soul-admin控制台上更换插件的时候,报了一个server端的错误,大概是说PluginTransfer这个类无法初化。关键的调用链路是PluginServiceImpl#listAll()方法;暂时只是发现这个问题,但并没有对其进行调试查看问题所在,似乎应该是哪里有变动;但,感觉可能会比较复杂,我决定还是先完成一些可以比较快能看到成果的东西。
所以为了尽快的完成今天的flag,我重新下了soul-2.2.1版本作为我的soul-admin以及soul-bootstrap的启动服务端,这个版本的soul-admin就没有那个问题了。
启动了双服务端后,满心欢喜的启动了soul-examples-sofa(当然,由于example中用到了zk,所以要先把zk服务起起来)。
但是,很明显事物的发展并没有那么的一帆风顺。启动过程中发现了万绿丛中一点红,如下图所示:
可以看到,这个红色的error非常扎眼;并不像起soul-example-http那么顺滑,也没有在soul-admin控制台上注册类似下图的这种东西:
那么问题出在哪呢?可以看到error后面有一个类路径:client.common.utils.RegisterUtils,那我们就找过去,可以看到方法里面非常简洁:
/**
* RegisterUtils.
*
* @author severez
*/
@Slf4j
public final class RegisterUtils {
private RegisterUtils() {
}
/**
* call register api.
*
* @param json request body
* @param url url
* @param rpcTypeEnum rcp type
*/
public static void doRegister(final String json, final String url, final RpcTypeEnum rpcTypeEnum) {
try {
String result = OkHttpTools.getInstance().post(url, json);
if (AdminConstants.SUCCESS.equals(result)) {
log.info("{} client register success: {} ", rpcTypeEnum.getName(), json);
} else {
log.error("{} client register error: {} ", rpcTypeEnum.getName(), json);
}
} catch (IOException e) {
log.error("cannot register soul admin param, url: {}, request body: {}", url, json, e);
}
}
}
只有一个doRegister方法,并且我们根据出错的内容可以判断出,大概是**AdminConstants.SUCCESS.equals(result)**这个判断语句为false;
找到这个点以后就可以开心的debug了,我比较感兴趣的是在soul-examples-sofa启动的时候究竟是做了些什么事,而从第21行看变量名可以大致推断出:它这里其实是发了一个http请求的;那么这个请求是发往哪?又发了些什么数据呢?
所以我把断电打在第21行这个点上:
json太长了,所以我把value拷贝出来进行了pretty处理:
{
"appName":"sofa",
"contextPath":"/sofa",
"path":"/sofa/insert",
"pathDesc":"Insert a row of data",
"rpcType":"sofa",
"serviceName":"org.dromara.soul.examples.dubbo.api.service.DubboTestService",
"methodName":"insert",
"ruleName":"/sofa/insert",
"parameterTypes":"org.dromara.soul.examples.dubbo.api.entity.DubboTest",
"rpcExt":"{\"loadbalance\":\"hash\",\"retries\":3,\"timeout\":-1}",
"enabled":true
}
经过一波理智分析,发现它是向 http://localhost:9095/soul-client/sofa-register 发送了几条json数据,反正出了几个error就发了几条数据,那么发送这些数据的依据是什么呢?
本着就近原则我们找到了:SofaTestServiceImpl
怎么样,上面红框框起来的数据是不是很熟悉,我们把ERROR的东西放大点来康康:
这里我们可以看到,path的部分就是源码中**@SoulSofaClient中配置的path**,而前缀,应该就是我们在application.yml中配置的属性:
而我们看到的 http://localhost:9095/soul-client/sofa-register 中的前半段应该也就是soul.sofa.adminUrl了。
大致分析完毕,但我现在还没有解决这个问题。既然知道了server端的端口,那么就可以很明确的定位到位置了,就是在soul-admin中,我点进2.2.1的soul-admin看了一眼,发现并没有相应的PostMapping:
@RestController
@RequestMapping("/soul-client")
public class SoulClientController {
private final SoulClientRegisterService soulClientRegisterService;
/**
* Instantiates a new Soul client controller.
*
* @param soulClientRegisterService the soul client register service
*/
public SoulClientController(final SoulClientRegisterService soulClientRegisterService) {
this.soulClientRegisterService = soulClientRegisterService;
}
/**
* Register spring mvc string.
*
* @param springMvcRegisterDTO the spring mvc register dto
* @return the string
*/
@PostMapping("/springmvc-register")
public String registerSpringMvc(@RequestBody final SpringMvcRegisterDTO springMvcRegisterDTO) {
return soulClientRegisterService.registerSpringMvc(springMvcRegisterDTO);
}
/**
* Register spring cloud string.
*
* @param springCloudRegisterDTO the spring cloud register dto
* @return the string
*/
@PostMapping("/springcloud-register")
public String registerSpringCloud(@RequestBody final SpringCloudRegisterDTO springCloudRegisterDTO) {
return soulClientRegisterService.registerSpringCloud(springCloudRegisterDTO);
}
/**
* Register rpc string.
*
* @param metaDataDTO the meta data dto
* @return the string
*/
@PostMapping("/dubbo-register")
public String registerRpc(@RequestBody final MetaDataDTO metaDataDTO) {
return soulClientRegisterService.registerDubbo(metaDataDTO);
}
}
可以看到2.2.1版本只支持
- springmvc
- springcloud
- dubbo
这三种服务注册方式。
…待完善