同步操作将从 iresty/Apache APISIX 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
title |
---|
Integration service discovery registry |
When system traffic changes, the number of servers of the upstream service also increases or decreases, or the server needs to be replaced due to its hardware failure. If the gateway maintains upstream service information through configuration, the maintenance costs in the microservices architecture pattern are unpredictable. Furthermore, due to the untimely update of these information, will also bring a certain impact for the business, and the impact of human error operation can not be ignored. So it is very necessary for the gateway to automatically get the latest list of service instances through the service registry。As shown in the figure below:
Common registries: Eureka, Etcd, Consul, Zookeeper, Nacos etc.
Currently we support Eureka/Consul/Nacos and service discovery via DNS.
For service discovery via DNS, see service discovery via DNS.
For Consul, see service discovery via Consul
For Nacos, see service discovery via Nacos
For Eureka, see below.
It is very easy for APISIX to extend the discovery client, the basic steps are as follows
Add the implementation of registry client in the 'apisix/discovery/' directory;
Implement the _M.init_worker()
function for initialization and the _M.nodes(service_name)
function for obtaining the list of service instance nodes;
If you need the discovery module to export the debugging information online, implement the _M.dump_data()
function;
Convert the registry data into data in APISIX;
First, add eureka.lua
in the apisix/discovery/
directory;
Then implement the _M.init_worker()
function for initialization and the _M.nodes(service_name)
function for obtaining the list of service instance nodes in eureka.lua
:
local _M = {
version = 1.0,
}
function _M.nodes(service_name)
... ...
end
function _M.init_worker()
... ...
end
function _M.dump_data()
return {config = your_config, services = your_services, other = ... }
end
return _M
Here's an example of Eureka's data:
{
"applications": {
"application": [
{
"name": "USER-SERVICE", # service name
"instance": [
{
"instanceId": "192.168.1.100:8761",
"hostName": "192.168.1.100",
"app": "USER-SERVICE", # service name
"ipAddr": "192.168.1.100", # IP address
"status": "UP",
"overriddenStatus": "UNKNOWN",
"port": {
"$": 8761,
"@enabled": "true"
},
"securePort": {
"$": 443,
"@enabled": "false"
},
"metadata": {
"management.port": "8761",
"weight": 100 # Setting by 'eureka.instance.metadata-map.weight' of the spring boot application
},
"homePageUrl": "http://192.168.1.100:8761/",
"statusPageUrl": "http://192.168.1.100:8761/actuator/info",
"healthCheckUrl": "http://192.168.1.100:8761/actuator/health",
... ...
}
]
}
]
}
}
Deal with the Eureka's instance data need the following steps :
overriddenStatus
is "UP" or the value of overriddenStatus
is "UNKNOWN" and the value of status
is "UP".ipAddr
is the IP address of instance; and must be IPv4 or IPv6.port["@enabled"]
is equal to "true", using the value of port["\$"]
, If the value of securePort["@enabled"]
is equal to "true", using the value of securePort["\$"]
.local weight = metadata.weight or local_conf.eureka.weight or 100
The result of this example is as follows:
[
{
"host" : "192.168.1.100",
"port" : 8761,
"weight" : 100,
"metadata" : {
"management.port": "8761"
}
}
]
Add the following configuration to conf/config.yaml
to add different service discovery clients for dynamic selection during use:
discovery:
eureka:
...
This name should be consistent with the file name of the implementation registry in the apisix/discovery/
directory.
The supported discovery client: Eureka.
Add following configuration in conf/config.yaml
:
discovery:
eureka:
host: # it's possible to define multiple eureka hosts addresses of the same eureka cluster.
- "http://${username}:${password}@${eureka_host1}:${eureka_port1}"
- "http://${username}:${password}@${eureka_host2}:${eureka_port2}"
prefix: "/eureka/"
fetch_interval: 30 # 30s
weight: 100 # default weight for node
timeout:
connect: 2000 # 2000ms
send: 2000 # 2000ms
read: 5000 # 5000ms
Here is an example of routing a request with a URL of "/user/*" to a service which named "user-service" and use eureka discovery client in the registry :
$ curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '
{
"uri": "/user/*",
"upstream": {
"service_name": "USER-SERVICE",
"type": "roundrobin",
"discovery_type": "eureka"
}
}'
HTTP/1.1 201 Created
Date: Sat, 31 Aug 2019 01:17:15 GMT
Content-Type: text/plain
Transfer-Encoding: chunked
Connection: keep-alive
Server: APISIX web server
{"node":{"value":{"uri":"\/user\/*","upstream": {"service_name": "USER-SERVICE", "type": "roundrobin", "discovery_type": "eureka"}},"createdIndex":61925,"key":"\/apisix\/routes\/1","modifiedIndex":61925},"action":"create"}
Because the upstream interface URL may have conflict, usually in the gateway by prefix to distinguish:
$ curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '
{
"uri": "/a/*",
"plugins": {
"proxy-rewrite" : {
"regex_uri": ["^/a/(.*)", "/${1}"]
}
},
"upstream": {
"service_name": "A-SERVICE",
"type": "roundrobin",
"discovery_type": "eureka"
}
}'
$ curl http://127.0.0.1:9080/apisix/admin/routes/2 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '
{
"uri": "/b/*",
"plugins": {
"proxy-rewrite" : {
"regex_uri": ["^/b/(.*)", "/${1}"]
}
},
"upstream": {
"service_name": "B-SERVICE",
"type": "roundrobin",
"discovery_type": "eureka"
}
}'
Suppose both A-SERVICE and B-SERVICE provide a /test
API. The above configuration allows access to A-SERVICE's /test
API through /a/test
and B-SERVICE's /test
API through /b/test
.
Notice:When configuring upstream.service_name
, upstream.nodes
will no longer take effect, but will be replaced by 'nodes' obtained from the registry.
Sometimes we need the discovery client to export online data snapshot in memory when running for debugging, and if you implement the _M. dump_data()
function:
function _M.dump_data()
return {config = local_conf.discovery.eureka, services = applications}
end
Then you can call its control api as below:
GET /v1/discovery/{discovery_type}/dump
eg:
curl http://127.0.0.1:9090/v1/discovery/eureka/dump
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。