GraphQL实践(一)

微服务架构下,使用REST进行微服务间交互,针对基础数据服务模块(以下简称A),目前陷入困镜,主要问题是:

日益增长的外部需求和应用,对数据访问接口提出过多定制化内容。使得开发疲于开发适配接口和适配模型,以满足应用各类要求

下面举例说明:

  1. 业务自身的业务需求或其它原因,已经定义好了数据模型,需要A提供额外的接口,返回他们定义的数据模型格式的数据
  2. 业务无后台,针对数据查询,只要有交互就提出一个接口得到想到所有数据,不接受多次查询或内部简单处理。即使A已经提供足够细粒度的接口实现。
  3. 业务需求对于接口不愿使用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.csdn.net/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);
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值