# FAQ ## Why a new API gateway? There are new requirements for API gateways in the field of microservices: higher flexibility, higher performance requirements, and cloud native. ## What are the differences between APISIX and other API gateways? APISIX is based on etcd to save and synchronize configuration, not relational databases such as Postgres or MySQL. This not only eliminates polling, makes the code more concise, but also makes configuration synchronization more real-time. At the same time, there will be no single point in the system, which is more usable. In addition, APISIX has dynamic routing and hot loading of plug-ins, which is especially suitable for API management under micro-service system. ## What's the performance of APISIX? One of the goals of APISIX design and development is the highest performance in the industry. Specific test data can be found here:[benchmark](https://github.com/apache/apisix/blob/master/doc/benchmark.md) APISIX is the highest performance API gateway with a single-core QPS of 23,000, with an average delay of only 0.6 milliseconds. ## Does APISIX have a console interface? Yes, in version 0.6 we have dashboard built in, you can operate APISIX through the web interface. ## Can I write my own plugin? Of course, APISIX provides flexible custom plugins for developers and businesses to write their own logic. [How to write plugin](doc/plugin-develop.md) ## Why we choose etcd as the configuration center? For the configuration center, configuration storage is only the most basic function, and APISIX also needs the following features: 1. Cluster 2. Transactions 3. Multi-version Concurrency Control 4. Change Notification 5. High Performance See more [etcd why](https://github.com/etcd-io/etcd/blob/master/Documentation/learning/why.md#comparison-chart). ## Why is it that installing APISIX dependencies with Luarocks causes timeout, slow or unsuccessful installation? There are two possibilities when encountering slow luarocks: 1. Server used for luarocks installation is blocked 2. There is a place between your network and github server to block the 'git' protocol For the first problem, you can use https_proxy or use the `--server` option to specify a luarocks server that you can access or access faster. Run the `luarocks config rocks_servers` command(this command is supported after luarocks 3.0) to see which server are available. If using a proxy doesn't solve this problem, you can add `--verbose` option during installation to see exactly how slow it is. Excluding the first case, only the second that the `git` protocol is blocked. Then we can run `git config --global url."https://".insteadOf git://` to using the 'HTTPS' protocol instead of `git`. ## How to support gray release via APISIX? An example, `foo.com/product/index.html?id=204&page=2`, gray release based on `id` in the query string in URL as a condition: 1. Group A:id <= 1000 2. Group B:id > 1000 here is the way: ```shell curl -i http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "uri": "/index.html", "vars": [ ["arg_id", "<=", "1000"] ], "plugins": { "redirect": { "uri": "/test?group_id=1" } } }' curl -i http://127.0.0.1:9080/apisix/admin/routes/2 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "uri": "/index.html", "vars": [ ["arg_id", ">", "1000"] ], "plugins": { "redirect": { "uri": "/test?group_id=2" } } }' ``` Here is the operator list of current `lua-resty-radixtree`: https://github.com/iresty/lua-resty-radixtree#operator-list ## How to redirect http to https via APISIX? An example, redirect `http://foo.com` to `https://foo.com` There are several different ways to do this. 1. Directly use the `http_to_https` in `redirect` plugin: ```shell curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "uri": "/hello", "host": "foo.com", "plugins": { "redirect": { "http_to_https": true } } }' ``` 2. Use with advanced routing rule `vars` with `redirect` plugin: ```shell curl -i http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "uri": "/hello", "host": "foo.com", "vars": [ [ "scheme", "==", "http" ] ], "plugins": { "redirect": { "uri": "https://$host$request_uri", "ret_code": 301 } } }' ``` 3. `serverless` plugin: ```shell curl -i http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "uri": "/hello", "plugins": { "serverless-pre-function": { "phase": "rewrite", "functions": ["return function() if ngx.var.scheme == \"http\" and ngx.var.host == \"foo.com\" then ngx.header[\"Location\"] = \"https://foo.com\" .. ngx.var.request_uri; ngx.exit(ngx.HTTP_MOVED_PERMANENTLY); end; end"] } } }' ``` Then test it to see if it works: ```shell curl -i -H 'Host: foo.com' http://127.0.0.1:9080/hello ``` The response body should be: ``` HTTP/1.1 301 Moved Permanently Date: Mon, 18 May 2020 02:56:04 GMT Content-Type: text/html Content-Length: 166 Connection: keep-alive Location: https://foo.com/hello Server: APISIX web server