todo-service api 无法在 Swagger 中被识别

  • Choerodon平台版本:0.6.0

  • 运行环境(如localhost或k8s):localhost

  • 遇到问题时的前置条件:

    按照猪齿鱼后端开发手册尝试创建todo-service并发布至swagger

  • 问题描述:

    todo-service 正常运行,eureka 可以发现该服务,但swagger-ui中查不到任何与todo-service有关的api

所有的相关的服务均在本地已启动:

docker-compose ps
            Name                           Command               State                                  Ports
---------------------------------------------------------------------------------------------------------------------------------------------
c7n-backend_api-gateway_1       /bin/sh -c exec java $JAVA ...   Up      0.0.0.0:8080->8080/tcp
c7n-backend_eureka-server_1     /bin/sh -c exec java $JAVA ...   Up      0.0.0.0:8000->8000/tcp
c7n-backend_gateway-helper_1    /bin/sh -c exec java $JAVA ...   Up      0.0.0.0:9180->9180/tcp
c7n-backend_iam-service_1       /bin/sh -c exec java $JAVA ...   Up      0.0.0.0:8030->8030/tcp
c7n-backend_kafka-0_1           sh -c /opt/kafka/bin/kafka ...   Up      0.0.0.0:9092->9092/tcp
c7n-backend_manager-service_1   /bin/sh -c exec java $JAVA ...   Up      0.0.0.0:8963->8963/tcp
c7n-backend_mysql_1             docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp
c7n-backend_oauth-server_1      /bin/sh -c exec java $JAVA ...   Up      0.0.0.0:8020->8020/tcp
c7n-backend_redis_1             docker-entrypoint.sh redis ...   Up      0.0.0.0:6379->6379/tcp
c7n-backend_zookeeper-0_1       /opt/zookeeper/entrypoint. ...   Up      0.0.0.0:2181->2181/tcp, 0.0.0.0:2888->2888/tcp,
                                                                         0.0.0.0:3888->3888/tcp

http://localhost:8000

swagger-ui:

todo-service 启动入口:

package io.choerodon.todo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import io.choerodon.resource.annoation.EnableChoerodonResourceServer;

@SpringBootApplication
// 是否允许注册到注册中心,暂时注释掉
@EnableEurekaClient
// 是否开启猪齿鱼资源服务器
@EnableChoerodonResourceServer
public class TodoServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(TodoServiceApplication.class, args);
    }
}

CustomExtraDataManager

package io.choerodon.todo.infra.config;

import io.choerodon.core.swagger.ChoerodonRouteData;
import io.choerodon.swagger.annotation.ChoerodonExtraData;
import io.choerodon.swagger.custom.extra.ExtraData;
import io.choerodon.swagger.custom.extra.ExtraDataManager;

@ChoerodonExtraData
public class CustomExtraDataManager implements ExtraDataManager {
    @Override
    public ExtraData getData() {
        ChoerodonRouteData choerodonRouteData = new ChoerodonRouteData();
        choerodonRouteData.setName("todo");
        choerodonRouteData.setPath("/todo/**");
        choerodonRouteData.setServiceId("choerodon-todo-service");
        extraData.put(ExtraData.ZUUL_ROUTE_DATA, choerodonRouteData);
        return extraData;
    }
}

另外,请问一下 CustomExtraDataManager 的具体用法和作用是什么?不是很懂,谢谢!

CustomExtraDataManager是动态配置路由用的,ChoerodonRouteData里面的数据在部署该服务的时候会把数据插入到manager_service.mgmt_route表中。swagger ui下拉列表先查的route表,看下route表有没有todo-service这个路由,没有的话重启下todo-serivice试试,如果还没有的话,调用swagger界面 route-controller -> create方法新建一个路由:

{
    "name":"todo",
    "path":"/todo/**",
    "serviceId":"choerodon-todo-service"
}

但是我的服务启动的时候貌似并没有执行这个CustomExtraDataManager,我想知道原因是什么。这个类所在的包路径有什么要求么?会不会没有被扫描到?

扫描的是@ChoerodonExtraData注解,应该是都能扫到的

嗯,我的关键代码已经贴在OP上,您看有什么问题么?实际上现在就是没有执行。

请问这个问题有解么?

看下这个项目有没有引choerodon-starter-swagger这个包,然后看下这个服务有没有注册到注册中心。

项目中已经引入starter-swagger了:

<dependency>
     <groupId>io.choerodon</groupId>
     <artifactId>choerodon-starter-swagger</artifactId>
     <version>${choerodon.starters.version}</version>
</dependency>

注册中心也有注册:

你看看iam_permission表中有没有todo-service服务的permission,没有的话看下按我之前回的那个403帖子,调一下接口看看能不能刷进去权限,刷进去的话就是go-register -> manager-service这块的毛病,看下go-register有没有发消息到manager-service,看manager-service的日志,有没有接收到消息,然后发送消息到iam-service,刷不进去,看下iam-service日志的信息。

这是manager-service接受和发送消息的代码


下面是iam-service接受消息,插入到iam_permission表的代码