<html>
<head>
    <base href="https://wiki.asterisk.org/wiki">
            <link rel="stylesheet" href="/wiki/s/en/2171/18/9/_/styles/combined.css?spaceKey=TOP&amp;forWysiwyg=true" type="text/css">
    </head>
<body style="background: white;" bgcolor="white" class="email-body">
<div id="pageContent">
<div id="notificationFormat">
<div class="wiki-content">
<div class="email">
    <h2><a href="https://wiki.asterisk.org/wiki/display/TOP/Service+Locator+Design">Service Locator Design</a></h2>
    <h4>Page <b>edited</b> by             <a href="https://wiki.asterisk.org/wiki/display/~khunt">Ken Hunt</a>
    </h4>
        <br/>
                         <h4>Changes (2)</h4>
                                 
    
<div id="page-diffs">
                    <table class="diff" cellpadding="0" cellspacing="0">
    
            <tr><td class="diff-snipped" >...<br></td></tr>
            <tr><td class="diff-unchanged" >Slice is available [here|Service Locator Design^service_discovery.ice]. <br> <br></td></tr>
            <tr><td class="diff-deleted-lines" style="color:#999;background-color:#fdd;text-decoration:line-through;">Event slice is available [here|Service Locator Design^service_discovery_events.ice]. <br> <br></td></tr>
            <tr><td class="diff-unchanged" >h3. Overview <br> <br></td></tr>
            <tr><td class="diff-snipped" >...<br></td></tr>
            <tr><td class="diff-unchanged" >h3. Design Diagram <br> <br></td></tr>
            <tr><td class="diff-changed-lines" ><span class="diff-deleted-words"style="color:#999;background-color:#fdd;text-decoration:line-through;">!Service_Discovery_Design.jpg|border=1!</span> <span class="diff-added-words"style="background-color: #dfd;">!ServiceDiscovery.png|border=1!</span> <br></td></tr>
            <tr><td class="diff-unchanged" > <br>h3. Service Registration <br></td></tr>
            <tr><td class="diff-snipped" >...<br></td></tr>
    
            </table>
    </div>                            <h4>Full Content</h4>
                    <div class="notificationGreySide">
        <h3><a name="ServiceLocatorDesign-Implementation"></a>Implementation</h3>

<p>An implementation of this design is available in the servicediscovery repository.</p>

<h3><a name="ServiceLocatorDesign-Files"></a>Files</h3>

<p>Slice is available <a href="/wiki/download/attachments/2457645/service_discovery.ice?version=4&amp;modificationDate=1279726726404">here</a>.</p>

<h3><a name="ServiceLocatorDesign-Overview"></a>Overview</h3>

<p>The service locator is built around the idea of having services register themselves to a central registry. A comparator can also be registered with the central registry to aid in determining whether a service can handle a request or not. The comparator can be written and deployed in the central registry to reduce the amount of remote calls that need to occur.</p>

<p>When a locate request is received all services are iterated and all supported parameters are iterated. If an initial comparison of the requested parameter and supported parameter is successful the comparator is optionally queried to do a more fine grained comparison check. If this is also successful a proxy to the service is returned to the locate request caller.</p>

<h3><a name="ServiceLocatorDesign-Interfaces"></a>Interfaces</h3>

<p>The ServiceDiscovery interface is implemented by the service discovery component and provides a method for a component to locate another component based on parameters.</p>

<p>The ServiceDiscoveryManagement interface is implemented by the service discovery component and is used by components and parameter comparators to register themselves.</p>

<p>The ServiceManagement interface is implemented by the service discovery component and is used by components to add discovery parameters that they support, suspend themselves, unsuspend themselves, and unregister.</p>

<p>The ServiceDiscoveryParamsCompare interface is implemented by parameter comparators and is used by the service discovery component to query a comparator to see if given parameters are supported.</p>

<h3><a name="ServiceLocatorDesign-PublicClasses"></a>Public Classes</h3>

<p>The ServiceDiscoveryParams class is meant to be used as a concrete class that is extended with service specific details. The service discovery component will do a comparison as best it can before passing this unaltered to a parameter comparator if one was provided when the supported parameters were added.</p>

<h3><a name="ServiceLocatorDesign-PrivateClasses"></a>Private Classes</h3>

<p>The ServiceDiscoveryParamsSpec class is used internally by the service discovery component to store information about a supported discovery parameters class and the associated compare service guid.</p>

<p>The ServiceDiscoveryComparator class is used internally by the service discovery component to store information about a compare service, such as the guid and a proxy to it.</p>

<h3><a name="ServiceLocatorDesign-DesignDiagram"></a>Design Diagram</h3>

<p><span class="image-wrap" style=""><img src="/wiki/download/attachments/2457645/ServiceDiscovery.png?version=1&amp;modificationDate=1337278139658" style="border: 1px solid black" /></span></p>

<h3><a name="ServiceLocatorDesign-ServiceRegistration"></a>Service Registration</h3>

<p><span class="image-wrap" style=""><img src="/wiki/download/attachments/2457645/Service+Registration.jpg?version=4&amp;modificationDate=1279726688457" style="border: 1px solid black" /></span></p>

<p>This diagram shows a component registering to the service discovery component and providing supported parameters.</p>

