1

我对 Apollo Federation 和 Gateway 很陌生,并尝试将apollo federation-jvm用于演示项目。我使用联合 jvm 创建了两个联合服务。这两项服务都通过 Apollo Gateway 相互连接。使用他们官方 github 页面中的这个节点网关示例。

以下是这些服务的架构和解析器:

联合服务 1:

视频.graphql

type Video @key(fields: "videoId") {
    videoId: String!
    description: String
    relatedNameId: String
}

type Query {
    topVideo: Video
    allVideos: [Video]
}

video.graphql 的解析器

@Service
public class VideoQuery implements GraphQLQueryResolver {

    private static final List<Video> videos = Lists.newArrayList(
            Video.builder().videoId("vi00000001").description("Video 1").relatedNameId("nm000001").build(),
            Video.builder().videoId("vi00000002").description("Video 2").relatedNameId("nm000001").build()
    );

    public Video topVideo() {
        return videos.get(0);
    }

    public List<Video> allVideos() {
        return videos;
    }
}

联合服务2:

名称.graphql

type Name @key(fields: "nameId") {
    nameId: String!
    displayName: String
}

type Query {
    getByNameId(nameId: String): Name
    getAllNames: [Name]
}

name.graphql 的解析器

@Service
public class NameQuery implements GraphQLQueryResolver {

    private static final List<Name> names = Lists.newArrayList(
            Name.builder().nameId("nm0000001").displayName("Pam Beesley").build(),
            Name.builder().nameId("nm0000002").displayName("Dwight Schrute").build(),
            Name.builder().nameId("nm0000003").displayName("Michael Scott").build()
    );

    public Name getByNameId(final String nameId) {
        final Optional<Name> oName = names.stream().filter(name -> name.getNameId().equalsIgnoreCase(nameId))
                                     .findFirst();
        return oName.orElse(null);
    }

    public List<Name> getAllNames(final DataFetchingEnvironment dataFetchingEnvironment) {
        return names;
    }

}

我可以通过网关在两种服务的类型查询中调用所有 API(topVideo、allVideos、getByNameId、getAllNames),没有任何问题。

但是,当我通过将以下内容添加到 video.graphql 架构来扩展视频类型架构中的名称类型时

type Name @key(fields: "nameId") @extends {
    nameId: String! @external
    getVideoByNameId: [Video]
}

我不确定如何为getVideoByNameId字段编写解析器。

我尝试将方法 getVideoByNameId(String nameId)添加到 VideoQuery.java (从 getVideoByNameId 方法返回硬编码视频对象),但图表始终返回 null。

我还尝试使用下面的代码创建 RuntimeWiring,然后在创建 GraphQLSchema 对象时传递它,如他们github 页面上的示例所示

private static RuntimeWiring getRuntimeWiring(){
        return RuntimeWiring.newRuntimeWiring()
                            .type(newTypeWiring("Name")
                                                  .dataFetcher("getVideoByNameId", new StaticDataFetcher(someVideo)))
                            .type(newTypeWiring("Query")
                                                  .dataFetcher("topVideo", new StaticDataFetcher(someVideo)))
                            .type(newTypeWiring("Query")
                                                  .dataFetcher("allVideos", new StaticDataFetcher(someVideo)))
                            .build();
    }

似乎没有任何效果。非常感谢任何帮助。

4

1 回答 1

2

您需要为您的类型实现fetchEntities和它们在此处实现的方式类似。resolveEntityTypeName

于 2020-01-27T08:41:18.970 回答