I have a number of services that expose their API via HTTP. These services are 
independent, but interoperate; thus, a Content Service might interrogate a User 
Service to determine profile information for a user. The services might be on 
the same host, or they might be on distributed hosts. Services using compatible 
APIs might not even have the same implementation environment (e.g. an 
underlying ASP, PHP or Rails implementation). The services are not bound to 
each other in a fixed way, and any given service might have cause to interact 
with both local and remote services. 

Thus, sometimes the content service on http://hostedhost/content needs to 
interrogate http://hostedhost/usrv (part of the same Component). 

But at other times it might need to interrogate http://clienthost/usrv (an 
instance running on a different host across the public Internet). 

In the event that both the client and server service for a given transaction 
are both Restlets in the same Component, I would like the ability to shortcut 
the serialization, deserialization, and network overhead of the protocol and 
pass the Request from the client directly to the local Server and get the 
Response back, in-VM. This allows the same code base to be highly efficient in 
a small monolithic installation (e.g. a portable application), and highly 
versatile in a distributed environment. 

Ideally, I would prefer that this happened transparently based on the 
definition of the VirtualHosts in the current component; a 
Client(Protocol.HTTP) asked to make a request from http://hostedhost to 
http://hostedhost would automatically skip the network layer and forward the 
request internally. 

Short Term: 

Is this the best way to implement this myself: create a new extension along the 
lines of com.noelios.restlet.ext.httpclient_3.1, which would attempt to detect 
the "locality" condition, forward via HTTP when needed, and instead poke 
Requests at the current component's ServerRouter when possible? Any obvious 
thread safety or other issues I should concern myself with? 

Long Term: 

Does anyone other than me perceive this as valuable behavior? Conversely, any 
major inherent problems? Should an option to behave this way be a part of the 
reference implementation, even as an extension? 

- Rob 

Reply via email to