网站首页 > 博客文章 正文
前面的背景部分,纯是记录一下,不用看。
背景介绍
这是一个探索性质的工作。
当时公司基于众多研发团队的情况,希望能找出一条减少研发工作量的路线,除了GraphQL,还有其他的路线,比如自研低代码平台,采用国内的一些后台开发平台,代码生成器,还有一些简化接口开发的工具等等。
因为现实的情况,一些预研工作没有落地,而GraphQL,实现了部分落地。GraphQL可以实现增删改(@MutationMapping)、查(@QueryMapping)、订阅推送(@SubscriptionMapping)。
但是在工作实践中,我们认为(仅基于公司当前的情况),增删改这些操作还是使用普通的Rest Api比较好,订阅推送用WebSocket+STOMP比较好(WebSocket SpringBoot STOMP的实现),查询方面,后台系统的列表查询相对复杂,没有用GraphQL。
主要将GraphQL应用在聚合信息接口上,我们的项目角色众多,一套数据不同角色需要展示的不一样。以前的做法:
1、搞一个大接口,返回所有的东西,不同的客户端自己选择需要的数据进行展示。优点是服务端没什么开发量,缺点是一抓包,数据就泄露了。
2、不同的端搞不同的接口,同一个订单数据,买家一个接口,卖家一个接口,运营平台一个接口,优缺点与上一种反过来。
3、前端调用多个接口,进行拼装。优点是前端有一定的数据选择权,缺点是接口多,且一个页面要发送多个HTTP请求,资源消耗相对多。
这三种做法我们之前都实践过,第二种方案,一旦管理不好,代码就乱得很,不同的用户端,随着项目的演进,需求变更频繁,两三个迭代下来,本来很清晰的业务逻辑,最后代码写得五花八门。第一种倒是省时省力,就是数据安全性属实有点不靠谱。第三种嘛,遇上好说话的前端开发同学还好......反正我们之前就遇到过因为微服务开发人员不愿意提供聚合接口,而导致前后端吵起来了,一个办公楼层听得清清楚楚,最后矛盾上升到技术负责人那去了。
经过我们实践中的应用,GraphQL可以相对好地应对这种情况——不可能完全解决。
实现
?Java的GraphQL实现有很多第三方JAR,例如graphql-java-kickstart、Netflix DGS等,我们采用的就是Spring官方的「Spring for GraphQL」。
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-graphql</artifactId>
</dependency>
配置:
spring.graphql.graphiql.enabled=true
spring.graphql.printer.enabled=true
表设计:
实践中,我们遇到了一些小问题。
Long的处理:
GraphQL定义的数据类型,没有Long,而我们在实践中,一般都是用Long做主键的,解决方案有两种:
- 使用graphql-java-extended-scalars,扩展了一些类型,就包含Long。
- 将Long转为String。这是我们使用的方案,原因也很简单,接口会提供给页面使用,而JS处理Long数据会损失精度,之前也是转为String使用。
日期时间的处理:
方案也同上。
- graphql-java-extended-scalars有日期时间类型的扩展,只是对应的Java类不是Date,而是「java.time.OffsetDateTime、java.time.LocalDate、java.time.OffsetTime、java.time.LocalTime」,格式是:2024-04-17T07:01:58.000+08:00,要想变成常用的“2024-04-17 07:01:58”还需要转一下。
- 直接转为Unix时间戳,类型为String。这个也很常用,我印象中JS在处理“2024-11-11”这种数据的时候,有时候会当成减法来操作,所以后来服务端就统一返回时间戳了。
schema.graphql:
scalar DateTime
@specifiedBy(url: "https://scalars.graphql.org/andimarek/date-time.html")
type Query {
userById(id: ID): UserVo
findUser(userQueryParam: UserQueryParam): ResultUser
}
type UserVo {
id: ID
userName: String!
createTime: DateTime
account: AccountVo
idCard: idCardVo
idCardPics: [idCardPicVo]
}
type AccountVo {
id: ID
mobile: String
pwd: String
userId: String
}
type idCardVo {
id: ID
userId: String
idCardNo: String
}
type idCardPicVo {
id: ID
userId: String
picUrl: String
}
input UserQueryParam {
mobile: String
idCardNo: String
}
type ResultUser{
code: Int!
msg: String!
data: UserVo
}
说明:
- !代表此字段是非空的,服务一定会返回给你一个值。ResultUser设置的data,没有!,代表此值可以为null。
- []代表数组。
- input代表设置了一个输入的参数类。
- type Query代表设置的查询方法。还有变更、订阅类型,本例不再赘述。
- 一般我们返回给前端的数据体,都带有code、msg、data,所以通常用ResultUser这种格式。
Controller:
@Controller
@Slf4j
public class UserQueryController {
@Autowired
private UserService userService;
@QueryMapping
public UserVo userById(@Argument String id) {
UserEntity userEntity = userService.getUserById(Long.valueOf(id));
log.info("DB信息:{}",userEntity.toString());
return this.buildUserVo(userEntity);
}
@QueryMapping
public Result<UserVo> findUser(@Argument UserQueryParam userQueryParam){
log.info("查询参数:{}",userQueryParam.toString());
UserEntity userEntity = userService.findUser(userQueryParam.getMobile(),userQueryParam.getIdCardNo());
return Result.success(this.buildUserVo(userEntity));
//return Result.fail("无此数据");
}
}
启动服务后,可以访问http://localhost:8080/graphiql?path=/graphql
或者使用PostMan进行调试。
猜你喜欢
- 2024-10-02 还在手工写接口测试文档,已经out了
- 2024-10-02 从零单排,使用 Netty 构建 IM 聊天室
- 2024-10-02 K8s Ingress 解决 “长连接” 负载不均衡的问题
- 2024-10-02 Axios 并发请求完全指南 - 3 种实现解析
- 2024-10-02 Spring Boot Bean注入的常见方式与应用场景
- 2024-10-02 postman-Workspaces工作空间 VS Scratch Pad草稿面板
- 2024-10-02 新型开源postwoman接口调试工具VS传统经典postman和crapAPI工具
- 2024-10-02 Postman收费太贵了,我决定用Postwoman...
- 2024-10-02 深入浅出:WebSocket 鉴权的实践(websocket 鉴权方案)
- 2024-10-02 这是一个好看的API客户端工具,替代Postman——Postwoman
你 发表评论:
欢迎- 07-08Google Cloud Platform 加入支持 Docker 的容器引擎
- 07-08日本KDDI与Google Cloud 签署合作备忘录,共探AI未来
- 07-08美国Infoblox与Google Cloud合作推出云原生网络和安全解决方案
- 07-08GoogleCloud为Spanner数据库引入HDD层,将冷存储成本降低80%
- 07-08谷歌推出Cloud Dataproc,缩短集群启动时间
- 07-08Infovista与Google Cloud携手推进射频网络规划革新
- 07-08比利时Odoo与Google Cloud建立增强合作,扩大全球影响力
- 07-08BT 和 Google Cloud 通过 Global Fabric 加速 AI 网络
- 最近发表
-
- Google Cloud Platform 加入支持 Docker 的容器引擎
- 日本KDDI与Google Cloud 签署合作备忘录,共探AI未来
- 美国Infoblox与Google Cloud合作推出云原生网络和安全解决方案
- GoogleCloud为Spanner数据库引入HDD层,将冷存储成本降低80%
- 谷歌推出Cloud Dataproc,缩短集群启动时间
- Infovista与Google Cloud携手推进射频网络规划革新
- 比利时Odoo与Google Cloud建立增强合作,扩大全球影响力
- BT 和 Google Cloud 通过 Global Fabric 加速 AI 网络
- NCSA和Google Cloud合作开发AI驱动的网络防御系统,加强泰国网络空间的安全性
- SAP将在沙特阿拉伯 Google Cloud 上推出BTP服务
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- googlecloud (64)
- messagesource (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)