转自: https://tomasalabes.me/blog/nodejs/graphql/apollo/2018/09/18/schema-stitiching-apollo.html

Full Schema Stitching with Apollo Server

In this post we will see how we can stitch the queries/mutations and subscriptions from an Apollo Server and its Links packages. Plus a few tips to make it more interesting ;)

Our Goal

Our goal is creating a single apollo-link that will let Apollo stitch all requests going to the server and send them to the right downstream server.

apollo-stitching

Once we have the function that creates the link, the overall code should look something like this:

import { introspectSchema, makeRemoteExecutableSchema, mergeSchemas } from 'graphql-tools';

export const createSchema = async () => {
const { link } = createLink(); // -> this is the method that we will create const introspectedSchema = await introspectSchema(link);
const schema = makeRemoteExecutableSchema({
link,
schema: introspectedSchema
}); return mergeSchemas({
schemas: [
schema
// more schemas
]
});
};

Ok, let’s stitch!

Mutations / Queries using “apollo-link-http”

This one is pretty straight forward, apollo-link-http redirects http/s queries to the provided URL. I use node-fetchwhich is the recommended fetch package for Node.

import { HttpLink } from 'apollo-link-http';
import fetch from 'node-fetch'; const createHttpLink = (gqlServerUrl) => {
const uri = `http://${gqlServerUrl}/graphql`;
return new HttpLink({
fetch,
uri
});
};

Subscriptions using “apollo-link-ws”

Now subscriptions. We need to use apollo-link-ws It’s similar to the http-link except we need to first create a SubscriptionClient where we pass the urloptions and the websockets node implementation. In the previous link we passed the fetch implementation, now is the websocket’s one.

import WebSocket from 'ws';
import { WebSocketLink } from 'apollo-link-ws';
import { SubscriptionClient } from 'subscriptions-transport-ws';
import { WebSocketLink } from 'apollo-link-ws'; const createWsLink = (gqlServerUrl) => {
const wsUri = `ws://${gqlServerUrl}/subscriptions`;
const wsClient = new SubscriptionClient(
wsUri,
{
reconnect: true // if connection is lost, retry
},
WebSocket
); return new WebSocketLink(wsClient);
};

All options for the SubscriptionClient are here.

Creating the Link + a Retry Mechanism

This is where we add the “magic”. We will use the above 2 links, with a split and retry strategies.

We will:

  1. Create the HTTP and WS links
  2. Using split, depending on the requested operation we will evaluate what link is needed
  3. Using RetryLink, we will check if there was an error connecting to the server, and retry the connection if necessary
import { RetryLink } from 'apollo-link-retry';
import { getMainDefinition } from 'apollo-utilities'; const createLink = () => {
const projectGqlServer = `your-gql-server:3000`;
const httpLink = createHttpLink(projectGqlServer);
const wsLink = createWsLink(projectGqlServer); const link = new RetryLink({
// these are the defaults, change them as you will
delay: {
initial: 300, // The number of milliseconds to wait before attempting the first retry.
max: Infinity, // The maximum number of milliseconds that the link should wait for any retry
jitter: true // Whether delays between attempts should be randomized.
},
attempts: {
max: 5, // The max number of times to try a single operation before giving up.
retryIf: (error, _operation) => !!error // A predicate function that can determine whether a particular response should be retried.
}
}).split( // using "Directional Composition" of links
({ query }) => {
const { kind, operation } = getMainDefinition(query);
return kind === 'OperationDefinition' && operation === 'subscription';
},
wsLink,
httpLink
);
return { link };
};

Conclusion

With this you should be able to route all types of operations received by this server to the remote server.

There’re other strategies using other link packages but I haven’t tried them, as some I think don’t apply to the server but to the client. But I think this gives you the base for the stitching, from here you can take it to where you need it.

As always, hope it helps! And share if it does!

Cheers!

