GraphQL初探:Java服务示例及Yahoo/Elide

周末想理一理一件事可不可以干,大致上就是:假设存储各种各样的数据,如何保证读取是足够灵活的——用户只需声明式地说明需要什么内容,而接口就可以完成工作。简单理解就是一个接口完成所有功能。做了些GraphQL入门,初步感觉还不错。

1. 什么是GraphQL?

GraphQL本身只是个查询规范,管查询不管实现。自行搜索吧,本人已经对写入门文章不感冒了,网上的介绍一大堆。推荐How To GraphQL,只需要4个视频合计42分钟,就可以了解到GraphQL的方方面面,实现上的一些要点也是有所涉及。着重需要理解两点:

  1. Schema文件:不仅仅包含字段类型、关系,还包含查询方法,整体与thrift的RPC定义相似;Java中一般大量使用到Bean的映射,额外一份定义文件有点繁琐。
  2. Resolvers:拼接的每个字段都对应一个Resolver。这里就是服务优化的关键点了,GraphQL本身不关心后端需要进行什么操作,也有很大的优化空间。

2. GraphQL的基础Java服务

Java项目示例Getting Started with Spring Boot,项目可以从graphql-java/tutorials下载,代码有些特点:

  1. 需要一份schema.graphqls定义
  2. 需要一份Java Bean定义
  3. 需要对schema中的的每一个字段定义DataFetcher
  4. DataFetcher与shema中的内容做Wiring

这样看来想做一个灵活的API查询还是很麻烦的。

3. 基于Elide的GraphQL服务

什么是Elide?(本人是从开源中国的日更中得知,看来对开拓眼界还是有帮助的)

Stand up {json:api} & GraphQL web services backed by JPA annotated models in 4 simple steps

特点:

  1. 无需重复的Schema定义,回到了人见人爱的Java Bean注解(JPA);
  2. 定义了一整套完整的查询/更新机制;
  3. Resolver相关的工作隐藏在了JPA背后,大大降低了代码难度。

从项目的介绍以及相关示例项目来看,基本可以推断:

  1. 在GraphQL推出的前后,各家公司包括Yahoo!在内,都在做着类似的事情,只不过Yahoo没有画大饼,只是想做一套灵活的Json API
  2. Json API这一套能够很容易地实现GraphQL
  3. Yahoo!没有死,技术仍然不弱

3.1 示例项目1:官方的elide-blog-example

体验GraphQL需要增加一点点内容开启:

  1. Main.java增加GraphQL的Endpoint

    // graphql
    final ServletHolder graphqlServletHolder = servletContextHandler.addServlet(ServletContainer.class, "/graphql/*");
    graphqlServletHolder.setInitOrder(2);
    graphqlServletHolder.setInitParameter("jersey.config.server.provider.packages", GraphQLEndpoint.class.getPackage().getName());
    graphqlServletHolder.setInitParameter("javax.ws.rs.Application", ElideResourceConfig.class.getCanonicalName());
    
  2. pom中增加依赖

    <dependency><groupId>com.yahoo.elide</groupId><artifactId>elide-graphql</artifactId><version>4.4.5</version>
    </dependency>
    

测试需要使用 http://localhost:8080/api/graphql/v1

这个项目是极简的Servlet项目,可能整合其它的东西会有点麻烦(比如视spring为所有java web服务的我),这个时候可以使用elide-spring-starter来与spring进行整合。

3.2 示例项目2:elide-spring-boot-sample

检出illyasviel/elide-spring-boot整个项目,打开elide-spring-boot-sample,在pom中增加依赖开启GraphQL支持

<dependency><groupId>com.yahoo.elide</groupId><artifactId>elide-graphql</artifactId><version>${elide.version}</version>
</dependency>

测试使用http://localhost:8080/api/graphql/

3.3 Elide中的GraphQL查询

如果不认真读文档,可能真的话怎么都试不出来elide的url是什么,试出来url了又会觉得elide的查询怎么跟教学视频里面不一样,怎么都试不出一个正确的。

Elide的GraphQL不是那种很直观的,比如一个典型的查询是这样的。

{ user {edges {node {idusername password } }}
}

这就涉及到Elide的设计和封装了

当然,graphql-playground这样的工具可以自动拉取schema(连上后服务会一直打日志,可别以为循环?报错了),如果能够通过schema写出上面的查询,也能说明对GraphQL查询的理解达标了(恭喜!)。

好好读文档还是有必要的。

3.4 Elide Datastore

Datastore 能与Hibernate OGM 结合,并没有找到一些案例,需要实验实验了。如果能够通过OGM再引入mongodb,应该还是非常不错的,值得研究研究。

4. GraphQL-playground

很方便的工具,输入完URL就会自动拉取schema并提供doc/schema的浏览(这个时候服务一直会打日志,没有问题的,别跟我一样大惊小怪),很方便。还有一些替代品可以使用,就不多介绍了。 下面是一个通过doc浏览来理解elide的内容查询的图,看看就好。

