微服务架构下,使用REST进行微服务间交互,针对基础数据服务模块(以下简称A),目前陷入困镜,主要问题是:
日益增长的外部需求和应用,对数据访问接口提出过多定制化内容。使得开发疲于开发适配接口和适配模型,以满足应用各类要求
下面举例说明:
- 业务自身的业务需求或其它原因,已经定义好了数据模型,需要A提供额外的接口,返回他们定义的数据模型格式的数据
- 业务无后台,针对数据查询,只要有交互就提出一个接口得到想到所有数据,不接受多次查询或内部简单处理。即使A已经提供足够细粒度的接口实现。
- 业务需求对于接口不愿使用A中标准模型提供的接口(原因A作为基础模型需要应对多个场景,参数要求过多)
针对A的问题,解决方案参考如下:
应对策略1: 使用GraphQL改善部分按需获取问题
既然用户对于数据获取需求和接口的要求千变万化,那与其将接口定义逻辑放在A,不如开放接口编排功能给用户,由用户自己确定需要的数据。
其它策略:略
实现GraphQL总共四个步骤:
1、定义GraphQL数据类型(这步也可以通过定义schema文件实现)
2、定义暴露给客户端查询API
3、创建GraphQL Schema
4、执行输出
从hello,world开始
pom依赖
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-java</artifactId>
<version>8.0</version>
</dependency>
代码:
package com.zte.sunquan.demo.graph.ql;
import static graphql.Scalars.GraphQLString;
import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
import static graphql.schema.GraphQLObjectType.newObject;
import java.util.Map;
import graphql.GraphQL;
import graphql.schema.GraphQLObjectType;
import graphql.schema.GraphQLSchema;
import com.zte.sunquan.demo.model.User;
public class GraphQL_Simple {
public static void main(String[] args) {
//服务端示例数据
User user = new User();
user.setName("sunquan");
user.setGender("male");
user.setIntro("https://blog.youkuaiyun.com/sunquan291");
//定义GraphQL类型
GraphQLObjectType userType = newObject()
.name("User2")
.field(newFieldDefinition().name("name").type(GraphQLString))
.field(newFieldDefinition().name("gender").type(GraphQLString))
.field(newFieldDefinition().name("intro").type(GraphQLString))
.build();
//定义暴露给客户端的查询query api
GraphQLObjectType queryType = newObject()
.name("userQuery")
.field(newFieldDefinition().type(userType).name("user")
.dataFetcher(env -> {
return user;
}))
//.staticValue(user))
.build();
//创建Schema
GraphQLSchema schema = GraphQLSchema.newSchema()
.query(queryType)
.build();
//测试输出
GraphQL graphQL = GraphQL.newGraphQL(schema).build();
Map<String, Object> result = graphQL.execute("{user{name,gender,intro}}").getData();
System.out.println(result);
}
}