This is an automated email from the ASF dual-hosted git repository.

spacewander pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix.git


The following commit(s) were added to refs/heads/master by this push:
     new 93454252a feat: stream subsystem support eureka service discovery 
(#8583)
93454252a is described below

commit 93454252a51c7e14c140999532edf6ddd8ce5667
Author: Ashing Zheng <[email protected]>
AuthorDate: Wed Jan 4 13:46:25 2023 +0800

    feat: stream subsystem support eureka service discovery (#8583)
    
    Fixes https://github.com/apache/apisix/issues/7779
---
 apisix/init.lua             |  5 +++
 docs/en/latest/discovery.md | 32 +++++++++++++++
 docs/zh/latest/discovery.md | 32 +++++++++++++++
 t/discovery/stream/eureka.t | 96 +++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 165 insertions(+)

diff --git a/apisix/init.lua b/apisix/init.lua
index d968a1244..d238bd161 100644
--- a/apisix/init.lua
+++ b/apisix/init.lua
@@ -907,6 +907,11 @@ function _M.stream_init_worker()
     router.stream_init_worker()
     apisix_upstream.init_worker()
 
+    local discovery = require("apisix.discovery.init").discovery
+    if discovery and discovery.init_worker then
+        discovery.init_worker()
+    end
+
     load_balancer = require("apisix.balancer")
 
     local_conf = core.config.local_conf()
diff --git a/docs/en/latest/discovery.md b/docs/en/latest/discovery.md
index 9a7bbfef7..e5ccada41 100644
--- a/docs/en/latest/discovery.md
+++ b/docs/en/latest/discovery.md
@@ -182,6 +182,8 @@ discovery:
 
 ## Upstream setting
 
+### L7
+
 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 :
 
 ```shell
@@ -243,6 +245,36 @@ Suppose both A-SERVICE and B-SERVICE provide a `/test` 
API. The above configurat
 
 **Notice**:When configuring `upstream.service_name`,  `upstream.nodes` will no 
longer take effect, but will be replaced by 'nodes' obtained from the registry.
 
+### L4
+
+Eureka service discovery also supports use in L4, the configuration method is 
similar to L7.
+
+```shell
+$ curl http://127.0.0.1:9180/apisix/admin/stream_routes/1 -H 'X-API-KEY: 
edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '
+{
+    "remote_addr": "127.0.0.1",
+    "upstream": {
+        "scheme": "tcp",
+        "discovery_type": "eureka",
+        "service_name": "APISIX-EUREKA",
+        "type": "roundrobin"
+    }
+}'
+HTTP/1.1 200 OK
+Date: Fri, 30 Dec 2022 03:52:19 GMT
+Content-Type: application/json
+Transfer-Encoding: chunked
+Connection: keep-alive
+Server: APISIX/3.0.0
+Access-Control-Allow-Origin: *
+Access-Control-Allow-Credentials: true
+Access-Control-Expose-Headers: *
+Access-Control-Max-Age: 3600
+X-API-VERSION: v3
+
+{"key":"\/apisix\/stream_routes\/1","value":{"remote_addr":"127.0.0.1","upstream":{"hash_on":"vars","type":"roundrobin","discovery_type":"eureka","scheme":"tcp","pass_host":"pass","service_name":"APISIX-EUREKA"},"id":"1","create_time":1672106762,"update_time":1672372339}}
+```
+
 ## Embedded control api for debugging
 
 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:
diff --git a/docs/zh/latest/discovery.md b/docs/zh/latest/discovery.md
index 189945a0d..c0db0ade8 100644
--- a/docs/zh/latest/discovery.md
+++ b/docs/zh/latest/discovery.md
@@ -186,6 +186,8 @@ discovery:
 
 ## upstream 配置
 
+### 七层
+
 APISIX 是通过 `upstream.discovery_type` 选择使用的服务发现,`upstream.service_name` 
与注册中心的服务名进行关联。下面是将 URL 为 "/user/\*" 的请求路由到注册中心名为 "USER-SERVICE" 的服务上例子:
 
 ```shell
@@ -246,3 +248,33 @@ $ curl http://127.0.0.1:9180/apisix/admin/routes/2 -H 
'X-API-KEY: edd1c9f034335f
 假如 A-SERVICE 和 B-SERVICE 都提供了一个 `/test` 的接口,通过上面的配置,可以通过 `/a/test` 访问 
A-SERVICE 的 `/test` 接口,通过 `/b/test` 访问 B-SERVICE 的 `/test` 接口。
 
 **注意**:配置 `upstream.service_name` 后 `upstream.nodes` 
将不再生效,而是使用从注册中心的数据来替换,即使注册中心的数据是空的。
+
+### 四层
+
+eureka 服务发现也支持在四层中使用,配置方式与七层的类似。
+
+```shell
+$ curl http://127.0.0.1:9180/apisix/admin/stream_routes/1 -H 'X-API-KEY: 
edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '
+{
+    "remote_addr": "127.0.0.1",
+    "upstream": {
+        "scheme": "tcp",
+        "discovery_type": "eureka",
+        "service_name": "APISIX-EUREKA",
+        "type": "roundrobin"
+    }
+}'
+HTTP/1.1 200 OK
+Date: Fri, 30 Dec 2022 03:52:19 GMT
+Content-Type: application/json
+Transfer-Encoding: chunked
+Connection: keep-alive
+Server: APISIX/3.0.0
+Access-Control-Allow-Origin: *
+Access-Control-Allow-Credentials: true
+Access-Control-Expose-Headers: *
+Access-Control-Max-Age: 3600
+X-API-VERSION: v3
+
+{"key":"\/apisix\/stream_routes\/1","value":{"remote_addr":"127.0.0.1","upstream":{"hash_on":"vars","type":"roundrobin","discovery_type":"eureka","scheme":"tcp","pass_host":"pass","service_name":"APISIX-EUREKA"},"id":"1","create_time":1672106762,"update_time":1672372339}}
+```
diff --git a/t/discovery/stream/eureka.t b/t/discovery/stream/eureka.t
new file mode 100644
index 000000000..5d3246167
--- /dev/null
+++ b/t/discovery/stream/eureka.t
@@ -0,0 +1,96 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+use t::APISIX 'no_plan';
+
+repeat_each(1);
+log_level('info');
+no_root_location();
+no_shuffle();
+
+our $yaml_config = <<_EOC_;
+apisix:
+  node_listen: 1984
+deployment:
+  role: data_plane
+  role_data_plane:
+    config_provider: yaml
+discovery:
+  eureka:
+    host:
+      - "http://127.0.0.1:8761";
+    prefix: "/eureka/"
+    fetch_interval: 10
+    weight: 80
+    timeout:
+      connect: 1500
+      send: 1500
+      read: 1500
+_EOC_
+
+add_block_preprocessor(sub {
+    my ($block) = @_;
+
+    if (!$block->stream_request) {
+        # GET /eureka/apps/APISIX-EUREKA HTTP/1.1\r\nHost: 
127.0.0.1:1985\r\nConnection: close\r\n\r\n
+        $block->set_value("stream_request", 
"\x47\x45\x54\x20\x2f\x65\x75\x72\x65\x6b\x61\x2f\x61\x70\x70\x73\x2f\x41\x50\x49\x53\x49\x58\x2d\x45\x55\x52\x45\x4b\x41\x20\x48\x54\x54\x50\x2f\x31\x2e\x31\x0d\x0a\x48\x6f\x73\x74\x3a\x20\x31\x32\x37\x2e\x30\x2e\x30\x2e\x31\x3a\x31\x39\x38\x35\x0d\x0a\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x3a\x20\x63\x6c\x6f\x73\x65\x0d\x0a\x0d\x0a");
+    }
+
+});
+
+run_tests();
+
+__DATA__
+
+=== TEST 1: get APISIX-EUREKA info from EUREKA
+--- yaml_config eval: $::yaml_config
+--- apisix_yaml
+stream_routes:
+  -
+    id: 1
+    server_port: 1985
+    upstream:
+      service_name: APISIX-EUREKA
+      discovery_type: eureka
+      type: roundrobin
+
+#END
+--- stream_response_like
+.*<name>APISIX-EUREKA</name>.*
+--- error_log
+use config_provider: yaml
+default_weight:80.
+fetch_interval:10.
+eureka uri:http://127.0.0.1:8761/eureka/.
+connect_timeout:1500, send_timeout:1500, read_timeout:1500.
+
+
+
+=== TEST 2: error service_name name
+--- yaml_config eval: $::yaml_config
+--- apisix_yaml
+stream_routes:
+  -
+    id: 1
+    server_port: 1985
+    upstream:
+      service_name: APISIX-EUREKA-DEMO
+      discovery_type: eureka
+      type: roundrobin
+
+#END
+--- error_log eval
+qr/.* no valid upstream node.*/

Reply via email to