Full Schema Stitching with Apollo Server的更多相关文章

  1. [Apollo Server] Get started with Apollo Server

    Get started with apollo server with node.js: Install: npm install --save apollo-server graphql index ...

  2. GraphQL-- 使用Apollo Server搭建Node服务端

    一.关于Apollo Server Apollo Server是一种使用JS创建GraphQL服务端的一个方案.它的兼容性比较好,可以很好地和GraphQL客户端进行兼容.同时它可以 独立作为服务端进 ...

  3. 转 GraphQL Schema Stitching explained: Schema Delegation

    转自官方文档 In the last article, we discussed the ins and outs of remote (executable) schemas. These remo ...

  4. Apollo的基本概念和集成实战

    基本概念 使用场景 是一个分布式的配置中心.适用于微服务: 核心功能 集中管理不同环境,不同集群的配置: 配置修改后可以实时推送到应用端: 具备规范的权限,流程治理特性: 开发技术 服务端使用spri ...

  5. SQL Server DML(UPDATE、INSERT、DELETE)常见用法(一)

    1.引言 T-SQL(Transact Structured Query Language)是标准的SQL的扩展,是程序和SQL Server沟通的主要语言. T-SQL语言主要由以下几部分组成: 数 ...

  6. Oracle 迁移某用户的数据到Sql Server

    准备条件: 1.Oracle11g数据库 2.Sql Server 2008 3.Microsoft SQL Server Migration Assistant for Oracle 步奏如下: 1 ...

  7. Confluence 6 SQL Server 创建一个数据库和数据库用户

    一旦你成功安装了 SQL Server 服务器,请按照下面的方法为你的 Confluence 创建数据库用户和数据库: 使用你的 SQL 管理员权限,创建一个新的数据库(例如 confluence). ...

  8. Microsoft SQL Server Trace Flags

    Complete list of Microsoft SQL Server trace flags (585 trace flags) REMEMBER: Be extremely careful w ...

  9. sql server 小技巧(7) 导出完整sql server 数据库成一个sql文件,包含表结构及数据

    1. 右健数据库 –> Tasks –> Generate Scripts   2. 选择所有的表   3. 下一步,选择Advanded, Types of data to script ...

随机推荐

  1. 2.8 C++参数初始化表

    参考:http://www.weixueyuan.net/view/6340.html 总结: 参数初始化表可以为任何数据成员进行初始化. 初始化const成员变量的唯一方法只有利用参数初始化表. 通 ...

  2. SQL-27 给出每个员工每年薪水涨幅超过5000的员工编号emp_no、薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列。 提示:在sqlite中获取datetime时间对应的年份函数为strftime('%Y', to_date)

    题目描述 给出每个员工每年薪水涨幅超过5000的员工编号emp_no.薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列. 提示:在s ...

  3. `define、parameter、localparam三者的区别(转)

    `define: 可以跨模块的定义,写在模块名称上面,在整个设计工程都有效.一旦‘define指令被编译,其在整个编译过程中都有效.例如,通过另一个文件中的`define指令,定义的常量可以被其他文件 ...

  4. SharePoint Framework 企业向导(五)

    博客地址:http://blog.csdn.net/FoxDave SPFx解决方案是如何被构建出来的--很重要 SPFx为SharePoint开发者在设计.编译和部署SharePoint自定义解 ...

  5. Web 开发最有用的50款 jQuery 插件集锦——《内容滑块篇》

    http://www.cnblogs.com/lhb25/archive/2013/04/02/50-jquery-plugins-d.html responsive-carousel 是一个内容传送 ...

  6. Oracle表空间状态查询、意义及修改方式

    查询表空间状态 select tablesapce_name,status from dba_tablespaces; 表空间的状态属性主要有在线(online),离线(offline),只读(rea ...

  7. JavaWeb:c3p0配置问题-----java.sql.SQLException: Connections could not be acquired from the underlying database!

    错误原因 c3p0的配置错误 错误显示 -classpath "D:\Program\Software\IntelliJIDEA\IntelliJ IDEA 2018.2.5\lib\ide ...

  8. File类操作中的IOException异常

     代码: File file= newFile("demo"+File.separator+"HelloWorld.txt"); file.createNe ...

  9. Html静态网页下载—Teleport Pro 1.68 官方原版

    Teleport Pro 1.68 官方原版+有效注册码 – 下载整个网站 简介 Teleport Pro由美国Tennyson Maxwell公司开发,曾被PC Magazine评为”编辑选择奖”. ...

  10. Templates中的标签if

    1.什么是标签 每个标签标示的是不同的服务器端的功能 2.常用标签 1. if 标签 1.基本if结构 {% if 条件 %} % endif %} 2.if ... else ... 结构 {% i ...