[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [ecf-dev] Problem with Service Endpoint matching when using different network names
|
On 7/18/2018 4:50 AM, Peter Hermsdorf wrote:
Hi,
sorry for being late with my answer. See my comments inline.
I see. So external clients are using VPN addressing and internal
clients LAN addresses. Correct? And you would like a single
server(s) (with 1...or multiple nics?), to host remote service(s) to
both types of clients....internal and external. Something like this:
C1-->addr:foo1.bar.com:1234-->VPN-->IP1 addr of
server1-->Server1-->Serviceinstance
|
C2-> IP1 (or IP2?) addr of server1---|
Seem right?
Correct
For the moment, forget about the dns names. What do the IP
addresses/port look like for your C1 and C2? e.g. what does C1, C2
server address look like, what are IP1 and IP2, does the Server1 have
multiple nics (IP1/IP2) or just one?
In most installations the server has one IP address. Sometimes we can
use this IP address when accessing the server trough VPN, sometimes
there is a mapping somewhere in between...
When the mapping is done, who/what does the mapping?..and how is it
done? It seems to me that's the problematic case. Does it map both IP
address and port, or just IP address? Do you know if it's using NAT or
some other tech?
Are there other services on this net...e.g. a web server...that are
working properly with the addressing properties that you are looking
for? If so, how is that done? A reverse proxy or load balancing hw or ?
I think what we need is a completely hostname (and port) agnostic
way to match the service endpoints between the client and the server.
In other words: one thing is to define the network target (by
hostname or IP and port) and the other thing would be to match the
remote service once the client and server are connected by network
(via the service name and version etc.).
Modifying a single generic provider to do this could be difficult.
The main reason for this is that the generic provider has the notion
of a group of connected processes... .the server's unique group name
must consist of *some* address that is understood as unique among all
group members connected within a particularly container instance
...e.g. ecftcp://foo1.bar.com:3282/server is the 'name/ID' of the
server in the group connected that container instance (and it's
unique ID).
from my point of view a unique ID for a remote service could well be
ecftcp://server .
Unfortunately it can't be that, because if more than one server used
that same identifier and a single client was trying to get to two
different service instances there would be no way to tell them apart.
But the challenge here is probably to split the "do the network
connection" code from "match the correct service" code, since as far
as I can tell the endpoint ID (ecftcp://foo1.bar.com:3282/server) is
used for both parts.
To be clear, even with the generic provider there is a separation
between the id identifying the java process that contains remote
services (ecftcp://foo1.bar.com:3282/server) and the remote service
instance: (i.e. 1, 2, 3...(long). In the edef the container-relative
service instance is the property with name: ecf.rsvc.id.
But the real problem is that since the generic provider has the notion
of a connected group of processes (containers)...i.e. peer-to-peer,
rather than a simple client -> server structure, it's necessary to give
the group manager (the server with a hub and spoke topology) a unique id
within the group that all clients can agree on. For tcp-based comm
(generic provider), that id is usually the host:port combination
(InetAddress) since that's guaranteed globally unique and doesn't
require any additional name mapping. However, on the network you are
targeting it seems that some clients need to use IP address 1 and other
clients IP address 2...to access the same server and service.
I suspect that your network topology may require moving to a strict
client -> server notion of rpc, rather than using a group topology. It
would mean that all services would be exported by a server and imported
by clients, and that no services would be exported by clients or
imported by server.
If having a strict client->server works for your services, then I would
suggest you try the either the JaxRSRemoteService providers [1] which
are based upon HttpService (jetty server usually). It still seems to
me that you would need a reverse proxy like nginx to expose the same
server to access via multiple IP addresses/networks, and I'm not sure if
that's possible on your target network, but nginx is frequently used for
that.
With strict client-server it's possible that ROSGi (based upon tcp)
would also work, but since I don't yet understand what your address
mapping is about (e.g. NAT, etc), and I haven't tried ROSGI under
anything other than 'normal' addressing/networking scenarios, I don't
feel comfortable suggesting that. It also seems to me that a tcp
reverse proxy might be needed also (a relatively recent nginx feature).
However, it's quite possible to export a single service with multiple
generic provider container instances...e.g. couldn't you export
service with a container for VPN clients, and another that exports
the same service using 'internal' addressing (with different IP and
port)?
As for other distribution providers
It's possible that R0SGi could work for this, but the VPN might still
present a problem.
You could use one of the http-based providers (e.g. Jersey or CXF) in
combination with the generic provider...e.g. you could export with
both generic and http-based distribution providers simultaneously to
expose the remote service via two (or more) different transports.
I would like to avoid to having different ways/options/configuration
to connect to remote services since that would mean a more or less
complicated configuration for developers and consultants connecting to
remote services running at the customer
If I'm understanding you right, you will at least need to provide
different target IP addresses/port combinations to different clients C1
and C2, right? I don't see a way to avoid that, unless you provide
some other public service that does that...i.e. analogous to DNS but
just for your app. You could do that, btw without too much
difficulty...i.e. create a public/internet etcd server, for example
(etcd is the http-based discovery protocol that Google uses for
Kubernetes). It would require running yet another server (etcd),
maintaining, etc...but at least you don't have to develop it.
Also: Is it possible to consider alternative network topologies? e.g.
having both an external and internal servers? or running the service
outside vpn/in cloud?
No, all installations are on premise at the customers
I'm happy to point you in the right direction, but I have a feeling
that there could be multiple ways to deal with this, so there might
not be just one 'right direction'. Let's keep discussing.
I'm open to use/adapt a different distribution provider when that
solves the problem.
I would try strict client->server over http first. Actually I would
suggest just running small http server on your server process...with a
single servlet or even just page, and if you can configure things to
access in the way you want via C1 and C2...CN, then you almost certainly
will be able to use osgi, jetty + one of the JaxRSRemoteService providers.
My main "wish" would be to decouple the "raw" network connection (use
any IP that works or any hostname that works - in term of getting a
network connection) and not mix that with the actual service that is
then consumed/provided at that network location.
Yes. I think if you can adopt a client -> server/service model for all
your services, and can get a combination of tech (e.g. reverse proxy +
http server) that allows http access with the desired addressing over
your target networks, then I expect you can use one of the JaxRS
distribution providers without too much trouble. It will likely
require changing the serialization of method args and return values.
For ECF Photon I've done quite a lot of work on the JaxRS distribution
providers (e.g. to move them up to OSGi R7 spec and to support both
Jersey and CXF underneath), but I've tried to make them extensible and
configurable (e.g. using Jaxrs extensions) and will provide direct
support for these/all providers as I can.
Scott
[1] https://github.com/ECF/JaxRSProviders
[2] https://wiki.eclipse.org/Tutorial:_JaxRS_Remote_Services_on_Karaf