RFC 119 with SCA

Download Report

Transcript RFC 119 with SCA

OSGi Remote Services with
SCA using Apache Tuscany
Raymond Feng
[email protected]
Agenda
•
•
•
•
•
•
•
•
What are OSGi remote services?
A sample scenario: Distributed Calculator
Representing OSGi entities using SCA
Predefined mapping from OSGi to SCA
On-demand mapping from OSGi to SCA
Discovery of OSGi remote services
Demo of distributed calculator
Q&A
What are OSGi remote
services?
OSGi local services
• The OSGi framework decouples service
providers and consumers via a local service
registry, where a service is an object that one
bundle registers and another bundle gets.
• The services are only be accessed locally by
bundles within the same framework instance. It
would be nice to make them remote without
significant changes of the programming model?
OSGi Remote Services
• The OSGi core framework specifies a
model where bundles can use distributed
services. (R4.2)
• The basic model for OSGi remote services
is that a bundle can:
– register services that are exported to a
communication endpoint
– use services that are imported from a
communication endpoint (registering a proxy
in local service registry)
OSGi Remote Services
NOTE: The diagram is copied from OSGi Service Platform Service
Compendium R4.2 spec
Related OSGi specs
• OSGi Service Platform Release 4 Version 4.2
Compendium Specification
– Chapter 13: Remote Services (PM, concepts and
properties)
– http://www.osgi.org/download/r4v42/r4.cmpn.pdf
• Early Access draft of the OSGi 4.2 Enterprise
Release
– SCA Configuration Type (SCA specific properties)
– Remote Service Admin (runtime architecture, SPIs)
– http://www.osgi.org/download/osgi-4.2-enterpriseearly-draft4.pdf
SCA Configuration Type
• SCA Configuration Type for Remote Services
– This chapter provides a standard mechanism
to configure Remote Services and provide
qualities of service or intents, through SCA
configuration metadata and WS-Policy.
Remote Service implementations that also
implement the SCA config type provide a
portable way to configuration.
Remote Service Admin
• Remote Service Admin
– This specification adds an extra layer on top of the existing
Remote Services spec (chapter 13 in the 4.2 Compendium).
– The Distribution Provider registers a RemoteServiceAdmin
service that exports and imports services when asked.
– The Discovery System API (EndpointListener) provides a
standard view over any Discovery System, regardless of how it's
realized or what protocol it uses.
– The Topology Manager provides a Policy over these things. It
decides what services will be exported and for when to look for
services in a Discovery System.
OSGi remote services
- A sample scenario
An OSGi based Calculator
Add
Service
Subtract
Service
Calculator
Multiply
Service
Service
Divide
Service
Calculator bundle
Operations Bundle
OSGi service
Calculator
OSGi service interface
Service
OSGi service reference
OSGi service implementation
Making the Calculator Distributed
• Run the calculator bundle and the operations
bundle on two OSGi framework instances.
– The calculator bundle registers the
CalculatorService and it looks up the
Add/Subtract/Multiply/Divide services (which
are remote over RMI) from the service
registry. The CalculatorService is exported as
a Web Service.
– The operations bundle registers four remote
services (Add/Subtract/Multiply/Divide). These
services are exported over RMI.
OSGi Remote Services enabled
Calculator
RMI
Add
Service
RMI
Subtract
Service
Web Service
Calculator
Service
RMI
Multiply
Service
RMI
Divide
Service
Calculator bundle
Operations Bundle
OSGi runtime #1
OSGi runtime #2
Modeling OSGi entities
using SCA
The Calculator Scenario: OSGi Remote Services
with SCA runtime as the distribution software
SCA Component
implementation.osgi
binding.rmi or binding.ws
SCA Component
implementation.osgi
Add
Service
Subtract
Service
Multiply
Service
Calculator
Divide
Service
Service
OSGi bundle
SCA environment
OSGi bundle
Defining the SCA composite for OSGi bundles
OSGI-INF/sca/bundle.composite
SCA bundle
binding.rmi
binding.ws
Calculator
Operations
Add
Service
Subtract
Calculator
Service
Service
Multiply
Service
Divide
Calculator bundle
Service
Operations Bundle
SCA view of OSGi services and
references
Local Service
SCA Service
OSGi Service
Registry
Calculator
Local OSGi Service
Implementation
Service
Web
Service
Add
Service
Subtract
Service
Multiply
Service
Divide
RMI
RMI
RMI
RMI
Service
SCA References
SCA proxies
SCA implementation.osgi
• The SCA implementation.osgi component will be used to
encapsulate one or more OSGi bundles.
– OSGi View: implementation.osgi provides the metadata and
infrastructure to enable the distribution of OSGi services
– SCA View: implementation.osgi allows OSGi bundles to
participate in the SCA assembly.
• The references for an SCA OSGi component represents
the OSGi services to be consumed by the bundles
• The services for an SCA OSgi component represents the
OSGi services to be provided by the bundles
Predefined mapping from
OSGi to SCA
http://svn.apache.org/repos/asf/tuscany/java/sca/samples/dosgi-calculator/
http://svn.apache.org/repos/asf/tuscany/java/sca/samples/dosgi-calculator-operations/
Mapping an OSGi bundle to an
SCA componentType
<componentType xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200903"
xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1">
<!-- The service elment defines an SCA view of the OSGi service -->
<service name="CalculatorService">
<!-- The interface will be mapped into the OSGi service class -->
<interface.java interface="calculator.dosgi.CalculatorService"/>
</service>
<!-- The reference elment defines an SCA proxy to a remote OSGi service -->
<reference name="addService">
<interface.java interface="calculator.dosgi.operations.AddService"/>
</reference>
<reference name="subtractService">
<interface.java interface="calculator.dosgi.operations.SubtractService"/>
</reference>
<reference name="multiplyService">
<interface.java interface="calculator.dosgi.operations.MultiplyService"/>
</reference>
<reference name="divideService">
<interface.java interface="calculator.dosgi.operations.DivideService"/>
</reference>
</componentType>
SCA composite for the OSGi
bundle
<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200903“
xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1“
targetNamespace=http://calculator.dosgi name="CalculatorComposite">
<component name="CalculatorComponent">
<tuscany:implementation.osgi bundleSymbolicName="calculator.dosgi" bundleVersion="1.0.0" />
<service name="CalculatorService">
<binding.ws uri="http://localhost:8086/CalculatorService"/>
</service>
<reference name="addService">
<tuscany:binding.rmi uri="rmi://localhost:8085/AddService"/>
</reference>
<reference name="subtractService">
<tuscany:binding.rmi uri="rmi://localhost:8085/SubtractService"/>
</reference>
<reference name="multiplyService">
<tuscany:binding.rmi uri="rmi://localhost:8085/MultiplyService"/>
</reference>
<reference name="divideService">
<tuscany:binding.rmi uri="rmi://localhost:8085/DivideService"/>
</reference>
</component>
</composite>
On-demand mapping from
OSGi to SCA
http://svn.apache.org/repos/asf/tuscany/java/sca/samples/dosgi-dynamic-calculator/
http://svn.apache.org/repos/asf/tuscany/java/sca/samples/dosgi-dynamic-calculator-operations/
Remote Service Admin
NOTE: The diagram is copied from OSGi Remote Service Admin spec (to be published)
Remote Services with SCA
NOTE: The diagram is copied from OSGi Remote Service SCA Configuration Type spec
(to be published)
Publish remote services
public void start(BundleContext context) throws Exception {
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put("sca.service", "CalculatorComponent#servicename(Calculator)");
props.put("calculator", "Calculator");
props.put("service.exported.configs", new String[] {"org.osgi.sca"});
props.put("org.osgi.sca.bindings", new String[]
{"{http://sample}Calculator"});
props.put("service.exported.interfaces", new String[] {"*"});
CalculatorService calculator = new CalculatorServiceImpl(context);
context.registerService(CalculatorService.class.getName(), calculator,
props);
}
Look up remote services
(ServiceTracker)
Filter remoteFilter = null;
try {
remoteFilter =
context.createFilter("(&(" + OBJECTCLASS +
"=calculator.dosgi.operations.*) (service.imported=*))");
} catch (InvalidSyntaxException e) {
…
}
this.remoteServices = new ServiceTracker(context, remoteFilter, null);
remoteServices.open();
…
Object[] remoteObjects = remoteServices.getServices();
MANIFEST.MF
Manifest-Version: 1.0
Export-Package: calculator.dosgi;version="1.0.1",
calculator.dosgi.operations;version="1.0.1"
Bundle-Version: 1.0.0
Bundle-Name: calculator.dosgi.dynamic
Bundle-Activator: calculator.dosgi.impl.CalculatorActivator
Bundle-ManifestVersion: 2
Import-Package: org.oasisopen.sca.annotation;version="2.0.0",
org.osgi.framework,
org.osgi.service.component;resolution:=optional,
org.osgi.service.packageadmin,
org.osgi.util.tracker
Bundle-SymbolicName: calculator.dosgi.dynamic
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: J2SE-1.5,JavaSE-1.6
SCA-Configuration: OSGI-INF/sca-config/calculator-config.xml
Remote-Service: OSGI-INF/remote-service/*.xml
SCA Configuration
<scact:sca-config targetNamespace="http://sample"
xmlns:scact="http://www.osgi.org/xmlns/scact/v1.0.0"
xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200903"
xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1">
<sca:binding.ws name="Calculator" uri="http://localhost:8086/CalculatorService"/>
<!-- bindings for the remote services -->
<tuscany:binding.rmi name="Add" uri="rmi://localhost:8085/AddService"/>
<tuscany:binding.rmi name="Divide" uri="rmi://localhost:8085/DivideService"/>
<tuscany:binding.rmi name="Subtract" uri="rmi://localhost:8085/SubtractService"/>
<tuscany:binding.rmi name="Multiply" uri="rmi://localhost:8085/MultiplyService"/>
</scact:sca-config>
Local endpoint descriptions
<service-descriptions xmlns="http://www.osgi.org/xmlns/sd/v1.0.0"
xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200903"
xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1">
<!-- Describe a remote OSGi service -->
<service-description>
<provide interface="calculator.dosgi.operations.AddService" />
<property name="remote.exported.intents"></property>
<property name="remote.configs.supported">org.osgi.sca</property>
<property name="org.osgi.sca.bindings">{http://sample}Add</property>
</service-description>
…
</service-descriptions>
SCA Domain based service
discovery
Domain Registry for OSGi
discovery
External clients and services
Nodes receive metadata (a view) from the SCA
domain via the registry
Domain
Contributions
c1
c2
c3
definitions
DomainRegistry
(Provide a view to the domain
metadata)
Composite 1
Composite 2
Intent
Policy Set
Binding/Implementation Type
Endpoint
Endpoint
Endpoint
Node 2
Node 1
JVM 1
JVM 2