If our purpose is to forward traffic according to QL, perhaps it is more
suitable to use plugin customization.
For example, create a plugin called graphql-dynamic-upstream.

two reasons about this

1. The purpose of graphql is to aggregate back-end data and provide a QL to
return the data format required by the front-end.
I think graphql has weakened APISIX's routing matching capabilities, and he
merged multiple routes into one.
This leads to obvious differences between the behavior of services such as
graphql and ordinary services; the matching rules of route are also not
applicable to each other.

2. QL itself belongs to business logic.

YuanSheng Wang <[email protected]> 于2020年10月30日周五 下午2:32写道:

> On Thu, Oct 29, 2020 at 5:44 PM Jan Li <[email protected]> wrote:
>
> > I think the support to GraphQL is the direction to go.
> >
> > One suggestion here, I think the support for GraphQL operation is also
> > important.
> >
> > For example, people might limit mutation rate to a lower value than
> query.
> >
> > So apart from  ["graphql_field", "==", "person"], we better also support
> > ["graphql_operation", "==", "query"]
> >
> >
> yes, that is useful. agree
>
>
>
> > On Thu, Oct 29, 2020 at 5:07 PM YuanSheng Wang <[email protected]>
> > wrote:
> >
> > > That is a new feature I want to implement it.
> > >
> > > Let us discuss it first.
> > >
> > > On Thu, Oct 29, 2020 at 5:05 PM YuanSheng Wang <[email protected]>
> > > wrote:
> > >
> > > > *what is GraphQL*
> > > >
> > > > GraphQL is a query language for APIs and a runtime for fulfilling
> those
> > > > queries with your existing data. GraphQL provides a complete and
> > > > understandable description of the data in your API, gives clients the
> > > power
> > > > to ask for exactly what they need and nothing more, makes it easier
> to
> > > > evolve APIs over time, and enables powerful developer tools.
> > > >
> > > > *How GraphQL works*
> > > >
> > > > `client` -> `APISIX` -> `GraphQL server` .
> > > >
> > > > Proxy the user's GraphQL request and forward it to the GraphQL server
> > > > according to the user's request information.
> > > >
> > > > When a client resource requests, GraphQL is submitted in the request
> > > body,
> > > > for example:
> > > >
> > > > ```
> > > > curl http://***/graphql -X POST -d '
> > > > query getUser($id: ID) {
> > > >   person(id: $id) {
> > > >     firstName
> > > >     lastName
> > > >   }
> > > > }
> > > > '
> > > > ```
> > > >
> > > > ## feature
> > > >
> > > > > **1th feature**: Forward to different requests upstream according
> to
> > > > the root field.
> > > >
> > > > ```lua
> > > > local graphql_str = [[
> > > > query getUser($id: ID) {    -- root
> > > >   person(id: $id) {         -- field 为 `person`
> > > >     firstName
> > > >     lastName
> > > >   }
> > > > }]]
> > > > local ast = parse(graphql_str)
> > > > ...
> > > > ```
> > > >
> > > > > **2th feature**: For different GraphQL queries, different plugins
> are
> > > > allowed to be bound.
> > > >
> > > > For example, querying different root fields allows completely
> different
> > > > plug-ins to be bound.
> > > >
> > > > * query `person`: enable plugin prometheus.
> > > > * query `bill`: enable plugin limit-count and prometheus.
> > > >
> > > > > **3th feature**: Later support GraphQL's `mutation`:
> > > > https://graphql.org/learn/queries/#mutations
> > > >
> > > > *implement way*
> > > >
> > > > Support adding GraphQL field to route matching conditions.
> > > >
> > > > For example:
> > > >
> > > > ```shell
> > > > curl http://127.0.0.1:9080/apisix/admin/routes/1 -X PUT -i -d '
> > > > {
> > > >     "uri": "/graphql",
> > > >     "vars": [
> > > >         ["graphql_field", "==", "person"]
> > > >     ],
> > > >     "upstream": {
> > > >         "type": "roundrobin",
> > > >         "nodes": {
> > > >             "127.0.0.1:3000": 1  # GrapQL server
> > > >         }
> > > >     }
> > > > }'
> > > > ```
> > > >
> > > > --
> > > >
> > > > *MembPhis*
> > > > My GitHub: https://github.com/membphis
> > > > Apache APISIX: https://github.com/apache/apisix
> > > >
> > >
> > >
> > > --
> > >
> > > *MembPhis*
> > > My GitHub: https://github.com/membphis
> > > Apache APISIX: https://github.com/apache/apisix
> > >
> >
> >
> > --
> >
> >
> >
> > Jan Li
> >
> > Senior Software Engineer, Tech
> >
> >
> >
> > Mobile +86 15316315503
> >
> > Room 1802, 18th Floor, Tower A, China Overseas International Center
> >
> > Lane 838, South Huangpi Road, Huangpu District,Shanghai,China
> >
> >
> >
> > Transforming the way businesses move and manage money globally
> >
> > Amsterdam | Beijing | Bangalore | Hong Kong | Kuala Lumpur | London |
> > Melbourne | San Francisco | Shanghai | Shenzhen | Singapore | Tokyo
> >
>
>
> --
>
> *MembPhis*
> My GitHub: https://github.com/membphis
> Apache APISIX: https://github.com/apache/apisix
>

Reply via email to