Hi, Ming Wen.

I'm very sorry for  reply so late.

> > First, select nodes that the registry considers to be healthy. Then, from
> these nodes, select one that APISIX considers healthy.
> Which means there are two health checks here? One is Apache APISIX and one is 
> Eureka.

yes,  Apache APISIX health check is optional.

> > From a usage scenario, dynamic DNS service should not be used. That loses
> the meaning of a registry.
> So dynamic DNS service exist in Eureka, do we ignore it or thrown an error?

ignore now.

> > I think it is needed, but APISIX configuration center still does not
> > support the configuration of this format.
> We can store them in the etcd

> > the weight in metadata unnecessary.
> we should remove useless data.

Ok, I do with it.

> > There are two ways:
> > 1. Fetch all, and then filter out what we need.
> > 2. According to the specified service name, one by one
> This feels like a custom development, how does it become generic?

This problem can be dealt with later by the new PR.

> ------------------ Original ------------------
> From: "Ming Wen"<wenm...@apache.org>;
> Date: Sun, Apr 5, 2020 09:51 AM
> To: "dev"<dev@apisix.apache.org>;
> Subject: Re: [DISCUSS] how about the design of APISIX eureka integration?

> > First, select nodes that the registry considers to be healthy. Then, from
> these nodes, select one that APISIX considers healthy.
> Which means there are two health checks here? One is Apache APISIX and one
> is Eureka.

> > From a usage scenario, dynamic DNS service should not be used. That loses
> the meaning of a registry.
> So dynamic DNS service exist in Eureka, do we ignore it or thrown an error?

> > I think it is needed, but APISIX configuration center still does not
support the configuration of this format.
We can store them in the etcd

> > the weight in metadata unnecessary.
we should remove useless data.

> > There are two ways:
> > 1. Fetch all, and then filter out what we need.
> > 2. According to the specified service name, one by one
> This feels like a custom development, how does it become generic?

> Thanks,
> Ming Wen, Apache APISIX & Apache SkyWalking
> Twitter: _WenMing


> ~Jarvis.Qiu <qiu...@foxmail.com> ??2020??4??4?????? ????8:04??????

