共计 2222 个字符,预计需要花费 6 分钟才能阅读完成。
Netflix 已凋谢其 Domain Graph Service(DGS)框架的源代码,该框架是为了不便整合 GraphQL 应用,用于简化 GraphQL 的实现。
GraphQL 次要是作用于数据接口,比方前端后端交互。无需定义或批改后盾 Controller、Service 等业务代码即可实现灵便的数据变更,客户端能够自在获取服务端 当时定义好的数据,进步了交互接口的灵活性
组件依赖
- graphql-dgs-spring-boot-starter
<dependency> | |
<groupId>com.netflix.graphql.dgs</groupId> | |
<artifactId>graphql-dgs-spring-boot-starter</artifactId> | |
<version>3.5.1</version> | |
</dependency> |
- DGS 必须从 jcenter 下载, 不然局部依赖无奈下载。踩坑很久
<profiles> | |
<profile> | |
<activation> | |
<activeByDefault>true</activeByDefault> | |
</activation> | |
<repositories> | |
<repository> | |
<snapshots> | |
<enabled>false</enabled> | |
</snapshots> | |
<id>central</id> | |
<name>bintray</name> | |
<url>https://jcenter.bintray.com</url> | |
</repository> | |
</repositories> | |
<pluginRepositories> | |
<pluginRepository> | |
<snapshots> | |
<enabled>false</enabled> | |
</snapshots> | |
<id>central</id> | |
<name>bintray-plugins</name> | |
<url>https://jcenter.bintray.com</url> | |
</pluginRepository> | |
</pluginRepositories> | |
<id>bintray</id> | |
</profile> | |
</profiles> |
定义接口 schema
- /src/main/resources/schema/schema.graphqls
此文件定义了客户端申请入参格局和查问数据类型
type Query {shows(title: String ,releaseYear: Int): [Show] | |
} | |
type Show { | |
title: String | |
releaseYear: Int | |
} |
定义数据抽取规定
@DgsComponent | |
public class ShowsDatafetcher {@DgsData(parentType = "Query", field = "shows") | |
public List<Show> shows(@InputArgument("title") String title, @InputArgument("releaseYear") Integer releaseYear) {if (title == null) {return shows;} | |
return shows.stream().filter(s -> s.getTitle().contains(title)).collect(Collectors.toList()); | |
} | |
// 模仿 DB 查问 | |
private final List<Show> shows = List.of(new Show("java", 1995), | |
new Show("php", 1995), | |
new Show("python", 1990), | |
new Show("golang", 2009), | |
new Show("rust", 2015) | |
); | |
} |
UI 前端调试
- 拜访: http://localhost:8080/graphiql
- 条件查问
接口调用
curl --location --request POST 'http://localhost:8080/graphql' \ | |
--header 'Content-Type: application/json' \ | |
--data-raw '{"query":"{\n shows(title: \"java\", releaseYear: 1995) {\n title\n releaseYear\n}\n}\n","variables":null}' |
java 调用
@SpringBootTest(classes = {DgsAutoConfiguration.class, ShowsDatafetcher.class}) | |
class ShowsDatafetcherTests { | |
@Autowired | |
DgsQueryExecutor dgsQueryExecutor; | |
@Test | |
void shows() { | |
List<String> titles = dgsQueryExecutor.executeAndExtractJsonPath("{ shows { title releaseYear}}", | |
"data.shows[*].title"); | |
assertThat(titles).contains("java"); | |
} | |
} |
本节源码
源码: https://github.com/lltx/dgs-demo
DGS 官网: https://netflix.github.io/dgs
>>> 源码 https://gitee.com/log4j/pig,欢送署名转载 <<<
正文完