欢迎光临澳大利亚新华书店网 [登录 | 免费注册]

    • GraphQL实战(写给全栈工程师们)
      • 作者:王北南
      • 出版社:机械工业
      • ISBN:9787111630937
      • 出版日期:2019/07/01
      • 页数:184
    • 售价:23.6
  • 内容大纲

        本书以当下流行的移动互联网应用开发为切入点,结合作者多年的前后端实际架构经验,针对目前互联网上程序员们对GraphQL的疑问和误解,并辅以业界真实案例,对前后端设计中的难点要点分别加以介绍。在前端,本书重点讲述了如何提升用户体验和响应速度;在后端,主要讲解了在高并发海量数据环境下的设计与优化;最后,还介绍了如何让GraphQL与大数据平台整合来训练机器学习模型。
        本书内容涵盖前端、后端和大数据平台开发,非常适合全栈程序员阅读,也可作为前端程序员、后端程序员、大数据工程师、算法工程师和技术型产品经理提升知识储备的参考书。
  • 作者介绍

        王北南,Twitter核心服务组高级研发工程师,毕业于美国Syracuse大学计算机科学与工程学院,获博士学位,曾任国内多家公司CTO、技术总监、首席架构师。     在前后端以及全栈研发一线奋斗十余载,专注于高并发、高可用微服务平台以及大数据平台架构,拥有重构并优化千亿级日访问量微服务以及数据采集经验。力求用浅显的语言来讲述自己的实战经验和国内外的先进理论,以满足中国互联网行业的实际需求。
  • 目录

    前言
    导读——本书为快速学习设计
    第1章  GraphQL API设计和全栈开发
      1.1  什么是GraphQL
      1.2  分布式
        1.2.1  扩展性
        1.2.2  可靠性
        1.2.3  远程资源共享
        1.2.4  更强的处理能力
      1.3  C/S架构与API
        1.3.1  C/S架构
        1.3.2  前端与后端
        1.3.3  全栈程序员
        1.3.4  应用程序接口
      1.4  RESTful API的起源与特点
        1.4.1  仓库保管员的窘境
        1.4.2  REST无状态的好处
        1.4.3  RESTful API是否真的无状态
        1.4.4  RESTful API是否是数据传输协议
        1.4.5  RESTful API的好处是什么
      1.5  RESTful API的主要问题
        1.5.1  数据定制的问题
        1.5.2  多次请求的问题
        1.5.3  异常处理的问题
        1.5.4  返回数据格式未知的问题
        1.5.5  请求Endpoint和方式过多的问题
      1.6  GraphQL如何解决RESTful API的问题
        1.6.1  GraphQL可以自由定制数据
        1.6.2  GraphQL可以把多次请求合并为一个
        1.6.3  GraphQL以及异常信息明确
        1.6.4  GraphQL返回数据的形式和查询请求同构
        1.6.5  GraphQL使用单一的Endpoint
        1.6.6  GraphQL替代了什么
      1.7  GraphQL引发的疑虑
        1.7.1  GraphQL是否还是RESTful
        1.7.2  GraphQL了后端设计的难度
        1.7.3  GraphQL是否会带来后端性能问题
        1.7.4  迁移到GraphQL的代价
        1.7.5  GraphQL是该前端驱动还是后端驱动
      1.8  GraphQL全栈框架的选用
        1.8.1  Relay
        1.8.2  Apollo
    第2章  GraphQL初体验——电商API设计
      2.1  基本开发环境的搭建
      2.2  和GraphQL互动
        2.2.1  实时交互界面GraphiQL的使用
        2.2.2  通过curl发送请求
        2.2.3  使用第三方客户端
      2.3  Schema与定义数据类型
        2.3.1  强类型的查询语言

        2.3.2  服务器端的Schema
        2.3.3  标量类型
        2.3.4  自定义复杂类型
        2.3.5  枚举
        2.3.6  列表以及对象的列表
      2.4  定义操作
        2.4.1  只读查询操作
        2.4.2  可写修改操作
        2.4.3  订阅操作
        2.4.4  传递输入类型
        2.4.5  操作也是字段
      2.5  精炼数据模型与操作
        2.5.1  接口和继承
        2.5.2  联合
      2.6  精炼查询
        2.6.1  使用变量
        2.6.2  使用别名
        2.6.3  使用片段
        2.6.4  类型条件
        2.6.5  使用Directive
        2.6.6  后端工程师的福音
      2.7  简单数据验证
        2.7.1  必填值的验证
        2.7.2  标量值的验证
    第3章  电商网站前端开发
      3.1  GraphQL前端开发要点
        3.1.1  前端开发的主要任务
        3.1.2  前端开发的难点
        3.1.3  前端技术的选型
      3.2  前端React项目初始化
        3.2.1  React特点简介
        3.2.2  React整合GraphQL前端设计
        3.2.3  创建React前端工程
        3.2.4  安装Apollo客户端
        3.2.5  初始化GraphQL客户端
        3.2.6  手动发送查询
      3.3  只读数据的React UI组件
        3.3.1  构建GraphQL Query查询
        3.3.2  定义列表元素组件
        3.3.3  定义列表组件
        3.3.4  绑定静态查询和UI组件
        3.3.5  使用Query组件
        3.3.6  从Query组件中接收一个参数
        3.3.7  数据的接收以及出错处理
        3.3.8  手动刷新
      3.4  修改数据的React UI组件
        3.4.1  定义一个带有变量的Mutation
          操作
        3.4.2  使用Mutation UI组件
      3.5  支持订阅

        3.5.1  什么时候使用订阅
        3.5.2  订阅是如何实现的
      3.6  本地数据
    第4章  基于Node.js的GraphQL后端
      4.1  GraphQL后端架构思想
        4.1.1  “薄”层设计
        4.1.2  “门户”设计
        4.1.3  面向业务设计
      4.2  GraphQL层的职责与实现
        4.2.1  GraphQL层的职责
        4.2.2  GraphQL层的实现
        4.2.3  Resolver函数与分治策略
      4.3  Apollo GraphQL后端框架
        4.3.1  依赖库的安装
        4.3.2  定义和解析Schema
        4.3.3  绑定处理查询操作函数
      4.4  详解Resolver函数
        4.4.1  Resolver的各种返回类型
        4.4.2  Resolve一个类型
        4.4.3  Resolve一个复杂类型字段
        4.4.4  Resolve一个标量字段
        4.4.5  Resolve一个自定义标量字段
        4.4.6  Resolve一个列表
      4.5  GraphQL后端验证以及处理
        4.5.1  简单方式
        4.5.2  使用自定义标量类型进行验证
      4.6  异步IO
        4.6.1  基于异步非阻塞IO的实现
        4.6.2  同步还是异步
        4.6.3  异步Resolver
      4.7  使用开发后端服的问题
    第5章  基于Go语言协程的GraphQL服务
      5.1  使用协程和上下文
        5.1.1  使用协程的原因
        5.1.2  协程和GraphQL服务
        5.1.3  上下文和作用域
        5.1.4  派生上下文
      5.2  Go语言的Web服务和中间件
        5.2.1  构建Web服务
        5.2.2  Web服务中间件
        5.2.3  基于中间件的后端架构
        5.2.4  数据收集中间件
        5.2.5  数据库会话中间件
      5.3  GraphQL Http请求的处理
        5.3.1  GraphQL请求的解析
        5.3.2  执行GraphQL查询和准备结果
        5.3.3  合理使用Http请求上下文
      5.4  使用Go语言的GraphQL后端是否会有性能问题
    第6章  实体数据持久化建模与实现
      6.1  基于ID的数据库访问层设计

        6.1.1  和API设计
        6.1.2  实现数据读取
        6.1.3  实现数据写入
      6.2  使用ID访问数据的好处
        6.2.1  利于数据库查询性能优化
        6.2.2  利于分片
        6.2.3  利于和缓存结合
        6.2.4  防止重复读取同一资源
        6.2.5  利于Resolver函数实现
      6.3  建立基于ID的抽象Schema数据类型
        6.3.1  Relay的Schema设计方案
        6.3.2  Relay的GraphQL查询设计
      6.4  分布式ID生成算法
        6.4.1  Snowflake ID
        6.4.2  Fast ID的安装和代码示例
        6.4.3  设置
      6.5  GraphQL连接数据库访问层
        6.5.1  用户数据DAO实例
        6.5.2  DAO在GraphQL后端架构中存在的意义
      6.6  简单分页设计
        6.6.1  简单分页设计
        6.6.2  Cursor分页方式
        6.6.3  客户端分页显示
        6.6.4  服务器端Resolve分页
      6.7  一对多关系
        6.7.1  Schema和Resolver函数定义
        6.7.2  外键方式
        6.7.3  聚合方式
    第7章  “关系”的设计和持久化
      7.1  用户关系建模
        7.1.1  如何表达“图”
        7.1.2  基本设计思路
      7.2  边的集合与游标分页
        7.2.1  边的简单表达
        7.2.2  边的简单分页
        7.2.3  边的游标分页
      7.3  借鉴Relay的边设计方案
      7.4  “关系”数据的数据访问层设计
    第8章  全栈API优化
      8.1  前后端数据的一致性
        8.1.1  数据的存在形式
        8.1.2  Query与Mutation
      8.2  客户端缓存更新机制
        8.2.1  客户端使用Mutation更新缓存
        8.2.2  定制更新缓存
      8.3  出错、超时与重试
        8.3.1  信息的定义
        8.3.2  服务器端如何返回出错信息
        8.3.3  客户端如何处理出错
      8.4  使用高阶函数来优化GraphQL组件

        8.4.1  高阶函数
        8.4.2  使用函数式的声明方式
        8.4.3  使用Recompose
      8.5  通盘考虑API设计
        8.5.1  面向真实数据关系建模
        8.5.2  遗留数据建模
      8.6  自省和文档
        8.6.1  命名比文档重要
        8.6.2  自省
        8.6.3  文档
        8.6.4  API的升级与兼容性
    第9章  认证与授权
      9.1  基于Http协议的用户认证
        9.1.1  使用Cookie的认证方式
        9.1.2  使用访问令牌Token的认证方式
      9.2  基于访问令牌Token的用户认证
        9.2.1  访问令牌的生成
        9.2.2  GraphQL整合Token要点
        9.2.3  服务器端拿到Token以后做什么
      9.3  查询操作层面的权限控制
        9.3.1  设计GraphQL的授权服务
        9.3.2  JWT Token中数据的定义
        9.3.3  JWT Token的生成
        9.3.4  验证Token中间件
        9.3.5  解析和验证Token
        9.3.6  通过上下文传递授权信息
        9.3.7  数据细粒度的权限控制
    第10章  高并发后端优化
      10.1  处理N+1问题
        10.1.1  什么是N+1问题
        10.1.2  N+1问题为什么会危害性能
        10.1.3  解决N+1问题的思路
        10.1.4  GraphQL如何批处理查询
      10.2  使用DataLoader
        10.2.1  DataLoader的工作模式
        10.2.2  批处理函数
        10.2.3  DataLoader与下游服务
        10.2.4  批处理函数对于error的处理
        10.2.5  为每个Http请求创建DataLoader
      10.3  使用Cache
        10.3.1  GraphQL与RESTful API对缓存的不同设计
        10.3.2  Memcached的查询与优化
        10.3.3  Redis的查询与优化
      10.4  NoSQL与下游服务的数据库查询与优化
        10.4.1  使用内嵌对象存储数据
        10.4.2  使用对象引用存储数据
        10.4.3  基于列Column存储的数据建模
        10.4.4  下游服务数据源的优化
      10.5  SQL数据库的数据查询合并与优化
        10.5.1  基于Key-Value设计的SQL数据库优化

        10.5.2  基于传统数据库查询的数据库优化
        10.5.3  高并发下的SQL数据查询瓶颈
      10.6  GraphQL与大数据和机器学习
        10.6.1  使用GraphQL获取实时数据
        10.6.2  获取大批次对象团的问题
        10.6.3  高频访问GraphQL服务的问题
        10.6.4  GraphQL应用的数据采集
    第11章  测试与部署
      11.1  单元测试
        11.1.1  在Resolver函数中使用依赖注入
        11.1.2  创建Mock对象
        11.1.3  编写单元测试代码
      11.2  集成测试
        11.2.1  准备环境
        11.2.2  准备客户端
        11.2.3  编写测试用例并验证结果
        11.2.4  持续集成
      11.3  压力测试与Profiling
        11.3.1  简单压力测试
        11.3.2  Fork生产环境流量
        11.3.3  使用访问日志进行压力测试
        11.3.4  Diffy测试
      11.4  开发环境部署
        11.4.1  配置下游服务
        11.4.2  负载均衡的部署
      11.5  生产环境弹性部署
        11.5.1  服务注册与发现
        11.5.2  高可用性
    后记