5. 小结

  1. GraphQL是一个查询规范,由客户端描述需要的资源,资源的拼接由服务端完成,并且只返回客户端所要求的;
  2. 实现GraphQL的服务包括schema和resolver两块
  3. 可以从graphql-java实现(可以了解更多细节,也更灵活),也可以基于Elide的JPA实现(如果正好符合需求就是非常幸运了)。

GraphQL初探:Java服务示例及Yahoo/Elide相关推荐

  1. HIDL示例-JAVA服务创建-Client验证-Android10.0 HwBinder通信原理(四)

    摘要:本节主要来讲解Android10.0 JAVA层的HIDL服务创建和JAVA层的Client验证 阅读本文大约需要花费15分钟. 文章首发微信公众号:IngresGe 专注于Android系统级 ...

  2. Java服务部署规范(内部使用)

    1. 目的 Java服务在灰度环境和生产环境需要参照此文档进行部署. 2. 环境准备 2.1. 安装Java Cryptography Extension (JCE) 需要在JVM中安装JCE来进行加 ...

  3. JHipster生成微服务架构的应用栈(二)- 认证微服务示例

    本系列文章演示如何用JHipster生成一个微服务架构风格的应用栈. 环境需求:安装好JHipster开发环境的CentOS 7.4(参考这里) 应用栈名称:appstack 认证微服务: uaa 业 ...

  4. java服务写在哪里_JavaService

    JavaService Java服务 本文主要讲解两部分内容: linux下使用commons-daemon把java安装为后台运行程序 windows下使用commons-daemon把java安装 ...

  5. JHipster生成微服务架构的应用栈(三)- 业务微服务示例

    本系列文章演示如何用JHipster生成一个微服务架构风格的应用栈. 环境需求:安装好JHipster开发环境的CentOS 7.4(参考这里) 应用栈名称:appstack 认证微服务: uaa 业 ...

  6. java 观察者模式示例_观察者设计模式示例

    java 观察者模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如 ...

  7. java 观察者模式示例_Java中的观察者设计模式-示例教程

    java 观察者模式示例 观察者模式是行为设计模式之一 . 当您对对象的状态感兴趣并希望在发生任何更改时得到通知时,观察者设计模式很有用. 在观察者模式中,监视另一个对象状态的对象称为Observer ...

  8. java 设计模式 示例_Java中的中介器设计模式-示例教程

    java 设计模式 示例 中介者模式是行为设计模式之一 ,因此它处理对象的行为. 中介器设计模式用于在系统中不同对象之间提供集中式通信介质. 根据GoF,中介者模式意图是: 通过封装不同对象集相互交互 ...

  9. java存储过程示例_安全密码存储–请勿做的事和Java示例

    java存储过程示例 安全存储密码的重要性 作为软件开发人员,我们最重要的职责之一就是保护用户的个人信息. 如果没有我们应用程序的技术知识,用户别无选择,只能相信我们正在履行这一责任. 令人遗憾的是, ...

最新文章

  1. “三高”程序员谈:“三高”集群架构 哈哈哈!!!
  2. jQuery在绑定事件时如何传入参数
  3. centos中bash占用cpu,linux下如何定位CPU占用高的进程的问题点
  4. IOS pushViewController如何去隐藏tabbar
  5. nginx负载均衡与反向代理
  6. 题目1002:Grading
  7. 我最喜欢的模板jade(pug)学习和使用
  8. PXC 安装 for 5.7
  9. CentOS 6.4 安装 media wiki 1.23.6(转)
  10. python语言入门t_Python基础学习
  11. 「工具箱」套模板让项目管理更容易
  12. POI 合并单元格后设置列宽自适应的问题
  13. html仿excel冻结 css,css实例:实现gridview仿excel冻结列
  14. OBD柴油货车环保在线检测终端助力机动车尾气监管与时俱进
  15. Android使用svg格式图片,并改变图片颜色
  16. 《武魂》物理引擎特效全解析
  17. 如何利用js制作选项卡
  18. JavaScript的循环和
  19. 【技术美术】千人千面如何炼成 技术讲解捏脸系统设计原理
  20. 【一、建站综述及步骤简介】2021最详细wordpress博客建站教程(2021.03.01更新)

热门文章

  1. Java开源项目合集<一>
  2. 猫狗大战——基于TensorFlow的猫狗识别(2)
  3. Metasploit工具配置使用
  4. HTTP服务器的文件缓存
  5. 《孙子兵法战略运筹之始计篇》
  6. GPS时钟系统,GPS同步时钟系统
  7. 交换机的全trunk模式(native vlan)
  8. Cesium开发基础篇 | 02加载地形数据
  9. 教你一波Lucas(卢卡斯)定理在数论解题中的应用
  10. Windows 系统托盘图标