<ol>
        <li>The initial step is to get a proxy to service discovery management, this will probably end up being a configuration option somewhere.</li>
        <li>The component then calls the addService method with a proxy to its own service.</li>
        <li>The service discovery component instantiates a ServiceManagementImpl object and adds it to a vector.</li>
        <li>The service discovery component returns a proxy to the ServiceManagementImpl object to the component.</li>
        <li>The component populates a ServiceDiscoveryParams class with supported parameters.</li>
        <li>The component then calls the addDiscoveryParams method on the ServiceManagementImpl object proxy passing in the above mentioned class and an optional unique identifier for a parameters comparator.</li>
        <li>The service discovery component instantiates a ServiceDiscoveryParamsSpec class containing the ServiceDiscoveryParams class and the comparator identifier.</li>
        <li>The service discovery component adds the ServiceDiscoveryParamsSpec class to a vector in the ServiceManagementImpl object.</li>
        <li>The service discovery component returns nothing.</li>
</ol>


<h3><a name="ServiceLocatorDesign-ComparatorRegistration"></a>Comparator Registration</h3>

<p><span class="image-wrap" style=""><img src="/wiki/download/attachments/2457645/Comparator+Registration.jpg?version=4&amp;modificationDate=1279726688502" style="border: 1px solid black" /></span></p>

<p>This diagram shows a parameters comparator registering to the service discovery component.</p>

<ol>
        <li>The initial step is to get a proxy to service discovery management, this will probably end up being a configuration option somewhere.</li>
        <li>The component then calls the addCompare method with a unique identifier for itself and a proxy to its own ServiceDiscoveryParamsCompare implementation.</li>
        <li>The service discovery component instantiates a ServiceDiscoveryComparator object and adds it to a map using the unique identifier.</li>
        <li>The service discovery component returns a proxy to the ServiceDiscoveryComparator object to the component.</li>
</ol>


<h3><a name="ServiceLocatorDesign-LocationQuery"></a>Location Query</h3>

<p><span class="image-wrap" style=""><img src="/wiki/download/attachments/2457645/Service+Location+Request.jpg?version=4&amp;modificationDate=1279726688475" style="border: 1px solid black" /></span></p>

<p>This diagram shows a routing service using service discovery to locate another component based on parameters.</p>

<ol>
        <li>The initial steps is to get a proxy to service discovery, this will probably end up being a configuration option somewhere.</li>
        <li>The routing service populates a ServiceDiscoveryParams class with parameters for what it is looking for.</li>
        <li>The routing service then calls the locate method with the above mentioned class.</li>
        <li>The ServiceDiscoveryManagementImpl object begins iterating through the vector of ServiceManagementImpl objects.</li>
        <li>The service discovery component calls isSupported on the ServiceManagementImpl object.</li>
        <li>The ServiceManagementImpl isSupported implementation performs a basic comparison to see if requested parameters are supported.</li>
        <li>If supported the ServiceManagementImpl isSupported implementation finds the parameters comparator using the unique identifier that was given when the ServiceManagementImpl was instantiated.</li>
        <li>The service discovery component calls isSupported on the ServiceDiscoveryComparator object.</li>
        <li>The ServiceDiscoveryComparator isSupported implementation calls the isSupported method on the parameters comparator proxy.</li>
        <li>The parameters comparator returns a boolean value for whether the parameters are supported or not.</li>
        <li>The boolean is passed all the way back to the ServiceDiscoveryManagementImpl object.</li>
        <li>The service discovery component calls GetService on the ServiceImpl object to get a proxy to the component.</li>
        <li>The service discovery component returns the proxy to the routing service.</li>
</ol>


<h3><a name="ServiceLocatorDesign-Potentialhooks"></a>Potential hooks</h3>

<p>After reviewing the design of the service locator I do not believe there are any places where a hook would logically fit in or influence behavior. The only thing you could really logically do would be to stop a component from being considered. You can't forcefully tell a component what it can do.</p>

<h3><a name="ServiceLocatorDesign-Conventions"></a>Conventions</h3>

<p>When configuring service discovery in an Ice configuration file for a particular component, there are established ports whose use is recommended. The ServiceLocator proxy is typically bound to port 4411, and the ServiceLocatorManager proxy is typically bound to port 4422.</p>
    </div>
        <div id="commentsSection" class="wiki-content pageSection">
        <div style="float: right;" class="grey">
                        <a href="https://wiki.asterisk.org/wiki/users/removespacenotification.action?spaceKey=TOP">Stop watching space</a>
            <span style="padding: 0px 5px;">|</span>
                <a href="https://wiki.asterisk.org/wiki/users/editmyemailsettings.action">Change email notification preferences</a>
</div>
        <a href="https://wiki.asterisk.org/wiki/display/TOP/Service+Locator+Design">View Online</a>
        |
        <a href="https://wiki.asterisk.org/wiki/pages/diffpagesbyversion.action?pageId=2457645&revisedVersion=24&originalVersion=23">View Changes</a>
                |
        <a href="https://wiki.asterisk.org/wiki/display/TOP/Service+Locator+Design?showComments=true&amp;showCommentArea=true#addcomment">Add Comment</a>
            </div>
</div>
</div>
</div>
</div>
</body>
</html>