diff --git a/apisix/init.lua b/apisix/init.lua index d968a1244061..d238bd161ca6 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 9a7bbfef7742..e5ccada41fff 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 189945a0d1d7..c0db0ade8290 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 000000000000..5d32461678f0 --- /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 +.*APISIX-EUREKA.* +--- 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.*/