[Apiman-user] [DKIM] Re: publish api to specific gateway

Jon Huang chttl582 at gmail.com
Fri Dec 14 04:34:38 EST 2018


Dear Eric

Yes, I think it's the root cause.
and sure, I've posted the issue on GitHub.
Thanks

Eric Wittmann <eric.wittmann at redhat.com> 於 2018年12月14日 週五 上午4:30寫道:

> Very interesting, thanks Jon.  So if I understand correctly, the problem
> is that the Client has a contract for API1 (published to GW1) and a
> contract for API2 (published to GW2).  And so when registering a client,
> we're trying to send Contracts for APIs that don't exist on the GW.  So
> yeah, filtering the list of Contracts during registration makes sense.  We
> should file this as a bug in Apiman (on GitHub).  Would you be willing to
> do that?
>
> https://github.com/apiman/apiman/issues
>
> -Eric
>
>
> On Thu, Dec 13, 2018 at 1:54 AM Jon Huang <chttl582 at gmail.com> wrote:
>
>> Dear Eric
>>
>> I spent some time to track this issue.
>> First I hit the status API (GATEWAY_API_URL/system/status) and got
>> following response:
>> {
>>     "id": "apiman-gateway-api",
>>     "name": "API Gateway REST API",
>>     "description": "The API Gateway REST API is used by the API Manager
>> to publish APIs and register clients.  You can use it directly if you wish,
>> but if you are utilizing the API Manager then it's probably best to avoid
>> invoking this API directly.",
>>     "version": "1.5.2-SNAPSHOT",
>>     "up": true
>> }
>> seems OK, then I hit the register client API (PUT  GATEWAY_API_URL
>> /clients) to retrieve further information, which returned an
>> ApiNotFoundException.
>> After reviewing the payload, I found the register client API sent every
>> contract info to the gateway endpoint. (ex: contract A & B to Gateway 2,
>> refer to following diagram)
>> {
>> "organizationId": "ORG",
>> "clientId": "CLIENT",
>> "version": "1.0",
>> "apiKey": "1763bc30-64af-4fd8-877e-1382c1a2cac2",
>> "contracts": [{
>> "apiOrgId": "ORG",
>> "apiId": "API1",
>> "apiVersion": "1.0",
>> "plan": "plan",
>> "policies": []
>> }, {
>> "apiOrgId": "ORG",
>> "apiId": "API2",
>> "apiVersion": "1.0",
>> "plan": "plan",
>> "policies": []
>> }
>> ]
>> }
>>
>> [image: image.png]
>>
>> So if there is an contract's which its API publishing to another gateway
>> leads to 404 not found exception. (ex: contract A info sent to Gateway 2)
>> Maybe filtering the register client API payload or preventing API manager
>> UI from creating contract between APIs with different gateways can solve
>> this issue. (or is there any other solution?)
>> Thanks.
>>
>>
>> Eric Wittmann <eric.wittmann at redhat.com> 於 2018年12月6日 週四 下午9:47寫道:
>>
>>> Your diagram looks exactly right.  I don't know why you are getting a
>>> 404 error when trying to register the client.  My best guess is that your
>>> Gateway 2 configuration is actually incorrect and that the "Test Gateway"
>>> function is returning a false positive somehow.  Can you post the
>>> configuration settings you are using for *BOTH* of your Gateways?  (I
>>> assume you can successfully publish an API to Gateway 1).
>>>
>>> You should be able to manually confirm your Gateway settings using e.g.
>>> curl or postman.  There is an endpoint on the Gateway API that you can hit:
>>>
>>> GATEWAY_API_URL/system/status
>>>
>>> You'll need to provide auth info for this to work, but it will return a
>>> JSON response like this:
>>>
>>> {
>>>     "id": "xyz",
>>>     "name": "Apiman Gateway API",
>>>    "description": "... something here ...",
>>>    "version": "x.y.z",
>>>    "up": true
>>> }
>>>
>>> The UI should be checking that endpoint when you click the "Test
>>> Gateway" button, but perhaps there's a bug in that.
>>>
>>> If the above endpoint can be hit and verified, then I'm at a complete
>>> loss as to why you'd be getting a 404 when trying to publish!  The
>>> implication is that the Gateway API endpoint that the UI is attempting to
>>> use is missing.  But if /system/status can be found, then everything else
>>> should be available too!
>>>
>>> @Marc Savy <msavy at redhat.com> - any thoughts on this?
>>>
>>> -Eric
>>>
>>>
>>> On Thu, Dec 6, 2018 at 3:02 AM Jon Huang <chttl582 at gmail.com> wrote:
>>>
>>>> Dear Eric
>>>>
>>>> Thanks for your explanation.
>>>> I tried to deploy another gateway with a new storage(Elasticsearch) and
>>>> configure API to publish on the new one. (API manager version 1.5.1)
>>>> However when I tried to create a contract between API and client apps
>>>> then re-register client apps, error happened.
>>>> It seems API manager fails to connect to gateway2. (But UI-> Manage
>>>> Gateways -> Edit Gateway -> Test Gateway returns *Gateway
>>>> Configuration Valid*)
>>>> (io.apiman.manager.api.rest.contract.exceptions.ActionException:
>>>> Failed to register client.)
>>>> I put detail log in attachment if you are interested.
>>>> Thanks
>>>>
>>>> simple diagram for my deployment test.
>>>> [image: image.png]
>>>>
>>>>
>>>> Volk, Florian <Florian.Volk at scheer-group.com> 於 2018年11月30日 週五
>>>> 下午10:24寫道:
>>>>
>>>>> Hi Eric,
>>>>>
>>>>>
>>>>>
>>>>> thanks for this detailed answer J
>>>>>
>>>>> This is quite interesting. We didn’t expected this behavior. Maybe it
>>>>> would be good to place this in the documentation, maybe with this picture ;)
>>>>>
>>>>>
>>>>>
>>>>> But this raises a few new questions for us. I try to explain:
>>>>>
>>>>>
>>>>>
>>>>> ·         Do we need for *alternate* setup two UIs if we don’t want
>>>>> to use the REST interface or CLI-Tool?
>>>>>
>>>>> o   One for «Gateway Alpha» and one for «Gateway Beta»?
>>>>>
>>>>> o   Because I think you can only connect one elasticseach instance
>>>>> with the UI. Am I right on this?
>>>>>
>>>>> o   What about the metrics in this use case à leads to two UIs?
>>>>>
>>>>>
>>>>>
>>>>> ·         For the «one logical gateway»
>>>>>
>>>>> o   If I understand you correctly this would mean that I also have to
>>>>> configure only one gateway in my UI and can add X more without adding them
>>>>> into the UI.
>>>>> I just have to point them against the same elasticsearch instance.
>>>>>
>>>>> I also post this mail to the github issue, so we can stay within the
>>>>> mailinglist.
>>>>>
>>>>>
>>>>>
>>>>> Thanks again,
>>>>>
>>>>> Florian
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> *Von:* Eric Wittmann <eric.wittmann at redhat.com>
>>>>> *Gesendet:* Friday, 30 November 2018 14:57
>>>>> *An:* Volk, Florian <Florian.Volk at scheer-group.com>
>>>>> *Cc:* chttl582 at gmail.com; Marc Savy <marc.savy at redhat.com>; Kihm,
>>>>> Benjamin <Benjamin.Kihm at scheer-group.com>; Gebert, Alfred <
>>>>> Alfred.Gebert at scheer-group.com>; apiman-user at lists.jboss.org
>>>>> *Betreff:* Re: [Apiman-user] [DKIM] Re: publish api to specific
>>>>> gateway
>>>>>
>>>>>
>>>>>
>>>>> Sure no problem.  The typical use-case for having multiple Gateway
>>>>> nodes is to scale the gateway layer horizontally and then put a load
>>>>> balancer in front of them.  So for example you might start up 5 apiman
>>>>> gateway instances and configure them all to use the same Elasticsearch
>>>>> instance for persistence (i.e. where to store configuration info like which
>>>>> APIs have been published).  In this use-case, every gateway instance has
>>>>> the same set of APIs "published" to it.  You can publish an API from the
>>>>> UI/manager to **any** of the gateway instances and they will all know about
>>>>> that API.  This is the "Single Logical Gateway" use-case -- the UI/manager
>>>>> and all consumers don't know or care how many gateway nodes there are -
>>>>> there could be 1 node, or there could be 100.  It behaves the same
>>>>> logically.
>>>>>
>>>>>
>>>>>
>>>>> An **alternate** use case for having multiple gateways is when you
>>>>> actually want different APIs to be deployed to different gateways.  So
>>>>> let's say you wanted Gateway Alpha to be able to proxy traffic to APIs A,
>>>>> B, and C.  Then you have Gateway Beta which you want to proxy traffic to
>>>>> APIs C, D, and E.  In that case, consumer traffic MUST be routed through
>>>>> Gateway Alpha in order to access APIs A and B.  Consumer traffic MUST be
>>>>> routed through Gateway Beta to access APIs D and E.  Finally, consumer
>>>>> traffic can be routed to **either** Gateway Alpha or Gateway Beta in order
>>>>> to access API C.  Think of this as the "Two Logical Gateways" use-case.
>>>>>
>>>>>
>>>>>
>>>>> In order to achieve the "Two Logical Gateways" use-case, you will need
>>>>> **two** separate persistence stores (Elasticsearch instances).  Then you
>>>>> configure Gateway Alpha to use persistence store #1 and configure Gateway
>>>>> Beta to use persistence store #2.
>>>>>
>>>>>
>>>>>
>>>>> Note that you can have multiple gateway nodes for EACH of the two
>>>>> logical gateways.  So for example you could have 5 gateway instances all
>>>>> pointing to persistence store #1 - these 5 nodes would make up a single
>>>>> logical gateway called "Gateway Alpha".  Then you could have 10 gateway
>>>>> instances all pointing to persistence store #2 - and these would be a
>>>>> single logical gateway called "Gateway Beta".
>>>>>
>>>>>
>>>>>
>>>>> Here is a diagram of what the architecture might look like:
>>>>>
>>>>>
>>>>>
>>>>> [image: image.png]
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Fri, Nov 30, 2018 at 8:38 AM Volk, Florian <
>>>>> Florian.Volk at scheer-group.com> wrote:
>>>>>
>>>>> Hi Eric,
>>>>>
>>>>>
>>>>>
>>>>> now I’m confused. We use Elasticsearch as backend. If I understand you
>>>>> correctly it would mean that we have to setup an Elasticsearch instance for
>>>>> each gateway?
>>>>>
>>>>> On the other point, if the gateways operate as logical unit, why is
>>>>> there a configuration option in the ui?
>>>>>
>>>>>
>>>>>
>>>>> Can you explain this a little bit more detailed? Maybe you have a
>>>>> configuration example.
>>>>>
>>>>>
>>>>>
>>>>> Regards,
>>>>> Florian
>>>>>
>>>>>
>>>>>
>>>>> *Von:* Eric Wittmann <eric.wittmann at redhat.com>
>>>>> *Gesendet:* Friday, 30 November 2018 14:22
>>>>> *An:* Volk, Florian <Florian.Volk at scheer-group.com>
>>>>> *Cc:* chttl582 at gmail.com; Marc Savy <marc.savy at redhat.com>; Kihm,
>>>>> Benjamin <Benjamin.Kihm at scheer-group.com>; Gebert, Alfred <
>>>>> Alfred.Gebert at scheer-group.com>; apiman-user at lists.jboss.org
>>>>> *Betreff:* Re: [Apiman-user] [DKIM] Re: publish api to specific
>>>>> gateway
>>>>>
>>>>>
>>>>>
>>>>> Are both gateways using the same persistent storage?  Each gateway
>>>>> would need separate, independent persistence otherwise they will behave as
>>>>> a single "logical" gateway.
>>>>>
>>>>>
>>>>>
>>>>> -Eric
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Fri, Nov 30, 2018 at 4:39 AM Volk, Florian <
>>>>> Florian.Volk at scheer-group.com> wrote:
>>>>>
>>>>> Hello together,
>>>>>
>>>>>
>>>>>
>>>>> I was interested in this and made a short test in my loacal
>>>>> environment and I am able to reproduce this.
>>>>>
>>>>> I created a ticket on github for this (
>>>>> https://github.com/apiman/apiman/issues/711). We may can fix this
>>>>> shortly.
>>>>>
>>>>>
>>>>>
>>>>> Regards,
>>>>>
>>>>> Florian
>>>>>
>>>>>
>>>>>
>>>>> *Von:* apiman-user-bounces at lists.jboss.org <
>>>>> apiman-user-bounces at lists.jboss.org> *Im Auftrag von *Jon Huang
>>>>> *Gesendet:* Friday, 30 November 2018 03:28
>>>>> *An:* marc.savy at redhat.com
>>>>> *Cc:* apiman-user at lists.jboss.org
>>>>> *Betreff:* [DKIM] Re: [Apiman-user] publish api to specific gateway
>>>>>
>>>>>
>>>>>
>>>>> Dear Marc
>>>>>
>>>>>
>>>>>
>>>>> Yes I untick another gateway however request towards both gateways
>>>>> still works.
>>>>>
>>>>> Besides I tried to publish API via admin REST API (post api version
>>>>> then put gateway info), both gateways forwards request too.
>>>>>
>>>>> Before filing a bug is there any apigw setting I shall check? (such as
>>>>> parameter in apiman.properties or etc...)
>>>>>
>>>>> Thanks for your help.
>>>>>
>>>>> Regards
>>>>>
>>>>> Marc Savy <marc.savy at redhat.com> 於 2018年11月21日 週三 下午9:35寫道:
>>>>>
>>>>> Apologies for the terribly slow reply. We've had so much spam I've
>>>>> missed legitimate emails like this.
>>>>>
>>>>>
>>>>>
>>>>> Did you explicitly untick the other gateway? Was this via the UI or
>>>>> the API?
>>>>>
>>>>>
>>>>>
>>>>> Did you resolve this issue? If not, please file a bug:
>>>>> https://github.com/apiman/apiman/issues
>>>>>
>>>>>
>>>>>
>>>>> On Thu, 4 Oct 2018 at 05:00, Jon Huang <chttl582 at gmail.com> wrote:
>>>>>
>>>>> Dears
>>>>>
>>>>>
>>>>>
>>>>> I had set up 2 gateways.
>>>>>
>>>>> When I new an API, I have to choose which gateway to publish. (select
>>>>> list at Gateway section in the implementation tab).
>>>>>
>>>>> However after creating a client app and contract for test, I found
>>>>> request via another gateway still works.
>>>>>
>>>>> (I guest when publishing to gateway 1 and request via gateway 2 shall
>>>>> fail)
>>>>>
>>>>> Am I misunderstanding or I miss some settings to make it work?
>>>>>
>>>>> Thanks
>>>>>
>>>>> _______________________________________________
>>>>> Apiman-user mailing list
>>>>> Apiman-user at lists.jboss.org
>>>>> https://lists.jboss.org/mailman/listinfo/apiman-user
>>>>>
>>>>> _______________________________________________
>>>>> Apiman-user mailing list
>>>>> Apiman-user at lists.jboss.org
>>>>> https://lists.jboss.org/mailman/listinfo/apiman-user
>>>>>
>>>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/apiman-user/attachments/20181214/0f97be7a/attachment-0001.html 


More information about the Apiman-user mailing list