> Hi, Ming Wen,
>
> >> Common registries: Eureka, Etcd, Consul, Zookeeper, Nacos etc.
> > Apache APISIX uses them for service discovery, so do you trust their
> health
> > check results?
>
> Usually there is no problem.
>
> > What if their health check results conflict with Apache APISIX's own
> > upstream health check?
> > For example, Eureka believes that an upstream node is alive, but Apache
> > APISIX thinks that this node is dead. What should I do?
>
> First, select nodes that the registry considers to be healthy. Then, from
> these nodes, select one that APISIX considers healthy.
>
>
> > another issue:
> > If the dynamic DNS service of the Eureka is used,
> > how does DNS resolver in Apache APISIX guarantee consistency with the
> > Eureka at this time?
>
> From a usage scenario, dynamic DNS service should not be used. That loses
> the meaning of a registry.
>
> And the client load blance becomes the server load blance.
>
>
> > > prefix: "/eureka/"
> > > weight: 100
> > Whose weight is this? and why we need prefix?
>
> the weight is default value for the service node. Usage: `local weight =
> metadata.weight or local_conf.eureka.weight or 100`
>
> Use prefix in order to shorten the Eureka host.
>
>
> > Do these Eureka nodes need to be updated dynamically?
> > The yaml configuration cannot be dynamically updated.
>
> I think it is needed, but APISIX configuration center still does not
> support the configuration of this format.
>
> > > "port" : 8761,
> > >    "weight" : 100,
> > >   "metadata" : {
> > >      "management.port": "8761",
> > >      "weight": 100
> > >   }
>
> > the port and weight are repeated twice. Is metadata unnecessary?
>
> the weight in metadata unnecessary. Because no to deal with the metadata,
> use of the metadata of the original data.
>
> > > Then implement the 'init_worker' function for initialization and the
> > 'nodes'
> > > function for obtaining the list of service instance nodes in'
> eureka.lua'
>
> > If we only need to get part of the data from eureka, what should we do?
>
> There are two ways:
>
> 1. Fetch all, and then filter out what we need.
>
> 2. According to the specified service name, one by one
>
> ------------------ Original ------------------
> From: "Ming Wen"<wenm...@apache.org>;
> Date: Wed, Apr 1, 2020 10:00 AM
> To: "dev"<dev@apisix.apache.org>;
> Subject: Re: [DISCUSS] how about the design of APISIX eureka integration?
>
> hello, Jarvis,
>
> > Common registries: Eureka, Etcd, Consul, Zookeeper, Nacos etc.
> Apache APISIX uses them for service discovery, so do you trust their health
> check results?
> What if their health check results conflict with Apache APISIX's own
> upstream health check?
> For example, Eureka believes that an upstream node is alive, but Apache
> APISIX thinks that this node is dead. What should I do?
>
> another issue:
> If the dynamic DNS service of the Eureka is used,
> how does DNS resolver in Apache APISIX guarantee consistency with the
> Eureka at this time?
>
> > prefix: "/eureka/"
> > weight: 100
> Whose weight is this? and why we need prefix?
> Do these Eureka nodes need to be updated dynamically?
> The yaml configuration cannot be dynamically updated.
>
> > "port" : 8761,
> >    "weight" : 100,
> >   "metadata" : {
> >      "management.port": "8761",
> >     "weight": 100
> >   }
>
> the port and weight are repeated twice. Is metadata unnecessary?
>
> > Then implement the 'init_worker' function for initialization and the
> 'nodes'
> > function for obtaining the list of service instance nodes in' eureka.lua'
>
> If we only need to get part of the data from eureka, what should we do?
>
> Thanks,
> Ming Wen, Apache APISIX & Apache SkyWalking
> Twitter: _WenMing
>
>
> ~Jarvis.Qiu <qiu...@foxmail.com> ??2020??3??29?????? ????10:46??????
>
> > English version doc for the integration design of APISIX eureka.
> >
> > # Integration service discovery registry
> >
> > ## Summary
> >
> > When system traffic changes, the number of servers of the downstream
> > service also increases or decreases, or the server needs to be replaced
> due
> > to its hardware failure. If the gateway maintains downstream 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??
> >
> >
> > 1. When the service starts, it will report some of its information, such
> > as the service name, IP, port and other information to the registry. The
> > services communicate with the registry using a mechanism such as a
> > heartbeat, and if the registry and the service are unable to communicate
> > for a long time, the instance will be cancel.When the service goes
> offline,
> > the registry will delete the instance information.
> > 2. The gateway gets service instance information from the registry in
> > near-real time.
> > 3. When the user requests the service through the gateway, the gateway
> > selects one instance from the registry for proxy.
> >
> > Common registries: Eureka, Etcd, Consul, Zookeeper, Nacos etc.
> >
> > ## Enabled discovery client
> >
> > Add the following configuration to `conf/config.yaml` file and select one
> > discovery client type which you want:
> >
> > ```yaml
> > apisix:
> >   discovery: eureka
> > ```
> >
> > The supported discovery client: Eureka.
> >
> > ## Configuration for discovery client
> >
> > Once the registry is selected, it needs to be configured.
> >
> > ### Configuration for Eureka
> >
> > Add following configuration in `conf/config.yaml` ??
> >
> > ```yaml
> > eureka:
> >   host:                            # it's possible to define multiple
> > eureka hosts addresses of the same eureka cluster.
> >     - "http://${usename}:${passowrd}@${eureka_host1}:${eureka_port1}";
> >     - "http://${usename}:${passowrd}@${eureka_host2}:${eureka_port2}";
> >   prefix: "/eureka/"
> >   weight: 100                      # default weight for node
> >   enable_metadata: false
> >   timeout:
> >     connect: 2000
> >     send: 2000
> >     read: 5000
> > ```
> >
> >
> > **Tip**?? It would be even better if these configurations could be moved
> to
> > the configuration center for management.
> >
> > ## Upstream setting
> >
> > Here is an example of routing a request with a uri of "/user/*" to a
> > service which named "user-service"  in the registry :
> >
> > ```shell
> > $ 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"
> >     }
> > }'
> >
> > 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"}},"createdIndex":61925,"key":"\/apisix\/routes\/1","modifiedIndex":61925},"action":"create"}
> > ```
> >
> > *Notice**??When configuring `upstream.service_name`,  `upstream.nodes`
> will
> > no longer take effect, but will be replaced by 'nodes' obtained from the
> > registry.
> >
> > ## How do I extend the discovery client?
> >
> > It is very easy for APISIX to extend the discovery client. Let's take
> > Eureka as an example.
> >
> > ### 1. the code structure of discovery client
> >
> > First, add 'eureka.lua' in the 'lua/apisix/discovery/' directory;
> >
> > Then implement the 'init_worker' function for initialization and the
> > 'nodes' function for obtaining the list of service instance nodes in'
> > eureka.lua':
> >
> >   ```lua
> >   local _M = {
> >       version = 1.0,
> >   }
> >
> >
> >   function _M.nodes(service_name)
> >       ... ...
> >   end
> >
> >
> >   function _M.init_worker()
> >       ... ...
> >   end
> >
> >
> >   return _M
> >   ```
> >
> > ### 2. How convert Eureka's instance data to APISIX's node?
> >
> > Here's an example of Eureka's data??
> >
> > ```json
> > {
> >   "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 :
> >
> > 1. select the UP instance. When the value of `overriddenStatus` is "UP"
> or
> > the value of `overriddenStatus` is "UNKNOWN" and the value of `status` is
> > "UP".
> > 2. IP address. The `ipAddr` is the IP address of instance; and must be
> > IPv4 or IPv6.
> > 3. Port. If the value of `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["\$"]`.
> > 4. Weight. `local weight =  metadata.weight or local_conf.eureka.weight
> or
> > 100`
> >
> > By default, the result of this example is as follows:
> >
> > ```json
> > {
> >   "192.168.1.100:8761":100
> > }
> > ```
> >
> > The configuration of this format, which is very easy and clear for static
> > configuration, has obvious disadvantages, such as poor extendibility for
> > complex scenarios, such as when you want to customize the routing rules
> by
> > the metadata (e.g., grouping, etc.) information of the instance. To solve
> > this problem, we have reserved a switch for users to use, that is, when
> > 'eureka-enable_metadata' is set to 'true', the result of this example is
> as
> > follows:
> >
> > ```json
> > [
> >   {
> >     "ip" : "192.168.1.100",
> >     "port" : 8761,
> >     "weight" : 100,
> >     "metadata" : {
> >       "management.port": "8761",
> >       "weight": 100
> >     }
> >   }
> > ]
> > ```
> >
> > However, the default balancer of APISIX does not support this format yet.
> > In addition, the metadata and processing logic may not be the same for
> > different users, so users need to customize balancer.
> >
> >
> > >
> > > > Ming Wen <wenm...@apache.org> ??2020??3??26?????? ????12:10??????
> > >
> > > > that will be great, and you can also post the design here instead of
> PR
> > > >
> > > > ~Jarvis.Qiu <qiu...@foxmail.com>??2020??3??26?? ????????11:57??????
> > > >
> > > > > just Chinese version now.
> > > > >
> > > > >
> > > > > I need to spend some time translating it??
> > > > >
> > > > > ------------------ ???????? ------------------
> > > > > ??????: "Ming Wen"<wenm...@apache.org;
> > > > > ????????: 2020??3??26??(??????) ????11:54
> > > > > ??????: "dev"<dev@apisix.apache.org;
> > > > >
> > > > > ????: Re: [DISCUSS] how about the design of APISIX eureka
> > > integration?
> > > > >
> > > > >
> > > > >
> > > > > Do you have the English version?
> > > > >
> > > > > Thanks,
> > > > > Ming Wen, Apache APISIX & Apache SkyWalking
> > > > > Twitter: _WenMing
> > > > >
> > > > >
> > > > > ~Jarvis.Qiu <qiu...@foxmail.com ??2020??3??26?????? ????11:53??????
> > > > >
> > > > >  the doc url is :
> >
> > >
> >
> https://github.com/apache/incubator-apisix/blob/170f4650f1faeb454c1ff69ea97fe1287710ec77/doc/discovery-cn.md
> > > > >
> > > >
> > >
> >
> https://github.com/apache/incubator-apisix/blob/170f4650f1faeb454c1ff69ea97fe1287710ec77/doc/discovery-cn.md
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >  ------------------ ???????? ------------------
> > > > >  ??????: "Ming Wen"<wenm...@apache.org;
> > > > >  ????????: 2020??3??26??(??????) ????11:49
> > > > >  ??????: "dev"<dev@apisix.apache.org;
> > > > >
> > > > >  ????: Re: [DISCUSS] how about the design of APISIX eureka
> > > > > integration?
> > > > >
> > > > >
> > > > >
> > > > >  bad link, return 404.
> > > > >
> > > > >  Thanks,
> > > > >  Ming Wen, Apache APISIX &amp; Apache SkyWalking
> > > > >  Twitter: _WenMing
> > > > >
> > > > >
> > > > >  ~Jarvis.Qiu <qiu...@foxmail.com ??2020??3??26?????? ????11:48??????
> > > > >
> > > > >   Hi:
> >
> > > > > here is a doc :
> >
> https://github.com/apache/incubator-apisix/blob/170f4650f1faeb454c1ff69ea97fe1287710ec77/doc/discovery-cn.mdfor
> > the design of APISIX eureka integration.
> >
> > > > > I hope you can give me some advice.
> >
> > > > > the PR: https://github.com/apache/incubator-apisix/pull/1281

Reply via email to