Sent from my iPhone
> On Jun 14, 2022, at 22:26, Kwanhur Huang <huang_hua2...@163.com> wrote:
>
> Really Looking forward!!
>
> Question: what about the new Admin API backward compatibility?
>
> Kwanhur Huang
> TL;DR
>
>> 2022年6月14日 上午11:51,tzssangglass <tzssanggl...@apache.org> 写道:
>>
>> 1. Background
>>
>> The new API design for the Admin API, which no longer relies on the etcd
>> data format. The current API design of Admin API, is no design, we use the
>> HTTP RESTful API of etcd v2 directly. It is not good for API Gateway case.
>> Here are some reasons:
>> 1. Not support paging when fetching object list
>> 2. Not support filters when fetching object list
>> 3. The APISIX users need the route data, they don't care how it is stored.
>>
>> 1.1 Problem to be solved
>>
>> The Admin API use the HTTP API of etcd v2 REST. It has been deprecated by
>> etcd. As APISIX grows, users expect the Admin API to be more powerful and
>> clear:
>> 1. We need a more standardized and easy-to-understand Admin API interface.
>> 2. Remove strong dependency on etcd data format.
>> 3. Support pagination, search and other functions, making it easier for
>> users to find the APISIX data they need.
>>
>> 1.2 The benefits of solving this problem
>>
>> When fetching data of different types:
>> 1. Support paging to fetch data to avoid the response body being too large
>> due to a large number of certain types of data.
>> 2. Remove the outermost nesting to make the response data structure simpler.
>> 3. Support filtering by name, label, etc., allows the user to find the data
>> content that users are interested in quickly.
>>
>>
>> 2. How to solve the problem
>>
>> 2.1 List of URIs that need to be updated
>>
>> 2.1.1 For SSL objects, the plural form should be used
>>
>> API design: /apisix/admin/ssls/{id}
>>
>> examples of put a ssl object:
>>
>> ```
>> curl http://127.0.0.1:9080/apisix/admin/ssls/1 -X PUT -d {
>> "cert": ... ...,
>> "key": ... ...,
>> "snis": ["foo.com"],
>> }
>> ```
>>
>> examples of fetch ssl objects
>>
>> ```
>> curl http://127.0.0.1:9080/apisix/admin/ssls
>>
>> {
>> "count": 2,
>> "list": [
>> {...},
>> {...},
>> ]
>> }
>> ```
>>
>> 2.1.2 For proto objects, the plural form should be used
>>
>> API design: /apisix/admin/protos/{id}
>>
>> examples of put a proto object:
>>
>> ```
>> curl http://127.0.0.1:9080/apisix/admin/protos/1 -X PUT -d {
>> ... ...
>> }
>>
>> ```
>>
>> examples of fetch proto objects:
>>
>> ```
>> curl http://127.0.0.1:9080/apisix/admin/protos
>>
>> {
>> "count": 2,
>> "list": [
>> {...},
>> {...},
>> ]
>> }
>> ```
>>
>> 2.2 Response body format
>>
>> 2.2.1 Remove action field in response body, it is useless
>>
>> 2.2.2 Make the response body format simpler for list of object
>>
>> fetch object, return the object information directly, examples:
>>
>> ```
>> curl http://127.0.0.1:9080/apisix/admin/routes/12
>> {
>> "key": "/apisix/routes/12",
>> "createdIndex": 1655,
>> "value": {
>> "id": "12",
>> "uri": "/hello",
>> "create_time": 1653964280,
>> "status": 1,
>> "upstream": {
>> "type": "roundrobin",
>> "pass_host": "pass",
>> "hash_on": "vars",
>> "nodes": {
>> "127.0.0.1:1980": 1
>> },
>> "scheme": "http"
>> },
>> "update_time": 1654519342
>> },
>> "modifiedIndex": 2289
>> }
>> ```
>>
>>
>> fetch object list, return `count` and `list` field. Each item in the list
>> is the object(eg: route, service or upstream), examples:
>>
>> ```
>> curl http://127.0.0.1:9080/apisix/admin/routes -H 'X-API-KEY:
>> edd1c9f034335f136f87ad84b625c8f1'
>> {
>> "count": 2,
>> "list": [
>> {
>> "createdIndex": 1655,
>> "key": "/apisix/routes/1",
>> "value": {
>> "id": "1",
>> "priority": 0,
>> "uri": "/hello",
>> "create_time": 1649143475,
>> "upstream": {
>> "type": "roundrobin",
>> "pass_host": "pass",
>> "hash_on": "vars",
>> "nodes": {
>> "127.0.0.1:1980": 1
>> },
>> "scheme": "http"
>> },
>> "update_time": 1653963881,
>> "status": 1
>> },
>> "modifiedIndex": 2289
>> },
>> {
>> "createdIndex": 2290,
>> "key": "/apisix/routes/12",
>> "value": {
>> "id": "12",
>> "priority": 0,
>> "uri": "/hello",
>> "create_time": 1653964280,
>> "status": 1,
>> "upstream": {
>> "type": "roundrobin",
>> "pass_host": "pass",
>> "hash_on": "vars",
>> "nodes": {
>> "127.0.0.1:1980": 1
>> },
>> "scheme": "http"
>> },
>> "update_time": 1654519342
>> },
>> "modifiedIndex": 2325
>> }
>> ]
>> }
>> ```
>>
>> 2.3 New feature for all Admin APIs
>>
>> 2.3.1 Supports paging to get a list of objects such as route
>>
>> Avoid being unable to return all objects in a single request because there
>> are too many objects of a specific type.
>>
>> More friendly to web applications. For administrators, the number of list
>> displayed on a single page is usually between 20 and 50.
>>
>> - Feature: support new query arguments:
>> - page: the current page number, the default value is 1, and the valid
>> value is a positive integer.
>> - page_size: the page size, no paging by default, the valid value should
>> be from 10 to 500.
>>
>> examples:
>>
>> ```
>> curl http://xxxx/apisix/admin/routes?page=1&page_size=10
>>
>> {
>> "count": 1,
>> "list": [
>> {
>> ... ...
>> }
>> ]
>> }
>> ```
>>
>> - Object list that need to support paging:
>> routes
>> services
>> upstreams
>> consumers
>> schema
>> ssls
>> protos
>> global_rules
>> stream_routes
>> plugin_metadata
>> plugin_configs
>>
>> Note:
>> The paging will be done on APISIX, not lua-resty-etcd.
>> APISIX will do some of the following:
>> 1. get all routes data from memory (instead of querying from etcd)
>> 2. sort all routes by update_time, the larger the update_time, the higher
>> the ranking(sorted by update_time in descending order)
>> 3. get the corresponding routes according to the paging parameter
>> 4. if there are no paging parameters, follow the default values in the
>> requirements.
>> 5. return the paging parameters of the query in the response.
>>
>>
>> 2.2 Supports filter when get a list of objects such as route
>>
>> - Feature: filter fields supported by all objects
>> - name: If the object's name contains the name string specified by the
>> user, the matching result is true; otherwise the matching result is false.
>> - label: If the object's label is the same as the label specified by the
>> user, the matching result is true; otherwise the matching result is false.
>> - Feature: additional filter fields supported by the Route object
>> - uri: If the route's uri contains the uri string specified by the user,
>> the matching result is true; otherwise the matching result is false.
>>
>> When the user has enabled multiple filter fields, there is an and
>> relationship between the different fields. For example, the following
>> example is expected to return a list of routes: the route's name contains
>> the string "test", and the URI contains the string "foo". There is no
>> restriction on the route label because the input is an empty string.
>>
>> examples:
>>
>> ```
>> curl http://xxxx/apisix/admin/routes?name=test&uri=foo&label=
>>
>> {
>> "count": 1,
>> "list": [
>> {...}
>> ]
>> }
>> ```
>>
>> - Object list that need to support paging:
>> routes
>> services
>> upstreams
>> consumers
>> schema
>> ssls
>> protos
>> global_rules
>> stream_routes
>> plugin_metadata
>> plugin_configs
>>
>> *ZhengSong Tu*
>> My GitHub: https://github.com/tzssangglass
>> Apache APISIX: https://github.com/apache/apisix
>