From 5c8883e904bc9e7d894820b1e6a8bb74f6292f0c Mon Sep 17 00:00:00 2001 From: xuzhenbao Date: Mon, 20 Nov 2023 16:30:38 +0800 Subject: [PATCH 1/4] Improve doc for RSA --- bundles/remote_services/README.md | 57 +++-- .../discovery_zeroconf/README.md | 73 ++++++ .../diagrams/service_announce_seq.png | Bin 0 -> 45197 bytes .../diagrams/service_announce_seq.puml | 45 ++++ .../diagrams/service_discovery_seq.png | Bin 0 -> 57853 bytes .../diagrams/service_discovery_seq.puml | 53 ++++ .../doc/discovery_zeroconf.adoc | 129 ---------- bundles/remote_services/doc/rsa_shm_v2.adoc | 164 ------------ .../remote_service_admin_dfi/README.md | 8 +- .../remote_service_admin_shm_v2/README.md | 86 +++++++ .../diagrams/rsa_shm_component_diagram.png | Bin 0 -> 25998 bytes .../diagrams/rsa_shm_component_diagram.puml | 48 ++++ .../diagrams/rsa_shm_ipc_seq.png | Bin 0 -> 47480 bytes .../diagrams/rsa_shm_ipc_seq.puml | 43 ++++ .../rsa_shm_remote_service_call_seq.png | Bin 0 -> 59257 bytes .../rsa_shm_remote_service_call_seq.puml | 51 ++++ .../remote_services/rsa_rpc_json/README.md | 68 +++++ .../remote_service_endpoint_use_seq.png | Bin 0 -> 43996 bytes .../remote_service_endpoint_use_seq.puml | 37 +++ .../diagrams/remote_service_proxy_use_seq.png | Bin 0 -> 43223 bytes .../remote_service_proxy_use_seq.puml | 34 +++ documents/subprojects.md | 2 +- libs/dfi/README.md | 241 +++++++++++++++++- 23 files changed, 816 insertions(+), 323 deletions(-) create mode 100644 bundles/remote_services/discovery_zeroconf/README.md create mode 100644 bundles/remote_services/discovery_zeroconf/diagrams/service_announce_seq.png create mode 100644 bundles/remote_services/discovery_zeroconf/diagrams/service_announce_seq.puml create mode 100644 bundles/remote_services/discovery_zeroconf/diagrams/service_discovery_seq.png create mode 100644 bundles/remote_services/discovery_zeroconf/diagrams/service_discovery_seq.puml delete mode 100644 bundles/remote_services/doc/discovery_zeroconf.adoc delete mode 100644 bundles/remote_services/doc/rsa_shm_v2.adoc create mode 100644 bundles/remote_services/remote_service_admin_shm_v2/README.md create mode 100644 bundles/remote_services/remote_service_admin_shm_v2/diagrams/rsa_shm_component_diagram.png create mode 100644 bundles/remote_services/remote_service_admin_shm_v2/diagrams/rsa_shm_component_diagram.puml create mode 100644 bundles/remote_services/remote_service_admin_shm_v2/diagrams/rsa_shm_ipc_seq.png create mode 100644 bundles/remote_services/remote_service_admin_shm_v2/diagrams/rsa_shm_ipc_seq.puml create mode 100644 bundles/remote_services/remote_service_admin_shm_v2/diagrams/rsa_shm_remote_service_call_seq.png create mode 100644 bundles/remote_services/remote_service_admin_shm_v2/diagrams/rsa_shm_remote_service_call_seq.puml create mode 100644 bundles/remote_services/rsa_rpc_json/README.md create mode 100644 bundles/remote_services/rsa_rpc_json/diagrams/remote_service_endpoint_use_seq.png create mode 100644 bundles/remote_services/rsa_rpc_json/diagrams/remote_service_endpoint_use_seq.puml create mode 100644 bundles/remote_services/rsa_rpc_json/diagrams/remote_service_proxy_use_seq.png create mode 100644 bundles/remote_services/rsa_rpc_json/diagrams/remote_service_proxy_use_seq.puml diff --git a/bundles/remote_services/README.md b/bundles/remote_services/README.md index eaf7bddc4..06539bae4 100644 --- a/bundles/remote_services/README.md +++ b/bundles/remote_services/README.md @@ -33,26 +33,25 @@ The topology manager decides which services should be imported and exported acco ### Remote Service Admin -The Remote Service Admin (RSA) provides the mechanisms to import and export services when instructed to do so by the Topology Manager. +The Remote Service Admin (RSA) provides the mechanisms to import and export services when instructed to do so by the Topology Manager. -#### Endpoints and proxies +#### Remote Service Admin DFI -To delegate a *received* method call to the actual service implementation, the RSA uses an "endpoint" bundle, which has all the knowledge about the marshalling and unmarshalling of data for the service. This endpoint bundle is specific to the used RSA implementation, and as such cannot be reused between various RSA implementations. +Provides remote service admin using HTTP and JSON. The serialization is done using [libdfi](../../libs/dfi/README.md) to convert function call information into [JSON representation](https://amdatu.atlassian.net/wiki/spaces/AMDATUDEV/pages/21954571/Amdatu+Remote#AmdatuRemote-AdminHTTP%2FJson). +`libffi` is configured using descriptor files in the bundles. -Invoking a *remote* method is done by using "proxy" bundles. Similar as to endpoints, proxy bundles encapsulate all knowledge to marshall and unmarshall data for a remote method call and as such can not be shared between RSA implementations. - -Both proxy and endpoint bundles are loaded on demand when a service is imported or exported by the RSA. As such, these bundles **must** not be added to the list of "auto started" bundles, but placed in a separate location. By default, `endpoints` is used as location for locating proxy and/or endpoint bundles. - -Note that since endpoints and proxies need to be created manually, one has full control about the handling of specifics of marshalling and unmarshalling data and dealing with exceptions. +| **Bundle** | `rsa_dfi.zip` | +|--|--| +| **Configuration** | See [Remote Service Admin DFI](remote_service_admin_dfi/README.md) | -#### HTTP/JSON +#### Remote Service Admin SHM -Provides a RSA implementation that uses JSON to marshal requests and HTTP as transport mechanism for its remote method invocation. It is compatible with the *Remote Service Admin HTTP* implementation provided by [Amdatu Remote](https://amdatu.atlassian.net/wiki/display/AMDATUDEV/Amdatu+Remote). +Provides remote service admin using shared memory. The serialization implementation is pluggable, and the default serialization is done using [libdfi](../../libs/dfi/README.md) to convert function call information into [JSON representation](https://amdatu.atlassian.net/wiki/spaces/AMDATUDEV/pages/21954571/Amdatu+Remote#AmdatuRemote-AdminHTTP%2FJson). +`libffi` is configured using descriptor files in the bundles. -| **Bundle** | `remote_service_admin_http.zip` | -|--|--| -| **Configuration** | `RSA_PORT`: defines the port on which the HTTP server should listen for incoming requests. Defaults to port `8888`; | -| | `ENDPOINTS`: defines the location in which service endpoints and/or proxies can be found. Defaults to `endpoints` in the current working directory | +| **Bundle** | `rsa_shm.zip` | +|-------------------|------------------------------------------------------------------------| +| **Configuration** | See [Remote Service Admin SHM](remote_service_admin_shm_v2/README.md) | ### Discovery @@ -72,15 +71,22 @@ Provides a service discovery with preconfigured discovery endpoints, allowing a Note that for configured discovery, the "Endpoint Description Extender" XML format defined in the OSGi Remote Service Admin specification (section 122.8 of OSGi Enterprise 5.0.0) is used. -See [etcd discovery](discovery_etcd/README.md) - #### etcd discovery +Provides a service discovery using etcd distributed key/value store. + | **Bundle** | `discovery_etcd.zip` | +|------------|----------------------| +| **Configuration** | See [etcd discovery](discovery_etcd/README.md)| -Provides a service discovery using etcd distributed key/value store. +#### Zero configuration discovery + +Provides a service discovery using zeroconf (Bonjour). + +| **Bundle** | `rsa_discovery_zeroconf.zip` | +|--|----------------------------| +| **Configuration** | See [Zeroconf Discovery](discovery_zeroconf/README.md) | -See [etcd discovery](discovery_etcd/README.md) ## Usage @@ -129,7 +135,7 @@ Note that the `RSA_PORT` property needs to be unique for at least the client in ## Building -To build the Remote Service Admin Service the CMake build option "`BUILD_REMOTE_SERVICE_ADMIN`" has to be enabled. +To build the Remote Service Admin Service the CMake build option "`BUILD_REMOTE_SERVICE_ADMIN`" has to be enabled.If you use conan to build it, you should set the conan option `celix:build_remote_service_admin` to true. ## Dependencies @@ -137,18 +143,19 @@ The Remote Service Admin Service depends on the following subprojects: - Framework - Utils +- dfi +- log_helper -Also the following libraries are required for building and/or using the Remote Service Admin Service subproject: - -- Jansson (build and runtime) -- cURL (build and runtime) ## RSA Bundles -* [Remote Service Admin DFI](remote_service_admin_dfi) - A Dynamic Function Interface (DFI) implementation of the RSA. -* [Topology Manager](topology_manager) - A (scoped) RSA Topology Manager implementation. +* [Remote Service Admin DFI](remote_service_admin_dfi/README.md) - A Dynamic Function Interface (DFI) implementation of the RSA. +* [Remote Service Admin SHM](remote_service_admin_shm_v2/README.md) - A Shared Memory (SHM) implementation of the RSA. +* [Remote Service Admin RPC Using JSON](rsa_rpc_json/README.md) - A Remote Procedure Call (RPC) implementation of the RSA using JSON. +* [Topology Manager](topology_manager/README.md) - A (scoped) RSA Topology Manager implementation. * [Discovery Configured](discovery_configured) - A RSA Discovery implementation using static configuration (xml). * [Discovery Etcd](discovery_etcd/README.md) - A RSA Discovery implementation using etcd. +* [Discovery Zeroconf](discovery_zeroconf/README.md) - A RSA Discovery implementation using Bonjour. ## Notes diff --git a/bundles/remote_services/discovery_zeroconf/README.md b/bundles/remote_services/discovery_zeroconf/README.md new file mode 100644 index 000000000..7013445c2 --- /dev/null +++ b/bundles/remote_services/discovery_zeroconf/README.md @@ -0,0 +1,73 @@ +--- +title: Discovery Zeroconf +--- + + + +## Discovery Zeroconf + +The `Discovery_zeroconf` is implemented based on mDNS, and its operation depends on the mDNS daemon. + +The mapping between celix and mdns services is as follows: + +| **mDNS service** | **celix service** | +|------------------|-------------------------------------------| +| instance name | service name+hash(endpoint uuid) | +| service type | "_celix-rpc._udp"+${custom subtype} | +| domain name | "local" | +| txt record | service properties | +| host | "celix_rpc_dumb_host.local."(It is dummy) | +| port | 50009(It is dummy) | + + +Because We will perform the mDNS query only using link-local multicast, so we set domain name default value "local". + +To reduce the operation of conversion between host name and address info. we set the address info to txt record, and set a dummy value("celix_rpc_dumb_host.local." and "50009") to the host name and port. + +We set the instance name of the mDNS service as `service_name + hash(endpoint uuid)`. If there is a conflict in the instance name, mDNS_daemon will resolve it. Since the maximum size of the mDNS service instance name is 64 bytes, we take the hash of the endpoint uuid here, which also reduces the probability of instance name conflicts. + +According to [rfc6763](https://www.rfc-editor.org/rfc/rfc6763.txt) 6.1 and 6.2 section, DNS TXT record can be up to 65535 (0xFFFF) bytes long in mDNS message. and we should keep the size of the TXT record under 1300 bytes(allowing it to fit in a single 1500-byte Ethernet packet). Therefore, `Discovery_zeroconf` announce celix service endpoint using multiple txt records and each txt record max size is 1300 bytes. + +### Supported Platform +- Linux + +### Conan Option + build_rsa_discovery_zeroconf=True Default is False + +### CMake Option + RSA_DISCOVERY_ZEROCONF=ON Default is OFF + +### Software Design + +#### The Remote Service Endpoint Announce Process + +In the process of publishing remote service endpoints, `discovery_zeroconf` provides an `endpoint_listener_t` service, and sets the service property `DISCOVERY=true`. `topology_manager` updates service endpoint description to `discovery_zeroconf` by calling this service. At the same time, `discovery_zeroconf` establishes a domain socket connection with `mDNS_daemon`, and `discovery_zeroconf` publishes the service information to mDNS_daemon through this connection. Then, `mDNS_daemon` publishes the service information to other `mDNS_daemons`. The sequence diagram is as follows: + +![remote_service_endpoint_announce_process](diagrams/service_announce_seq.png) + +#### The Remote Service Endpoint Discovery Process + +In the process of discovering remote service endpoints, discovery_zeroconf also establishes a domain socket connection with mDNS_daemon. discovery_zeroconf listens to remote endpoint information through this connection, and updates the listened remote endpoint information to topology_manager. The sequence diagram is as follows: + +![remote_service_endpoint_discovery_process](diagrams/service_discovery_seq.png) + +### Example + +See the cmake target `remote-services-zeroconf-server` and `remote-services-zeroconf-client`. + +**Notes:** Before running the example, you should start the [mDNS](https://github.com/apple-oss-distributions/mDNSResponder) daemon first. diff --git a/bundles/remote_services/discovery_zeroconf/diagrams/service_announce_seq.png b/bundles/remote_services/discovery_zeroconf/diagrams/service_announce_seq.png new file mode 100644 index 0000000000000000000000000000000000000000..242ee2eaf0fe6344ab9b3efa8a23a1b3251d7f43 GIT binary patch literal 45197 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 ZXqb`=V`ncv&UdETt-ep~o~ot){{!JNkURhY literal 0 HcmV?d00001 diff --git a/bundles/remote_services/discovery_zeroconf/diagrams/service_announce_seq.puml b/bundles/remote_services/discovery_zeroconf/diagrams/service_announce_seq.puml new file mode 100644 index 000000000..ac6b5c892 --- /dev/null +++ b/bundles/remote_services/discovery_zeroconf/diagrams/service_announce_seq.puml @@ -0,0 +1,45 @@ +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +@startuml + +box server process +participant Announcer +control AnnouncerThread +participant Fw +participant mDNS_daemon +end box +Announcer->Fw:register endpoint listener service +create AnnouncerThread +Announcer ->AnnouncerThread: +==setup== +--\Announcer: add endpoint\n (use endpoint listener service) +loop + alt mDNS server disconnect + AnnouncerThread->mDNS_daemon:DNSServiceCreateConnection + return DNSServiceRef + end alt + + alt Have new endpoint + AnnouncerThread->AnnouncerThread:Converting endpoint properties to txt records(max 1300 bytes) + AnnouncerThread->mDNS_daemon:DNSServiceRegister(DNSServiceRef,instanceName, txtRecord ...) + return registerRef + loop Have more endpoint properties + AnnouncerThread->mDNS_daemon:DNSServiceAddRecord(registerRef, txtRecord ...) + end loop + end alt +end loop + +@enduml \ No newline at end of file diff --git a/bundles/remote_services/discovery_zeroconf/diagrams/service_discovery_seq.png b/bundles/remote_services/discovery_zeroconf/diagrams/service_discovery_seq.png new file mode 100644 index 0000000000000000000000000000000000000000..659ad7b0c771571154c0031cdba3de744cb71579 GIT binary patch literal 57853 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 SJLHmHP*K!Scze_Q>Hh}|LJYS6 literal 0 HcmV?d00001 diff --git a/bundles/remote_services/discovery_zeroconf/diagrams/service_discovery_seq.puml b/bundles/remote_services/discovery_zeroconf/diagrams/service_discovery_seq.puml new file mode 100644 index 000000000..5f896c39a --- /dev/null +++ b/bundles/remote_services/discovery_zeroconf/diagrams/service_discovery_seq.puml @@ -0,0 +1,53 @@ +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +@startuml + +box client process +participant Watcher +control WatcherThread +participant Fw +participant mDNS_daemon +end box +Watcher->Fw:Register endpoint listener service tracker.\n(filter:"(!(DISCOVERY=true))") +create WatcherThread +Watcher ->WatcherThread: +==setup== +loop + alt mDNS server disconnect + WatcherThread->mDNS_daemon:DNSServiceCreateConnection + return DNSServiceRef + end alt + alt browser is null + WatcherThread->mDNS_daemon:DNSServiceBrowse(DNSServiceRef,anyInterface, "_celix-rpc._udp", "local"...) + end alt + mDNS_daemon-->WatcherThread:Service instances browsed + alt Have new service instance \n or resolve service timeout + WatcherThread->mDNS_daemon:DNSServiceResolve + end + mDNS_daemon-->WatcherThread:txt records + WatcherThread->WatcherThread:Converting txt records to endpoint properties + alt resolve completed + WatcherThread->WatcherThread:Inform new endpoints to tpm (use endpoint listener service) + end alt + WatcherThread->WatcherThread:Remove expired endpoints(use endpoint listener service) + note left + If the service has been deleted for 10 seconds, + we consider the endpoint to be expired. + end note +end loop + +@enduml \ No newline at end of file diff --git a/bundles/remote_services/doc/discovery_zeroconf.adoc b/bundles/remote_services/doc/discovery_zeroconf.adoc deleted file mode 100644 index b8017eba2..000000000 --- a/bundles/remote_services/doc/discovery_zeroconf.adoc +++ /dev/null @@ -1,129 +0,0 @@ -//// -* Licensed to the Apache Software Foundation (ASF) under one -* or more contributor license agreements. See the NOTICE file -* distributed with this work for additional information -* regarding copyright ownership. The ASF licenses this file -* to you under the Apache License, Version 2.0 (the -* "License"); you may not use this file except in compliance -* with the License. You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, -* software distributed under the License is distributed on an -* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -* KIND, either express or implied. See the License for the -* specific language governing permissions and limitations -* under the License. -//// -= Zero configure service discovery - -The `Discovery_zeroconf` is implemented based on mDNS, and its operation depends on the mDNS daemon. - -The mapping between celix and mdns services is as follows: - -|=== -|*mDNS service*|*celix service* -|instance name|service name+hash(endpoint uuid) -|service type|"_celix-rpc._udp"+ -|domain name|"local" -|txt record|service properties -|host|"celix_rpc_dumb_host.local." -|port|50009 -|=== - -Because We will perform the mDNS query only using link-local multicast, so we set domain name default value "local". - -To reduce the operation of conversion between host name and address info. we set the address info to txt record, and set a dummy value("celix_rpc_dumb_host.local." and "50009") to the host name and port. - -According to rfc6763 6.1 and 6.2 section, DNS TXT record can be up to 65535 (0xFFFF) bytes long in mDNS message. and we should keep the size of the TXT record under 1300 bytes(allowing it to fit in a single 1500-byte Ethernet packet). Therefore, `Discovery_zeroconf` announce celix service endpoint using multiple txt records and each txt record max size is 1300 bytes. - -== Sequence Diagram -=== Service announce - -[plantuml] ----- -@startuml - -box server process -participant Announcer -control AnnouncerThread -participant Fw -participant mDNS_deamon -end box -Announcer->Fw:register endpoint listener service -create AnnouncerThread -Announcer ->AnnouncerThread: -==setup== ---\Announcer: add endpoint\n (use endpoint listener service) -loop - alt mDNS server disconnect - AnnouncerThread->mDNS_deamon:DNSServiceCreateConnection - return DNSServiceRef - end alt - alt Have new endpoint - AnnouncerThread->AnnouncerThread:Converting endpoint properties to txt records(max 1300 bytes) - AnnouncerThread->mDNS_deamon:DNSServiceRegister(DNSServiceRef,instanceName, txtRecord ...) - return registerRef - loop Have more endpoint properties - AnnouncerThread->mDNS_deamon:DNSServiceAddRecord(registerRef, txtRecord ...) - end loop - end alt -end loop - -@enduml ----- - - -=== Service watcher - -[plantuml] ----- -@startuml - -box client process -participant Watcher -control WatcherThread -participant Fw -participant mDNS_deamon -end box -Watcher->Fw:Register endpoint listener service tracker.\n(filter:"(!(DISCOVERY=true))") -create WatcherThread -Watcher ->WatcherThread: -==setup== -loop - alt mDNS server disconnect - WatcherThread->mDNS_deamon:DNSServiceCreateConnection - return DNSServiceRef - end alt - alt browser is null - WatcherThread->mDNS_deamon:DNSServiceBrowse(DNSServiceRef,anyInterface, "_celix-rpc._udp", "local"...) - end alt - mDNS_deamon-->WatcherThread:Service instances browsed - alt Have new service instance \n or resolve service timeout - WatcherThread->mDNS_deamon:DNSServiceResolve - end - mDNS_deamon-->WatcherThread:txt records - WatcherThread->WatcherThread:Converting txt records to endpoint properties - alt resolve completed - WatcherThread->WatcherThread:Inform new endpoints to tpm (use endpoint listener service) - end alt - WatcherThread->WatcherThread:Remove expired endpoints(use endpoint listener service) - note left - If the service has been deleted for 10 seconds, - we consider the endpoint to be expired. - end note -end loop - -@enduml ----- - - -== Legacy issues -[caption="Issue 1: "] -.If a network interface restart, discovery_zeroconf_watcher cannot discovery services bound to the interface's again. -==== -In mdnsresponder, if an interface restart, the interface object will be change(the interface index remains the same), which will result in services previously bound to the interface's mDNSInterfaceID(a pointer to interface object) will not being discovered again. - -We will resolve it in https://github.com/conan-io/conan-center-index/pull/16254 -==== diff --git a/bundles/remote_services/doc/rsa_shm_v2.adoc b/bundles/remote_services/doc/rsa_shm_v2.adoc deleted file mode 100644 index eac746012..000000000 --- a/bundles/remote_services/doc/rsa_shm_v2.adoc +++ /dev/null @@ -1,164 +0,0 @@ -//// -* Licensed to the Apache Software Foundation (ASF) under one -* or more contributor license agreements. See the NOTICE file -* distributed with this work for additional information -* regarding copyright ownership. The ASF licenses this file -* to you under the Apache License, Version 2.0 (the -* "License"); you may not use this file except in compliance -* with the License. You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, -* software distributed under the License is distributed on an -* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -* KIND, either express or implied. See the License for the -* specific language governing permissions and limitations -* under the License. -//// -= Remote service admin based on shared memory - -In order to reuse the (de)serialization features of remote service admin, -the remote service admin will be realized by `rsa_shm` and `rsa_json_rpc` bundles. -The `rsa_shm` bundle is used to realize `remote_service_admin_service_t` and IPC. -The `rsa_json_rpc` bundle is used to realize (de)serialization and Creating service endpoint/proxy. - -To decouple `rsa_shm` and `rsa_json_rpc`, we abstract several non-OSGi standard interfaces as follows: - -[plantuml] ----- -@startuml -interface rsa_rpc_factory_t { - + createProxy() - + destroyProxy() - + createEndPoint() - + destroyEndPoint() -} - -interface rsa_request_handler_service_t { - + handleRequest() -} - -interface rsa_request_sender_service_t { - + sendRequest() -} -@enduml ----- - -== component diagram - -[plantuml] ----- -@startuml - -component Consumer as "Service Consumer" -component RSA as "Remote Service Admin" -component TPM as "Topology Manager" -component RSA_RPC as "Remote service Admin RPC" - -() remote_service_admin_service_t -() RS as "remote_service_t" -() RSProxy as "remote_service_t" -note bottom: remote service proxy -() rsa_rpc_factory_t -() rsa_request_handler_service_t -() rsa_request_sender_service_t - -RSA -left-( rsa_rpc_factory_t -RSA_RPC -right- rsa_rpc_factory_t - -RSA -up-( rsa_request_handler_service_t -RSA_RPC -up- rsa_request_handler_service_t - -RSA -down- rsa_request_sender_service_t -RSA_RPC -down-( rsa_request_sender_service_t - -RSA_RPC -down- RSProxy -RSA -right- remote_service_admin_service_t - -TPM -left-( remote_service_admin_service_t -TPM .[dotted].> RS: <> - -Consumer -left-( RSProxy - -@enduml ----- - -== remote service call - -[plantuml] ----- -@startuml -box "consumer process" -participant service_consumer -participant c_framework as "consumer framework" -participant c_rsa as "consumer rsa" -participant c_rpc as "consumer rpc" -end box - -box "provider process" -participant p_rsa as "provider rsa" -participant p_rpc as "provider rpc" -participant remote_service -end box - -service_consumer->c_framework ++:use/track remote service -c_framework->c_rpc ++:getService -c_rpc->c_rpc:create proxy service for remote service -return proxy service of remote service -return proxy service of remote service - -service_consumer -> c_rpc ++: call proxy service method -c_rpc -> c_rpc: serialize reuqest data -c_rpc -> c_rsa++: sendRequest -c_rsa -> p_rsa++: IPC(shared memory), send request data - -p_rsa->p_rpc++:handleRequest -p_rpc->p_rpc:deserialize reuqest data -p_rpc->remote_service++: call remote service -return response -p_rpc-->p_rpc:serialize response -return response -return IPC(shared memory), return response -return response -c_rpc --> c_rpc: deserialize response -return result -@enduml ----- - -== IPC for shared memory - -In order to dynamically allocate shared memory only on the client. -The client will transmit the shared memory id and shared memory offset to the server -using a domain datagram socket. And response will reuse the shared memory of request. - -[plantuml] ----- -@startuml - -control send_request_thread -participant shared_memory -queue domain_socket -control handle_request_thread - -send_request_thread->shared_memory ++:shmPool_malloc -return shared memory address -send_request_thread->shared_memory:copy request to shared memory -send_request_thread->domain_socket:sendto(rsa_shm_msg_t) -loop pthread_cond_timedwait,\nUntil the response is readed completly - send_request_thread->shared_memory:read response from shared memory - note over shared_memory: If the response is complete,\n'msgState' will be set to 'REPLIED' or 'ABEND'\nby the 'handle_request_thread' -end - -domain_socket->handle_request_thread:recvfrom(rsa_shm_msg_t) -handle_request_thread->shared_memory++:read request from shared memory -return -handle_request_thread->handle_request_thread:handleRequest -loop Until the response is writed completly - handle_request_thread->shared_memory :copy response to shared memory - handle_request_thread->handle_request_thread:pthread_cond_signal -end - -send_request_thread->shared_memory :shmPool_free -@enduml ----- \ No newline at end of file diff --git a/bundles/remote_services/remote_service_admin_dfi/README.md b/bundles/remote_services/remote_service_admin_dfi/README.md index e1db893f2..33b37368c 100644 --- a/bundles/remote_services/remote_service_admin_dfi/README.md +++ b/bundles/remote_services/remote_service_admin_dfi/README.md @@ -22,10 +22,10 @@ limitations under the License. ## Remote Service Admin DFI The Celix Remote Service Admin DFI bundle realizes OSGi remote service using HTTP and JSON. -The serialization is done using libdfi to json. -Libffi is configured using descriptor files in the bundles. +The serialization is done using libdfi to json. +Libffi is configured using descriptor files in the bundles. -###### Properties +###### Properties/Configuration RSA_PORT The RSA HTTP port to use (default 8888) RSA_IP The RSA ip address to use for discovery (default 127.0.0.1) RSA_INTERFACE If specified, the ip adress of interface (i.g. eth0) will be used. @@ -37,6 +37,8 @@ Libffi is configured using descriptor files in the bundles. The curl share handle has a significant performance boost by sharing DNS, COOKIE en CONNECTIONS over multiple calls, but can also introduce some issues (based on experience). Default is false + CELIX_RSA_BIND_ON_ALL_INTERFACES If set to true the RSA will bind to all interfaces. Default is true. + ###### CMake option RSA_REMOTE_SERVICE_ADMIN_DFI=ON diff --git a/bundles/remote_services/remote_service_admin_shm_v2/README.md b/bundles/remote_services/remote_service_admin_shm_v2/README.md new file mode 100644 index 000000000..85882cc37 --- /dev/null +++ b/bundles/remote_services/remote_service_admin_shm_v2/README.md @@ -0,0 +1,86 @@ +--- +title: Remote Service Admin SHM +--- + + + +## Remote Service Admin SHM + +The Celix Remote Service Admin SHM bundle implement OSGi remote service using shared memory. +In order to reuse the (de)serialization features of remote service admin, +the remote service admin will be realized by ‘rsa_shm’ and 'rsa_json_rpc'(see [Remote Service Admin RPC Using JSON](../rsa_rpc_json/README.md)) bundles. +The ‘rsa_shm’ bundle is used to realize ‘remote_service_admin_service_t’ and IPC. +The ‘rsa_json_rpc’ bundle is used to realize (de)serialization and Creating service endpoint/proxy. + +### Supported Platform +- Linux + +### Properties/Configuration + +| **Properties** | **Type** | **Description**| +|----------------|----------|----------------| +| **rsaShmPoolSize** | long | The RSA SHM pool size in bytes. Its value should be greater than 8192 bytes.(default 256KB) | +| **rsaShmMsgTimeout** | long | The timeout of remote service invocation in seconds. (default 30s) | +| **rsaShmCctIvNum** | long | The maximum concurrent invocations of the same service. If there are more concurrent invocations than its value, service invocation will fail.(default 32) | + +### Supported service.exported.configs + +- **celix.remote.admin.shm** : The IPC type is shared memory, and the serialization type is json. + +- **celix.remote.admin.shm,celix.remote.admin.rpc_type.${xxx}** : The IPC type is shared memory, and the serialization type is ${xxx}. + +### Conan Option + build_rsa_remote_service_admin_shm_v2=True Default is False + +### CMake Option + RSA_REMOTE_SERVICE_ADMIN_SHM_V2=ON Default is OFF + +### Software design + +#### The Relationship Between RSA_SHM And Other RSA Bundles + +If you need to complete a remote procedure call, multiple different bundles need to work together, as shown in the figure below: + +![rsa_shm_component_diagram](diagrams/rsa_shm_component_diagram.png) + +RSA_SHM (Remote Service Admin SHM) has implemented data transmission based on shared memory, and provides a service of remote service admin (`remote_service_admin_service_t`), and a remote request sending service (`rsa_request_sender_service_t`). + +RSA_RPC (Remote Service Admin RPC) implements the serialization and deserialization for interactive data, and provides a remote service endpoint/proxy factory service (`rsa_rpc_factory_t`), as well as a remote request handler service (`rsa_request_handler_service_t`). + +During imports/exports remote services, the topology manager imports/exports the remote service endpoint through `remote_service_admin_service_t`. At the same time, RSA_SHM creates a remote service proxy/endpoint through `rsa_rpc_factory_t`. + +When a remote procedure call occurs, the remote service proxy sends the request to the remote service endpoint through `rsa_request_sender_service_t`. And the remote service endpoint uses `rsa_request_handler_service_t` to convert the request into a local service call. + +#### The Remote Service Invocation Sequence + +When the user uses the remote service, the user directly calls the proxy service. The proxy service will send the request to the remote service endpoint via shared memory. The remote service endpoint will convert the request into a local service call. The sequence diagram for remote invocation is as follows: + +![rsa_shm_remote_service invocation_sequence](diagrams/rsa_shm_remote_service_call_seq.png) + +#### The Shared Memory Communication Sequence + +In order to dynamically allocate shared memory only on the client. +The client will transmit the shared memory id and shared memory offset to the server +using a domain datagram socket. And response will reuse the shared memory of request. + +![rsa_shm_shared_memory_communication_sequence](diagrams/rsa_shm_ipc_seq.png) + + +### Example + +See the cmake target `remote-services-shm-server` and `remote-services-shm-client`. diff --git a/bundles/remote_services/remote_service_admin_shm_v2/diagrams/rsa_shm_component_diagram.png b/bundles/remote_services/remote_service_admin_shm_v2/diagrams/rsa_shm_component_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..4c73b02d05082b7deb08133172d1a54f2c125081 GIT binary patch literal 25998 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

H)v+PNovQ~ zOI_Vqa8zezqcYKdlmYP(V7x*C*t~5xSA><`i+NGX+uk_vvGeWSEB;&##w;^o{;lUZ54!>43Fn%5V$D`Qb${#=O$H?FON`XSy{K=Xxi$y zbo%(3rwl#P=^dQtgy|?!#A>b4PuF6@G6z3qkEh3GcNZ8vchm8Ak6mus!Ht4dKu#Aa zRxUP1kPe61H_}$(FA^4BfA9O7u_W*GXe{YE(>zw5GJ@y%_EE=j?SY$6{Z&7%sS7;~ zPSa1nMaJ*H4@$WTeo-aGpU-tWz&5)aGpH5ZvqzYt-0jLjtrX$JBZD tKdhLOU|&~Z&F;4xD RS: <> + +Consumer -left-( RSProxy + +@enduml \ No newline at end of file diff --git a/bundles/remote_services/remote_service_admin_shm_v2/diagrams/rsa_shm_ipc_seq.png b/bundles/remote_services/remote_service_admin_shm_v2/diagrams/rsa_shm_ipc_seq.png new file mode 100644 index 0000000000000000000000000000000000000000..32888463baac01c602fb0d998d7685ff6a0c5e7f GIT binary patch literal 47480 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
juZK#U%NZIj%wZ(~{})(pHC_H)}d5-Zx^} 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
|SOJ4X|xJ#z`Wmm-Xx$_&S7f`srLv2`bqds>bD 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 P#cx@d+L)9WdtUu72vtN7 literal 0 HcmV?d00001 diff --git a/bundles/remote_services/remote_service_admin_shm_v2/diagrams/rsa_shm_ipc_seq.puml b/bundles/remote_services/remote_service_admin_shm_v2/diagrams/rsa_shm_ipc_seq.puml new file mode 100644 index 000000000..0b2b6f353 --- /dev/null +++ b/bundles/remote_services/remote_service_admin_shm_v2/diagrams/rsa_shm_ipc_seq.puml @@ -0,0 +1,43 @@ +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +@startuml + +control send_request_thread +participant shared_memory +queue domain_socket +control handle_request_thread + +send_request_thread->shared_memory ++:shmPool_malloc +return shared memory address +send_request_thread->shared_memory:copy request to shared memory +send_request_thread->domain_socket:sendto(rsa_shm_msg_t) +loop pthread_cond_timedwait,\nUntil the response is read completely + send_request_thread->shared_memory:read response from shared memory + note over shared_memory: If the response is complete,\n'msgState' will be set to 'REPLIED' or 'ABEND'\nby the 'handle_request_thread' +end + +domain_socket->handle_request_thread:recvfrom(rsa_shm_msg_t) +handle_request_thread->shared_memory++:read request from shared memory +return +handle_request_thread->handle_request_thread:handleRequest +loop Until the response is written completely + handle_request_thread->shared_memory :copy response to shared memory + handle_request_thread->handle_request_thread:pthread_cond_signal +end + +send_request_thread->shared_memory :shmPool_free +@enduml \ No newline at end of file diff --git a/bundles/remote_services/remote_service_admin_shm_v2/diagrams/rsa_shm_remote_service_call_seq.png b/bundles/remote_services/remote_service_admin_shm_v2/diagrams/rsa_shm_remote_service_call_seq.png new file mode 100644 index 0000000000000000000000000000000000000000..45867eaf26a0fca495df528d051eaa9331a1ff8b GIT binary patch literal 59257 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 literal 0 HcmV?d00001 diff --git a/bundles/remote_services/remote_service_admin_shm_v2/diagrams/rsa_shm_remote_service_call_seq.puml b/bundles/remote_services/remote_service_admin_shm_v2/diagrams/rsa_shm_remote_service_call_seq.puml new file mode 100644 index 000000000..271e14a63 --- /dev/null +++ b/bundles/remote_services/remote_service_admin_shm_v2/diagrams/rsa_shm_remote_service_call_seq.puml @@ -0,0 +1,51 @@ +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +@startuml +box "consumer process" +participant service_consumer +participant c_framework as "consumer framework" +participant c_rsa as "consumer rsa" +participant c_rpc as "consumer rpc" +end box + +box "provider process" +participant p_rsa as "provider rsa" +participant p_rpc as "provider rpc" +participant remote_service +end box + +service_consumer->c_framework ++:use/track remote service +c_framework->c_rpc ++:getService +c_rpc->c_rpc:create proxy service for remote service +return proxy service of remote service +return proxy service of remote service + +service_consumer -> c_rpc ++: call proxy service method +c_rpc -> c_rpc: serialize request data +c_rpc -> c_rsa++: sendRequest +c_rsa -> p_rsa++: IPC(shared memory), send request data + +p_rsa->p_rpc++:handleRequest +p_rpc->p_rpc:deserialize reuqest data +p_rpc->remote_service++: call remote service +return response +p_rpc-->p_rpc:serialize response +return serialized response +return IPC(shared memory), serialized response +return serialized response +c_rpc --> c_rpc: deserialize response +return result +@enduml diff --git a/bundles/remote_services/rsa_rpc_json/README.md b/bundles/remote_services/rsa_rpc_json/README.md new file mode 100644 index 000000000..77b84d0e8 --- /dev/null +++ b/bundles/remote_services/rsa_rpc_json/README.md @@ -0,0 +1,68 @@ +--- +title: Remote Service Admin RPC Using JSON +--- + + + +## Remote Service Admin RPC Using JSON + +Remote service admin RPC does not appear in the OSGI standard document. It is an extraction of the serialization/deserialization functionality from remote service admin. It is part of the remote service admin feature. + +rsa_json_rpc is a serialization implementation based on [JSON representation](https://amdatu.atlassian.net/wiki/spaces/AMDATUDEV/pages/21954571/Amdatu+Remote#AmdatuRemote-AdminHTTP%2FJson). It uses `libdfi` to convert function invocation information into JSON messages. The interface description is configured through the description file in the interface consumer/provider. See the [libdfi documentation](../../../libs/dfi/README.md) for the interface description file. + +### Supported Platform +- Linux + +### Properties/Configuration + +| **Properties** | **Type** | **Description**| +|----------------|----------|----------------| +| **RSA_JSON_RPC_LOG_CALLS**| bool | If set to true, the RSA will Log calls info to the file in RSA_JSON_RPC_LOG_CALLS_FILE. Default is false. | +| **RSA_JSON_RPC_LOG_CALLS_FILE**| string | Log file. If RSA_JSON_RPC_LOG_CALLS is enabled, the service calls info will be writen to the file(If restart this bundle, it will truncate file). Default is stdout. | + +### Conan Option + build_rsa_json_rpc=True Default is False + +### CMake Option + RSA_JSON_RPC=ON Default is OFF + +### Software Design + +The implementation of rsa_json_rpc includes two parts: 1. Creation of remote service endpoints; 2. Creation of remote service proxies + +- Remote service endpoint: It receives remote JSON_RPC requests and calls the corresponding service instances. +- Remote service proxy: It provides proxy services and serializes service call information (method name, arguments,...) into JSON_RPC requests. + +#### The Process Of Creating And Using A Remote Endpoint + +When a service is exported, RSA can use rsa_json_rpc to create a service endpoint. When a service is called, the service endpoint calls the corresponding service instance after the RPC request is deserialized. The detailed process is as follows diagram: + +![remote_service_endpoint_use_seq.png](diagrams/remote_service_endpoint_use_seq.png) + + +#### The Process Of Creating And Using A Remote Proxy + +When a service is imported, RSA can use rsa_json_rpc to create a proxy service factory. When a service is called, the proxy service factory creates the proxy service and gives it to the service caller. Then the service proxy serializes the service call information into an RPC request. And the RPC request will be sent to remote endpoint by RSA. The detailed process is as follows diagram: + +![remote_service_proxy_use_seq.png](diagrams/remote_service_proxy_use_seq.png) + +In the above process, each consumer of the remote service will have a different service proxy, because the service proxy needs to use the interface description file in the consumer (which may be a bundle) to serialize the service call information. + +### Example + +See the cmake target `remote-services-shm-server` and `remote-services-shm-client`. \ No newline at end of file diff --git a/bundles/remote_services/rsa_rpc_json/diagrams/remote_service_endpoint_use_seq.png b/bundles/remote_services/rsa_rpc_json/diagrams/remote_service_endpoint_use_seq.png new file mode 100644 index 0000000000000000000000000000000000000000..de814ded3016eb72e7d32c1bb3025a86297fbc58 GIT binary patch literal 43996 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 AmjD0& literal 0 HcmV?d00001 diff --git a/bundles/remote_services/rsa_rpc_json/diagrams/remote_service_endpoint_use_seq.puml b/bundles/remote_services/rsa_rpc_json/diagrams/remote_service_endpoint_use_seq.puml new file mode 100644 index 000000000..954badeed --- /dev/null +++ b/bundles/remote_services/rsa_rpc_json/diagrams/remote_service_endpoint_use_seq.puml @@ -0,0 +1,37 @@ +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +@startuml +==create endpoint(service export)== +-\rsa:exportService() +rsa->rsa:Create endpoint description +rsa->rsa_rpc_json:createEndpoint(endpointDescription) +rsa_rpc_json->rsa_rpc_json:Create ffi_cif according to the interface description file +note over rsa_rpc_json +The interface description file +is provided by the service provider +end note +rsa_rpc_json->framework:Register RPC request handler service\n(rsa_request_handler_service_t) +return RPC request handler service id +rsa_rpc_json --> rsa:RPC request handler service id + +==use endpoint(service call)== +-\rsa:receive rpc request +rsa->rsa_rpc_json:call RPC request handler service +rsa_rpc_json->rsa_rpc_json:deserialize rpc request +rsa_rpc_json->rsa_rpc_json:ffi_call(ffi_cif, target_service) +rsa_rpc_json->rsa_rpc_json:serialize the result of service invocation +rsa_rpc_json-->rsa:serialized result +@enduml \ No newline at end of file diff --git a/bundles/remote_services/rsa_rpc_json/diagrams/remote_service_proxy_use_seq.png b/bundles/remote_services/rsa_rpc_json/diagrams/remote_service_proxy_use_seq.png new file mode 100644 index 0000000000000000000000000000000000000000..7f67ef4facfe3cb78feaf977c9dc1bd21b0731bd GIT binary patch literal 43223 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 literal 0 HcmV?d00001 diff --git a/bundles/remote_services/rsa_rpc_json/diagrams/remote_service_proxy_use_seq.puml b/bundles/remote_services/rsa_rpc_json/diagrams/remote_service_proxy_use_seq.puml new file mode 100644 index 000000000..467bdcb45 --- /dev/null +++ b/bundles/remote_services/rsa_rpc_json/diagrams/remote_service_proxy_use_seq.puml @@ -0,0 +1,34 @@ +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +@startuml +==create proxy factory(service import)== +-\rsa:importService() +rsa->rsa_rpc_json:createProxy(endpointDescription, requestSenderSvcId) +rsa_rpc_json->framework:Register remote service proxy factory service\n(celix_service_factory_t) +return factory service id +rsa_rpc_json --> rsa:factory service id + +==use proxy(remote service call)== +-\rsa:remote service call +rsa->rsa_rpc_json:get remote service proxy service(use celix_service_factory_t) +alt proxy service is not existed +rsa_rpc_json->rsa_rpc_json:Create proxy service according to the interface description file +end +rsa_rpc_json-->rsa:proxy service +rsa->rsa_rpc_json:call proxy service +rsa_rpc_json->rsa_rpc_json:serialize invocation information of proxy service +rsa_rpc_json-->rsa:serialized result +@enduml \ No newline at end of file diff --git a/documents/subprojects.md b/documents/subprojects.md index 7f694f6fb..708537d3b 100644 --- a/documents/subprojects.md +++ b/documents/subprojects.md @@ -54,7 +54,7 @@ the Apache Celix functionality. Most of these bundles are based on the OSGi spec * [Syslog Writer](../bundles/logging/log_writers/syslog_writer) - A syslog writer for use in combination with the Log Service. * [Shell](../bundles/shell/README.md) - A OSGi C and C++ shell implementation, which can be extended with shell command services. * [Pubsub](../bundles/pubsub/README.md) - An implementation for a publish-subscribe remote message communication system. -* [Remote Services](../bundles/remote_services) - A C adaption and implementation of the OSGi Remote Service Admin specification. +* [Remote Services](../bundles/remote_services/README.md) - A C adaption and implementation of the OSGi Remote Service Admin specification. * [C++ Remote Services](../bundles/cxx_remote_services/README.md) - A C++17 adaption and implementation of the OSGi Remote Service Admin specification. Requires manually or code-generated import/export factories to work. * [Components Ready Check](../bundles/components_ready_check/README.md) - A bundle which checks if all components are ready. diff --git a/libs/dfi/README.md b/libs/dfi/README.md index 6956e1411..cdeb38355 100644 --- a/libs/dfi/README.md +++ b/libs/dfi/README.md @@ -19,4 +19,243 @@ See the License for the specific language governing permissions and limitations under the License. --> -# Apache Celix Dynamic Function Interface +## Apache Celix Dynamic Function Interface + +Dynamic Function Interface (DFI) is a dynamic interface type implementation based on [libffi](https://en.wikipedia.org/wiki/Libffi). +It can generate dynamic interface types according to the interface description file, and can convert the corresponding +dynamic interface call into a [JSON representation](https://amdatu.atlassian.net/wiki/spaces/AMDATUDEV/pages/21954571/Amdatu+Remote#AmdatuRemote-AdminHTTP%2FJson). It can also convert the JSON representation into a dynamic interface call. + +### Conan Option + build_celix_dfi=True Default is False + +### CMake Option + CELIX_DFI=ON Default is ON + +### Interface Descriptor + +In `libdfi`, we have defined a set of simple interface description languages. Users can use this language to describe interface types, and at runtime, libdfi converts the interface description into a dynamic interface. + +Before introducing the interface description language, let's look at an example of interface description. + +~~~ +:header +type=interface +name=calculator +version=1.0.0 +:annotations +classname=org.example.Calculator +:types +StatsResult={DDD[D average min max input} +:methods +add(DD)D=add(#am=handle;PDD#am=pre;*D)N +~~~ + +As above, the interface description has four sections: the header section, annotations section, types section, and methods section. The format of each section is as follows: + +~~~ + ':header\n' 'Name=Value\n'... + ':annotations\n' 'Name=Value\n'... + ':types\n' 'TypeId=Value\n'... + ':methods\n' 'MethodId=Value\n'... +~~~ + +Among them, the legal characters that can be used in the “name” and “TypeId” include [a-zA-Z0-9_], the legal characters in “MethodId” include [a-zA-Z0-9_] and ".();[{}/". Besides [a-zA-Z0-9], the legal characters in “value” also include ".<>{}[]?;:~!@#$%^&*()_+-=,./'". It's worth noting that there should not be spaces on either side of '=', and each statement must end with a newline(‘\n’). + +For the interface description, its header section must include three elements: type, name, version. The value of "type" should be "interface", "name" is the interface name (service name), the value of "version" should coincide with the version number in the actually used interface header file, and it should conform to [semantic versioning requirements](https://semver.org/). + +#### The Data Types In The Interface Descriptor + +The data types supported by the interface description include: + +- **Simple Types** + + *Type representation*: + + |**Identifier**|B |D |F |I |J |S |V |Z |b | i | j | s |P |t |N | + |---------|---|------|-----|-------|-------|-------|----|--------------|-----|--------|--------|--------|------|------|---| + |**Types**|char|double|float|int32_t|int64_t|int16_t|void|boolean(uint8)|uchar|uint32_t|uint64_t|uint16_t|void *|char *|int| + + +- **Complex Types(Struct)** + + *Type representation*: + ~~~ + {[Type]+ [(Name)(SPACE)]+} + ~~~ + *Example*: + ~~~ + {DDII a b c d} + ~~~ + *To C language*: + ~~~ + struct { double a; double b; int c; int d; }; + ~~~ + +- **Sequence Type** + + *Type representation*: + ~~~ + [(type) + ~~~ + *Example*: + ~~~ + [D + ~~~ + *To C language*: + ~~~ + struct { + uint32_t cap; + uint32_t len; + duoble *buf; + }; + ~~~ + +- **Typed Pointer** + + *Type representation*: + ~~~ + *(Type) + ~~~ + *Example*: + ~~~ + *D + ~~~ + *To C language*: + ~~~ + duoble *d; + ~~~ + +- **Reference By Value** + + *Type representation*: + ~~~ + l(name); + ~~~ + *Example*: + ~~~ + MySubType={jDD time d1 d2} + MyType={DDlMySubType; d11 d12 subTypeVal} + ~~~ + *To C language*: + ~~~ + struct MySubType{ + uint64_t time; + double d1; + double d2; + }; + struct MyType { + double d11; + double d12; + struct MySubType subTypeVal; + }; + ~~~ + +- **Pointer Reference** + + *Type representation*: + ~~~ + L(name);//shortcut for *l(name); + ~~~ + *Example*: + ~~~ + MySubType={jDD time d1 d2} + MyType={DDLMySubType; d11 d12 subTypePtr} + ~~~ + *To C language*: + ~~~ + struct MySubType{ + uint64_t time; + double d1; + double d2; + }; + struct MyType { + double d11; + double d12; + struct MySubType *subTypePtr; + }; + ~~~ + +- **Type Alias(typedef)** + + *Type representation*: + ~~~ + T(Name)=Type; + ~~~ + *Example*: + ~~~ + Ttype={DD val1 val2};{ltype;D typeVal a} + ~~~ + *To C language*: + ~~~ + struct { + typedef { + double val1; + double val2; + }type; + type typeVal; + double a; + } + ~~~ + +- **Meta-Information** + + *Type representation*: + ~~~ + #Name=Value; + ~~~ + *Example*: + ~~~ + #a=hello; + ~~~ + +- **Enumeration** + + *Type representation*: + ~~~ + #EnumName=value;E + ~~~ + *Example*: + ~~~ + #v1=0;#v2=1;E + ~~~ + *To C language*: + ~~~ + enum { + v1=0; + v2=1; + }; + ~~~ + +- **Method/Function** + + *Type representation*: + ~~~ + (Name)([Type]*)Type + ~~~ + In order to represent the properties of function parameters (eg: in, out...), function parameters support the following metadata annotations: + + |Meta-info|Description| + |---------|-----------| + |am=handle| void pointer for the handle| + |am=pre | output pointer with memory pre-allocated| + |am=out | output pointer, the caller should use `free` to release the memory| + |const=true| text argument(t) can use it, Normally a text argument will be handled as char*, meaning that the callee is expected to take of ownership.If a const=true annotation is used the text argument will be handled as a const char*, meaning that the caller keeps ownership of the string.| + + *Example*: + ~~~ + add(#am=handle;PDD#am=pre;*D)N + ~~~ + *To C language*: + ~~~ + int add(void* handle,double a, double b, double *ret); + ~~~ + *Notes* + + - The return type of the function must be N, because remote service calls usually return error codes. + - Currently, the function only supports one output parameter, so the function cannot be defined in a multi-output parameter form. + +#### Interface Description File + +An interface description file is that the interface file written using the interface description language, and its file suffix is ".descriptor". Generally, for the association between the remote service instance and the interface description file, the interface filename tends to match the remote service name." + +The interface description file should exist in the bundle where the interface user or provider is located, and the description information should be consistent with the interface header file in use. When generating a bundle, we usually store the interface description file in the following paths of the bundle: "META-INF/descriptors/", "META-INF/descriptors/services/ ". \ No newline at end of file From 3bad2b3bcd128822aac1697a7e7c2a43dcf9f58f Mon Sep 17 00:00:00 2001 From: xuzhenbao Date: Mon, 20 Nov 2023 20:26:53 +0800 Subject: [PATCH 2/4] Improve doc for RSA --- bundles/remote_services/README.md | 2 +- .../discovery_zeroconf/README.md | 6 ++-- .../remote_service_admin_shm_v2/README.md | 10 +++---- .../remote_services/rsa_rpc_json/README.md | 4 +-- libs/dfi/README.md | 28 +++++++++---------- 5 files changed, 25 insertions(+), 25 deletions(-) diff --git a/bundles/remote_services/README.md b/bundles/remote_services/README.md index 06539bae4..f6faa3406 100644 --- a/bundles/remote_services/README.md +++ b/bundles/remote_services/README.md @@ -81,7 +81,7 @@ Provides a service discovery using etcd distributed key/value store. #### Zero configuration discovery -Provides a service discovery using zeroconf (Bonjour). +Provides a service discovery using Bonjour. | **Bundle** | `rsa_discovery_zeroconf.zip` | |--|----------------------------| diff --git a/bundles/remote_services/discovery_zeroconf/README.md b/bundles/remote_services/discovery_zeroconf/README.md index 7013445c2..e4b46e2f9 100644 --- a/bundles/remote_services/discovery_zeroconf/README.md +++ b/bundles/remote_services/discovery_zeroconf/README.md @@ -21,7 +21,7 @@ limitations under the License. ## Discovery Zeroconf -The `Discovery_zeroconf` is implemented based on mDNS, and its operation depends on the mDNS daemon. +The `Discovery_zeroconf` is implemented based on [Bonjour](https://github.com/apple-oss-distributions/mDNSResponder), and its operation depends on the mDNS daemon. The mapping between celix and mdns services is as follows: @@ -37,7 +37,7 @@ The mapping between celix and mdns services is as follows: Because We will perform the mDNS query only using link-local multicast, so we set domain name default value "local". -To reduce the operation of conversion between host name and address info. we set the address info to txt record, and set a dummy value("celix_rpc_dumb_host.local." and "50009") to the host name and port. +To reduce the operation of conversion between host name and address info. we set the address info to txt record, and set the host name and port to a dummy value("celix_rpc_dumb_host.local." and "50009"). We set the instance name of the mDNS service as `service_name + hash(endpoint uuid)`. If there is a conflict in the instance name, mDNS_daemon will resolve it. Since the maximum size of the mDNS service instance name is 64 bytes, we take the hash of the endpoint uuid here, which also reduces the probability of instance name conflicts. @@ -70,4 +70,4 @@ In the process of discovering remote service endpoints, discovery_zeroconf also See the cmake target `remote-services-zeroconf-server` and `remote-services-zeroconf-client`. -**Notes:** Before running the example, you should start the [mDNS](https://github.com/apple-oss-distributions/mDNSResponder) daemon first. +**Notes:** Before running the example, you should start the mDNS daemon first.You can get the mDNS daemon from bonjour project. diff --git a/bundles/remote_services/remote_service_admin_shm_v2/README.md b/bundles/remote_services/remote_service_admin_shm_v2/README.md index 85882cc37..e96d72fb7 100644 --- a/bundles/remote_services/remote_service_admin_shm_v2/README.md +++ b/bundles/remote_services/remote_service_admin_shm_v2/README.md @@ -50,7 +50,7 @@ The ‘rsa_json_rpc’ bundle is used to realize (de)serialization and Creating ### CMake Option RSA_REMOTE_SERVICE_ADMIN_SHM_V2=ON Default is OFF -### Software design +### Software Design #### The Relationship Between RSA_SHM And Other RSA Bundles @@ -58,13 +58,13 @@ If you need to complete a remote procedure call, multiple different bundles need ![rsa_shm_component_diagram](diagrams/rsa_shm_component_diagram.png) -RSA_SHM (Remote Service Admin SHM) has implemented data transmission based on shared memory, and provides a service of remote service admin (`remote_service_admin_service_t`), and a remote request sending service (`rsa_request_sender_service_t`). +RSA_SHM (Remote Service Admin SHM) has implemented data transmission based on shared memory, and provides a remote service admin service (`remote_service_admin_service_t`), and a remote request sending service (`rsa_request_sender_service_t`). -RSA_RPC (Remote Service Admin RPC) implements the serialization and deserialization for interactive data, and provides a remote service endpoint/proxy factory service (`rsa_rpc_factory_t`), as well as a remote request handler service (`rsa_request_handler_service_t`). +RSA_RPC (Remote Service Admin RPC) implements the serialization and deserialization for interactive data, and provides an endpoint/proxy factory service (`rsa_rpc_factory_t`) of remote service, as well as a remote request handler service (`rsa_request_handler_service_t`). -During imports/exports remote services, the topology manager imports/exports the remote service endpoint through `remote_service_admin_service_t`. At the same time, RSA_SHM creates a remote service proxy/endpoint through `rsa_rpc_factory_t`. +During imports/exports remote services, the topology manager imports/exports the remote service endpoint by `remote_service_admin_service_t`. At the same time, RSA_SHM creates a remote service proxy/endpoint by `rsa_rpc_factory_t`. -When a remote procedure call occurs, the remote service proxy sends the request to the remote service endpoint through `rsa_request_sender_service_t`. And the remote service endpoint uses `rsa_request_handler_service_t` to convert the request into a local service call. +When a remote procedure call occurs, the remote service proxy use `rsa_request_sender_service_t` to send the request to the remote service endpoint. And the remote service endpoint uses `rsa_request_handler_service_t` to convert the request into a local service call. #### The Remote Service Invocation Sequence diff --git a/bundles/remote_services/rsa_rpc_json/README.md b/bundles/remote_services/rsa_rpc_json/README.md index 77b84d0e8..e30764ee3 100644 --- a/bundles/remote_services/rsa_rpc_json/README.md +++ b/bundles/remote_services/rsa_rpc_json/README.md @@ -23,7 +23,7 @@ limitations under the License. Remote service admin RPC does not appear in the OSGI standard document. It is an extraction of the serialization/deserialization functionality from remote service admin. It is part of the remote service admin feature. -rsa_json_rpc is a serialization implementation based on [JSON representation](https://amdatu.atlassian.net/wiki/spaces/AMDATUDEV/pages/21954571/Amdatu+Remote#AmdatuRemote-AdminHTTP%2FJson). It uses `libdfi` to convert function invocation information into JSON messages. The interface description is configured through the description file in the interface consumer/provider. See the [libdfi documentation](../../../libs/dfi/README.md) for the interface description file. +`rsa_json_rpc` is a serialization implementation based on [JSON representation](https://amdatu.atlassian.net/wiki/spaces/AMDATUDEV/pages/21954571/Amdatu+Remote#AmdatuRemote-AdminHTTP%2FJson). It uses `libdfi` to convert function invocation information into JSON messages. The interface description is configured through the description file in the interface consumer/provider. See the [libdfi documentation](../../../libs/dfi/README.md) for the interface description file. ### Supported Platform - Linux @@ -43,7 +43,7 @@ rsa_json_rpc is a serialization implementation based on [JSON representation](ht ### Software Design -The implementation of rsa_json_rpc includes two parts: 1. Creation of remote service endpoints; 2. Creation of remote service proxies +The implementation of `rsa_json_rpc` includes two parts: 1. Creation of remote service endpoints; 2. Creation of remote service proxies - Remote service endpoint: It receives remote JSON_RPC requests and calls the corresponding service instances. - Remote service proxy: It provides proxy services and serializes service call information (method name, arguments,...) into JSON_RPC requests. diff --git a/libs/dfi/README.md b/libs/dfi/README.md index cdeb38355..3d469dc2c 100644 --- a/libs/dfi/README.md +++ b/libs/dfi/README.md @@ -69,7 +69,7 @@ The data types supported by the interface description include: - **Simple Types** - *Type representation*: + *Type schema*: |**Identifier**|B |D |F |I |J |S |V |Z |b | i | j | s |P |t |N | |---------|---|------|-----|-------|-------|-------|----|--------------|-----|--------|--------|--------|------|------|---| @@ -78,7 +78,7 @@ The data types supported by the interface description include: - **Complex Types(Struct)** - *Type representation*: + *Type schema*: ~~~ {[Type]+ [(Name)(SPACE)]+} ~~~ @@ -93,7 +93,7 @@ The data types supported by the interface description include: - **Sequence Type** - *Type representation*: + *Type schema*: ~~~ [(type) ~~~ @@ -112,7 +112,7 @@ The data types supported by the interface description include: - **Typed Pointer** - *Type representation*: + *Type schema*: ~~~ *(Type) ~~~ @@ -127,7 +127,7 @@ The data types supported by the interface description include: - **Reference By Value** - *Type representation*: + *Type schema*: ~~~ l(name); ~~~ @@ -152,7 +152,7 @@ The data types supported by the interface description include: - **Pointer Reference** - *Type representation*: + *Type schema*: ~~~ L(name);//shortcut for *l(name); ~~~ @@ -177,7 +177,7 @@ The data types supported by the interface description include: - **Type Alias(typedef)** - *Type representation*: + *Type schema*: ~~~ T(Name)=Type; ~~~ @@ -188,7 +188,7 @@ The data types supported by the interface description include: *To C language*: ~~~ struct { - typedef { + typedef struct { double val1; double val2; }type; @@ -199,7 +199,7 @@ The data types supported by the interface description include: - **Meta-Information** - *Type representation*: + *Type schema*: ~~~ #Name=Value; ~~~ @@ -210,7 +210,7 @@ The data types supported by the interface description include: - **Enumeration** - *Type representation*: + *Type schema*: ~~~ #EnumName=value;E ~~~ @@ -228,7 +228,7 @@ The data types supported by the interface description include: - **Method/Function** - *Type representation*: + *Type schema*: ~~~ (Name)([Type]*)Type ~~~ @@ -251,11 +251,11 @@ The data types supported by the interface description include: ~~~ *Notes* - - The return type of the function must be N, because remote service calls usually return error codes. - - Currently, the function only supports one output parameter, so the function cannot be defined in a multi-output parameter form. + - For RPC interface, the return type of methods must be N, because remote service calls usually return error codes. + - Currently, the method only supports one output parameter, so the method cannot be defined in a multi-output parameter form. #### Interface Description File -An interface description file is that the interface file written using the interface description language, and its file suffix is ".descriptor". Generally, for the association between the remote service instance and the interface description file, the interface filename tends to match the remote service name." +An interface description file is that the interface file written using the interface description language, and its file suffix is ".descriptor". Generally, to associate the remote service instance with the interface description file, the interface description filename should be consistent with the remote service name." The interface description file should exist in the bundle where the interface user or provider is located, and the description information should be consistent with the interface header file in use. When generating a bundle, we usually store the interface description file in the following paths of the bundle: "META-INF/descriptors/", "META-INF/descriptors/services/ ". \ No newline at end of file From bac6049fa23a33be041045ae6c5d1cee69d42ccd Mon Sep 17 00:00:00 2001 From: xuzhenbao Date: Mon, 25 Dec 2023 21:06:41 +0800 Subject: [PATCH 3/4] Update doc of remote service --- bundles/remote_services/README.md | 18 +++++----- .../discovery_zeroconf/README.md | 33 ++++++++++-------- .../diagrams/multiple_txt_record_snapshot.png | Bin 0 -> 128663 bytes .../remote_service_admin_shm_v2/README.md | 18 +++++----- .../remote_services/rsa_rpc_json/README.md | 2 +- libs/dfi/README.md | 19 +++++----- 6 files changed, 48 insertions(+), 42 deletions(-) create mode 100644 bundles/remote_services/discovery_zeroconf/diagrams/multiple_txt_record_snapshot.png diff --git a/bundles/remote_services/README.md b/bundles/remote_services/README.md index f6faa3406..cec575889 100644 --- a/bundles/remote_services/README.md +++ b/bundles/remote_services/README.md @@ -27,9 +27,9 @@ The Remote Service Admin Service subproject contains an adapted implementation o The topology manager decides which services should be imported and exported according to a defined policy. Currently, only one policy is implemented in Celix, the *promiscuous* policy, which simply imports and exports all services. -| **Bundle** | `topology_manager.zip` | -|--|--| -| **Configuration** | *None* | +| **Bundle** | `Celix::rsa_topology_manager` | +|--|-----------------------------------------| +| **Configuration** | *None* | ### Remote Service Admin @@ -40,8 +40,8 @@ The Remote Service Admin (RSA) provides the mechanisms to import and export serv Provides remote service admin using HTTP and JSON. The serialization is done using [libdfi](../../libs/dfi/README.md) to convert function call information into [JSON representation](https://amdatu.atlassian.net/wiki/spaces/AMDATUDEV/pages/21954571/Amdatu+Remote#AmdatuRemote-AdminHTTP%2FJson). `libffi` is configured using descriptor files in the bundles. -| **Bundle** | `rsa_dfi.zip` | -|--|--| +| **Bundle** | `Celix::rsa_dfi` | +|--|--------------------------------------------------------------------| | **Configuration** | See [Remote Service Admin DFI](remote_service_admin_dfi/README.md) | #### Remote Service Admin SHM @@ -49,7 +49,7 @@ Provides remote service admin using HTTP and JSON. The serialization is done usi Provides remote service admin using shared memory. The serialization implementation is pluggable, and the default serialization is done using [libdfi](../../libs/dfi/README.md) to convert function call information into [JSON representation](https://amdatu.atlassian.net/wiki/spaces/AMDATUDEV/pages/21954571/Amdatu+Remote#AmdatuRemote-AdminHTTP%2FJson). `libffi` is configured using descriptor files in the bundles. -| **Bundle** | `rsa_shm.zip` | +| **Bundle** | `Celix::rsa_shm` | |-------------------|------------------------------------------------------------------------| | **Configuration** | See [Remote Service Admin SHM](remote_service_admin_shm_v2/README.md) | @@ -61,7 +61,7 @@ Actively discovers the presence of remote exported services and provides informa Provides a service discovery with preconfigured discovery endpoints, allowing a static mesh of nodes for remote service invocation to be created. The configured discovery bundle in Celix is compatible with the configured discovery implementation provided by [Amdatu Remote](https://amdatu.atlassian.net/wiki/display/AMDATUDEV/Amdatu+Remote). -| **Bundle** | `discovery_configured.zip` | +| **Bundle** | `Celix::rsa_discovery` | |--|--| | **Configuration** | `DISCOVERY_CFG_POLL_ENDPOINTS`: defines a comma-separated list of discovery endpoints that should be used to query for remote services. Defaults to `http://localhost:9999/org.apache.celix.discovery.configured`; | | | `DISCOVERY_CFG_POLL_INTERVAL`: defines the interval (in seconds) in which the discovery endpoints should be polled. Defaults to `10` seconds. | @@ -75,7 +75,7 @@ Note that for configured discovery, the "Endpoint Description Extender" XML form Provides a service discovery using etcd distributed key/value store. -| **Bundle** | `discovery_etcd.zip` | +| **Bundle** | `Celix::rsa_discovery_etcd` | |------------|----------------------| | **Configuration** | See [etcd discovery](discovery_etcd/README.md)| @@ -83,7 +83,7 @@ Provides a service discovery using etcd distributed key/value store. Provides a service discovery using Bonjour. -| **Bundle** | `rsa_discovery_zeroconf.zip` | +| **Bundle** | `Celix::rsa_discovery_zeroconf` | |--|----------------------------| | **Configuration** | See [Zeroconf Discovery](discovery_zeroconf/README.md) | diff --git a/bundles/remote_services/discovery_zeroconf/README.md b/bundles/remote_services/discovery_zeroconf/README.md index e4b46e2f9..a17071ef6 100644 --- a/bundles/remote_services/discovery_zeroconf/README.md +++ b/bundles/remote_services/discovery_zeroconf/README.md @@ -25,23 +25,19 @@ The `Discovery_zeroconf` is implemented based on [Bonjour](https://github.com/ap The mapping between celix and mdns services is as follows: -| **mDNS service** | **celix service** | -|------------------|-------------------------------------------| -| instance name | service name+hash(endpoint uuid) | -| service type | "_celix-rpc._udp"+${custom subtype} | -| domain name | "local" | -| txt record | service properties | -| host | "celix_rpc_dumb_host.local."(It is dummy) | -| port | 50009(It is dummy) | +| **mDNS service** | **celix service** | +|------------------|------------------------------------------------------------------------------------------------------------------------------| +| instance name | service name+pid(process id) | +| service type | "${last word of service configuration type}._sub._celix-rpc._udp" | +| domain name | "local" | +| txt record | service properties | +| host | hostname. | +| port | The property value of "${service configuration type}.port". If it is not network server, it will be set a dummy value(65535) | -Because We will perform the mDNS query only using link-local multicast, so we set domain name default value "local". +The domain name value is set to "local" , because for remote discovery the mDNS query will only use link-local multicast. -To reduce the operation of conversion between host name and address info. we set the address info to txt record, and set the host name and port to a dummy value("celix_rpc_dumb_host.local." and "50009"). - -We set the instance name of the mDNS service as `service_name + hash(endpoint uuid)`. If there is a conflict in the instance name, mDNS_daemon will resolve it. Since the maximum size of the mDNS service instance name is 64 bytes, we take the hash of the endpoint uuid here, which also reduces the probability of instance name conflicts. - -According to [rfc6763](https://www.rfc-editor.org/rfc/rfc6763.txt) 6.1 and 6.2 section, DNS TXT record can be up to 65535 (0xFFFF) bytes long in mDNS message. and we should keep the size of the TXT record under 1300 bytes(allowing it to fit in a single 1500-byte Ethernet packet). Therefore, `Discovery_zeroconf` announce celix service endpoint using multiple txt records and each txt record max size is 1300 bytes. +For readability and debuggability of instance names, we set the instance name of the mDNS service as `service_name + pid(process id)`. If there is a conflict in the instance name of same process, we will add a conflict number to the end of the instance name, because the mDNS daemon thinks that services with the same instance name on the same host are the same service. If there is a conflict in the instance name of different host, mDNS daemon will resolve it. ### Supported Platform - Linux @@ -66,6 +62,15 @@ In the process of discovering remote service endpoints, discovery_zeroconf also ![remote_service_endpoint_discovery_process](diagrams/service_discovery_seq.png) +#### Lager txt record(service properties) process + +According to [rfc6763](https://www.rfc-editor.org/rfc/rfc6763.txt) 6.1 and 6.2 section, DNS TXT record can be up to 65535 (0xFFFF) bytes long in mDNS message. and we should keep the size of the TXT record under 1300 bytes(allowing it to fit in a single 1500-byte Ethernet packet). Therefore, `Discovery_zeroconf` announce celix service endpoint using multiple txt records and each txt record max size is 1300 bytes. When the service with large properties,the `Discovery_zeroconf` will split the properties into multiple txt records, and mDNS daemon send them to the remote mDNS daemon. The mDNS message snapshot of wireshark is as follows: + +![multiple_txt_record_snapshot.png](diagrams/multiple_txt_record_snapshot.png) + +As in the above figure, the mDNS message contains multiple txt records, and each txt record message contains the same service instance name, but the service properties in the txt record are different. In addition, to avoid mDNS message packet loss, we set a specific service property `DZC_SVC_PROPS_SIZE_KEY`, which indicates the size of the service properties. When the number of txt records received by remote `Discovery_zeroconf` is equal to the number indicated by `DZC_SVC_PROPS_SIZE_KEY`, the remote `Discovery_zeroconf` will combine the txt records into a service properties. + + ### Example See the cmake target `remote-services-zeroconf-server` and `remote-services-zeroconf-client`. diff --git a/bundles/remote_services/discovery_zeroconf/diagrams/multiple_txt_record_snapshot.png b/bundles/remote_services/discovery_zeroconf/diagrams/multiple_txt_record_snapshot.png new file mode 100644 index 0000000000000000000000000000000000000000..bcb9077e4d368a82286f11d03e3d970bee073fb0 GIT binary patch literal 128663 zcmb@ucQ~8>-^PtnbQsmv7Nadyd+!)k9g0%b+AT_ps=XpH+S1nEYEz~5-ULPL*n3rC zMr*;7+zQA^YjEwB^gZp>&$;hZB z$jHv+&`^-x`HYr1M@HsP_TaACQ!n$)CTO&Eoy$rRd{A^~IxcVQoZh2vVfw}oo<69! zB9PN^Wm~UM95G4L@Y1UKhGR$3Z$Yb$)M2AH?j^%cgC%-pD9M!}O_$ zLT$?MhF?T->LhR6x+nz1|A9fBhUf1W7s<3uhJSo<_IBh%&_wxvTw%bqWsEt}g+or3 zClX?~j6k>@l(+E;LKZu;j!-!TolGYa5BG77gI%rM7l&#!GMFa;{s-~9?G12fa;{Y7 zJnse}cj3T*Opz$|x*Z+{;lLGvfX$G)_hxppJ2UH?Qu;hX4mX3ZhcDU2ik0mBe&pR= z1502MXMS-h)H1=^74E)|x}fHK)Tss%wI~T1PYx`n{$|>rkYEws#<);@=x(jf>eN#j zpO}{b9`SNr5~}iZX=I-rpywmJ{9x$Pbw$@w z#wOhdMw3jNas_A(o49#H7w)h4OG&Ztdb^iq$A!`7ULb9|Qt(*UY!TKMY`1>ShmSc+ zJxbn}L`o<=vWqo$bGh!knG!k1rw%?a7X`4^w#wZyfpY%%g5TY~tZs_!qVIAdFUB8c z>;u{8y~;I?9{J4q5!d%0!8^*m^sgqfNA|19KQ%G^4N_y94=Z;k~ked9rkz2|bnZj%G4Zeo?!6%FE@9e!&rYO7Rx+rcAKg4Vkz zEGf0fFnssMuLV8Z2n{+muQCrByR#fq(0x=|CDYra?cybvH|@3Woz>U<5wqp(#O*j& zl(#!G*sVXp4{K0E26ww`RXki2lt=pfT{QB?fC0a3`P`hSdx6CnY50lPXq7-;^|z%J z{I=c3im(?so^dH$6DM`BJka>Z5AFfaZ|1_Pz+2)1kkeV3g;-Pxox_NZAG)M#T5jH; z=~z}wKU_&3rLt0zB?`@{Yt~JSkw4$#Nr&%Q$=oj$1z^ds!ncfqt0BsEO?FC)-E?zz zR>iF0I`Q#x0_itH?h4Vq+|%z%2)#;6s#XN|A>EXyzfXVJty|+JDvqmn6S4ivAFYb0 z-pSDNL2cv!ksMO*Sd$EFzj#2rxT|+0EN^`+RK;BCmQRe>q{&d{iE(tcG~?8pMIY;d zY$xnXeO4owZ!B`uMu?hJDEs2D2kTZkJaNQBucyt&`0|_=lBapj;xFEwAiZR12x2b= z{GQR8-V8SF*R$YEgudk%!n};Ztfa^gr}yg%=d?Ces+bPG@QhE(4+u6DAP;KC;mY@x zD@1M-UThbXS1vwujZnkxuio4F0U{_47>{@Ef;X1g>jR=V_*ZwC_Bu=Px2XHNIVhId zliZtkBD{OZkP+C{M(0Lxy9G4_IlY^3!@0l@a)A>{i5L3tZ#@+)^c6GMJk_pe?UMcU z>;qF5$-Wc$S;J9hNTY8`NRG$F9*I_8uL#$-mK@ zK_Y7$doKy!u7o>gSIBqNm-?KHVICl2zRNS3o zF?EtF-n`9eIkF~r6A|m-MrYuHNN}@LshcRTimm2 Vv(xmHgmjS89Iqf`}E&!F=Q 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 K)i2V!_V7=Q!VuX2 literal 0 HcmV?d00001 diff --git a/bundles/remote_services/remote_service_admin_shm_v2/README.md b/bundles/remote_services/remote_service_admin_shm_v2/README.md index e96d72fb7..4ac5058f6 100644 --- a/bundles/remote_services/remote_service_admin_shm_v2/README.md +++ b/bundles/remote_services/remote_service_admin_shm_v2/README.md @@ -25,24 +25,24 @@ The Celix Remote Service Admin SHM bundle implement OSGi remote service using sh In order to reuse the (de)serialization features of remote service admin, the remote service admin will be realized by ‘rsa_shm’ and 'rsa_json_rpc'(see [Remote Service Admin RPC Using JSON](../rsa_rpc_json/README.md)) bundles. The ‘rsa_shm’ bundle is used to realize ‘remote_service_admin_service_t’ and IPC. -The ‘rsa_json_rpc’ bundle is used to realize (de)serialization and Creating service endpoint/proxy. +The ‘rsa_json_rpc’ bundle is used to realize (de)serialization and creating service endpoint/proxy. ### Supported Platform - Linux ### Properties/Configuration -| **Properties** | **Type** | **Description**| -|----------------|----------|----------------| -| **rsaShmPoolSize** | long | The RSA SHM pool size in bytes. Its value should be greater than 8192 bytes.(default 256KB) | -| **rsaShmMsgTimeout** | long | The timeout of remote service invocation in seconds. (default 30s) | -| **rsaShmCctIvNum** | long | The maximum concurrent invocations of the same service. If there are more concurrent invocations than its value, service invocation will fail.(default 32) | +| **Properties** | **Type** | **Description**| **Default value** | +|--------------------------------------------|----------|----------------|------------------| +| **CELIX_RSA_SHM_POOL_SIZE** | long | The RSA SHM pool size in bytes. Its value should be greater than or equal to 8192 bytes.| 256KB | +| **CELIX_RSA_SHM_MSG_TIMEOUT** | long | The timeout of remote service invocation in seconds. | default 30s | +| **CELIX_RSA_SHM_MAX_CONCURRENT_INVOCATIONS_NUM** | long | The maximum concurrent invocations of the same service. If there are more concurrent invocations than its value, service invocation will fail.| 32 | -### Supported service.exported.configs +The value of RSA_SHM_POOL_SIZE should be greater than or equal to 8192 bytes, because current memory pool ctrl block(control_t) size is 6536 bytes. -- **celix.remote.admin.shm** : The IPC type is shared memory, and the serialization type is json. +### Supported service.exported.configs -- **celix.remote.admin.shm,celix.remote.admin.rpc_type.${xxx}** : The IPC type is shared memory, and the serialization type is ${xxx}. +- **celix.remote.admin.shm** : The IPC type is shared memory, and the default serialization type is json. And remote service can use `celix.remote.admin.shm.rpc_type` property to configure the serialization type(Current only implement json serialization in celix project).The value of `celix.remote.admin.shm.rpc_type` property should be equal to the value of `celix.remote.admin.rpc_type` property of `rsa_rpc_factory_t`. ### Conan Option build_rsa_remote_service_admin_shm_v2=True Default is False diff --git a/bundles/remote_services/rsa_rpc_json/README.md b/bundles/remote_services/rsa_rpc_json/README.md index e30764ee3..10516a738 100644 --- a/bundles/remote_services/rsa_rpc_json/README.md +++ b/bundles/remote_services/rsa_rpc_json/README.md @@ -57,7 +57,7 @@ When a service is exported, RSA can use rsa_json_rpc to create a service endpoin #### The Process Of Creating And Using A Remote Proxy -When a service is imported, RSA can use rsa_json_rpc to create a proxy service factory. When a service is called, the proxy service factory creates the proxy service and gives it to the service caller. Then the service proxy serializes the service call information into an RPC request. And the RPC request will be sent to remote endpoint by RSA. The detailed process is as follows diagram: +When a service is imported, RSA can use rsa_json_rpc to create a proxy service factory. When a service is requested, the proxy service factory creates the proxy service and gives it to the service requester. Then, when the requested service is called (i.e. the service proxy is called), the service proxy serializes the service call information into an RPC request. And the RPC request will be sent to remote endpoint by RSA. The detailed process is as follows diagram: ![remote_service_proxy_use_seq.png](diagrams/remote_service_proxy_use_seq.png) diff --git a/libs/dfi/README.md b/libs/dfi/README.md index 3d469dc2c..dd68acce1 100644 --- a/libs/dfi/README.md +++ b/libs/dfi/README.md @@ -71,9 +71,9 @@ The data types supported by the interface description include: *Type schema*: - |**Identifier**|B |D |F |I |J |S |V |Z |b | i | j | s |P |t |N | - |---------|---|------|-----|-------|-------|-------|----|--------------|-----|--------|--------|--------|------|------|---| - |**Types**|char|double|float|int32_t|int64_t|int16_t|void|boolean(uint8)|uchar|uint32_t|uint64_t|uint16_t|void *|char *|int| + |**Identifier**|B |D |F |I |J |S |V |Z |b | i | j | s |P | t |N | + |---------|---|------|-----|-------|-------|-------|----|--------------|-----|--------|--------|--------|------|------------------|---| + |**Types**|char|double|float|int32_t|int64_t|int16_t|void|boolean(uint8)|uchar|uint32_t|uint64_t|uint16_t|void *| char *(C string) |int| - **Complex Types(Struct)** @@ -125,6 +125,8 @@ The data types supported by the interface description include: duoble *d; ~~~ +> **NOTES**: "*B" indicates a pointer to a char, "t" indicates a text type, which is C string. + - **Reference By Value** *Type schema*: @@ -249,13 +251,12 @@ The data types supported by the interface description include: ~~~ int add(void* handle,double a, double b, double *ret); ~~~ - *Notes* - - - For RPC interface, the return type of methods must be N, because remote service calls usually return error codes. - - Currently, the method only supports one output parameter, so the method cannot be defined in a multi-output parameter form. + > **Notes**: + > - For RPC interface, the return type of methods must be N, because remote service calls usually return error codes. + > - Currently, the method only supports one output parameter, so the method cannot be defined in a multi-output parameter form. #### Interface Description File -An interface description file is that the interface file written using the interface description language, and its file suffix is ".descriptor". Generally, to associate the remote service instance with the interface description file, the interface description filename should be consistent with the remote service name." +An interface description file is that the interface file written using the interface description language, and its file suffix is ".descriptor". Generally, to associate the remote service instance with the interface description file, the interface description filename should be consistent with the remote service name. -The interface description file should exist in the bundle where the interface user or provider is located, and the description information should be consistent with the interface header file in use. When generating a bundle, we usually store the interface description file in the following paths of the bundle: "META-INF/descriptors/", "META-INF/descriptors/services/ ". \ No newline at end of file +The interface description file should exist in the bundle where the interface consumer or provider is located, and the description information should be consistent with the interface header file in use. When generating a bundle, we usually store the interface description file in the following paths of the bundle: "META-INF/descriptors/", "META-INF/descriptors/services/ ". \ No newline at end of file From 7b3ea01fc27a3839a9f23d0c5ea5055c7011dc54 Mon Sep 17 00:00:00 2001 From: xuzhenbao Date: Tue, 27 Feb 2024 15:02:08 +0800 Subject: [PATCH 4/4] Add document for libdfi and dynamic ip mechanism --- bundles/remote_services/README.md | 16 +++++++ .../diagrams/dynamic_ip_filling_seq.png | Bin 0 -> 61463 bytes .../diagrams/dynamic_ip_filling_seq.puml | 43 ++++++++++++++++++ .../discovery_zeroconf/README.md | 16 +++---- .../remote_service_admin_dfi/README.md | 1 + libs/dfi/README.md | 25 ++++++---- 6 files changed, 85 insertions(+), 16 deletions(-) create mode 100644 bundles/remote_services/diagrams/dynamic_ip_filling_seq.png create mode 100644 bundles/remote_services/diagrams/dynamic_ip_filling_seq.puml diff --git a/bundles/remote_services/README.md b/bundles/remote_services/README.md index cec575889..bc090a9c7 100644 --- a/bundles/remote_services/README.md +++ b/bundles/remote_services/README.md @@ -87,6 +87,22 @@ Provides a service discovery using Bonjour. |--|----------------------------| | **Configuration** | See [Zeroconf Discovery](discovery_zeroconf/README.md) | +## Dynamic IP Mechanism For Remote Service Admin + +In order to make remote services work without configuring the IP of the RSA, we have designed the following dynamic IP mechanism. + + - The remote service admin service adds the property "celix.rsa.dynamic.ip.support". If RSA sets this property to true, the RSA will support dynamic IP address. + - If the RSA supports dynamic IP addresses, it should bind the network service address to any address(0.0.0.0/::), and set the property "celix.rsa.port" (which indicates the network port number of the remote service) for the exported remote service endpoint. + - The endpoint listener service of discovery adds the property "celix.rsa.discovery.interface.specific.endpoints.support". If this property is set to true, it means that the discovery support dynamic IP address filling. + - Add the configuration property "CELIX_RSA_INTERFACES_OF_PORT_", which indicates which network interfaces is used to expose the specified port service. + - When the topology manager exports remote services, it should detect whether the "celix.rsa.dynamic.ip.support" property of the remote service admin service is true. If so, the topology manager should create multiple endpoints that support dynamic IP address for a single export registration base on CELIX_RSA_INTERFACES_OF_PORT_. These endpoints are then forwarded to the discovery endpoint listener services that support dynamic IP address filling. + - The endpoint that supports dynamic IP address adds the property "celix.rsa.ifname", which indicates which network interface is used for exported endpoint exposure. This property is set by the topology manager based on CELIX_RSA_INTERFACES_OF_PORT_. + - The endpoint that supports dynamic IP address adds the property "celix.rsa.ip.addresses", which indicates the list of IP addresses corresponding to the endpoint. When the topology manager creates the endpoint description that supports dynamic IP address, the value of this property should be set to null, and the discovery that support dynamic IP address filling will replace the value(Discovery will decide whether to fill in the dynamic IP addresses based on whether the "celix.rsa.ip.addresses" key exists or not). + +The sequence diagram of the dynamic IP mechanism is as follows: +![dynamic_ip_filling](diagrams/dynamic_ip_filling_seq.png) + + The example of dynamic IP mechanism see `remote-services-zeroconf-server` and `remote-services-zeroconf-client`. ## Usage diff --git a/bundles/remote_services/diagrams/dynamic_ip_filling_seq.png b/bundles/remote_services/diagrams/dynamic_ip_filling_seq.png new file mode 100644 index 0000000000000000000000000000000000000000..a5a46f007b444d6d977bbbec3f4de5f2f7a1a236 GIT binary patch literal 61463 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

UKX*=Am&5~G%Ljz=3VvF?YS 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 RSA_A: exportService() +note over RSA_A: Exported service endpoint description e.g.:\n{\ncelix.rsa.port: 80"(set by RSA),\n...\n}" +TM_A -> TM_A: Create endpoint descriptions\n that support dynamic ip +note over TM_A: Dynamic ip endpoint description e.g.:\n{\ncelix.rsa.ifname: "eth0"(set by TopologyManager),\ncelix.rsa.port: 80",\ncelix.rsa.ip.addresses:""(set by TopologyManager),\n...\n} +TM_A -> Discovery_A: endpointAdded() + +Discovery_A -> Discovery_B: Announce endpoint \nto other frameworks + +Discovery_B -> Discovery_B: Watch remote endpoints \nand fill in dynamic ip +Discovery_B -> TM_B: endpointAdded() +note over TM_B: Dynamic ip endpoint description e.g.:\n{\ncelix.rsa.port: 80",\ncelix.rsa.ip.addresses:"192.168...1.1, 192.168...1.2"(replaced by Discovery),\n...\n}" +TM_B -> RSA_B: importService() +@enduml \ No newline at end of file diff --git a/bundles/remote_services/discovery_zeroconf/README.md b/bundles/remote_services/discovery_zeroconf/README.md index a17071ef6..9d5eb6bc7 100644 --- a/bundles/remote_services/discovery_zeroconf/README.md +++ b/bundles/remote_services/discovery_zeroconf/README.md @@ -25,14 +25,14 @@ The `Discovery_zeroconf` is implemented based on [Bonjour](https://github.com/ap The mapping between celix and mdns services is as follows: -| **mDNS service** | **celix service** | -|------------------|------------------------------------------------------------------------------------------------------------------------------| -| instance name | service name+pid(process id) | -| service type | "${last word of service configuration type}._sub._celix-rpc._udp" | -| domain name | "local" | -| txt record | service properties | -| host | hostname. | -| port | The property value of "${service configuration type}.port". If it is not network server, it will be set a dummy value(65535) | +| **mDNS service** | **celix service** | +|------------------|-------------------------------| +| instance name | service name+pid(process id) | +| service type | "${last word of service configuration type}._sub._celix-rpc._udp"| +| domain name | "local" | +| txt record | service properties | +| host | hostname of OS(It can be got by gethostname function).| +| port | The property value of "celix.rsa.port". It is set by RSA. If it is not network server, Discovery will set a dummy value(65535) to mDNS daemon.| The domain name value is set to "local" , because for remote discovery the mDNS query will only use link-local multicast. diff --git a/bundles/remote_services/remote_service_admin_dfi/README.md b/bundles/remote_services/remote_service_admin_dfi/README.md index 33b37368c..2dfb6523e 100644 --- a/bundles/remote_services/remote_service_admin_dfi/README.md +++ b/bundles/remote_services/remote_service_admin_dfi/README.md @@ -39,6 +39,7 @@ Libffi is configured using descriptor files in the bundles. Default is false CELIX_RSA_BIND_ON_ALL_INTERFACES If set to true the RSA will bind to all interfaces. Default is true. + CELIX_RSA_DFI_DYNAMIC_IP_SUPPORT If set to true the RSA will support dynamic IP address fill-in for service exports. Default is false. ###### CMake option RSA_REMOTE_SERVICE_ADMIN_DFI=ON diff --git a/libs/dfi/README.md b/libs/dfi/README.md index dd68acce1..8110c42e1 100644 --- a/libs/dfi/README.md +++ b/libs/dfi/README.md @@ -236,13 +236,15 @@ The data types supported by the interface description include: ~~~ In order to represent the properties of function parameters (eg: in, out...), function parameters support the following metadata annotations: - |Meta-info|Description| - |---------|-----------| - |am=handle| void pointer for the handle| - |am=pre | output pointer with memory pre-allocated| - |am=out | output pointer, the caller should use `free` to release the memory| + |Meta-info| Description| + |---------|------------| + |am=handle| void pointer for the handle.| + |am=pre | output pointer with memory pre-allocated, it should be pointer to [trivially copyable type](#notion-definitions).| + |am=out | output pointer, the caller should use `free` to release the memory, and it should be pointer to text(t) or double pointer to [serializable types](#notion-definitions).| |const=true| text argument(t) can use it, Normally a text argument will be handled as char*, meaning that the callee is expected to take of ownership.If a const=true annotation is used the text argument will be handled as a const char*, meaning that the caller keeps ownership of the string.| + If there is no metadata annotation, the default is standard argument(input parameter). And it can be any serializable type. + *Example*: ~~~ add(#am=handle;PDD#am=pre;*D)N @@ -251,9 +253,16 @@ The data types supported by the interface description include: ~~~ int add(void* handle,double a, double b, double *ret); ~~~ - > **Notes**: - > - For RPC interface, the return type of methods must be N, because remote service calls usually return error codes. - > - Currently, the method only supports one output parameter, so the method cannot be defined in a multi-output parameter form. + +##### Notion Definitions + +- **trivially copyable type**: A trivially copyable type is a type that can be copied with a simple memcpy without the usual danger of shallow copying. +- **serializable type**: All types except types involving untyped pointer or double pointer (pointer to pointer) are serializable. For example, complex types consisting of non-pointer fields are serializable while complex type containing a untyped pointer field is not serializable; [I is serializable while [P and [**D are not serializable. + +##### RSA Interface Convention Enforcement: + - For RSA interface, the return type of methods must be N, because remote service calls usually return error codes. + - The first parameter of a method must be `handle`, and`am=handle` can appear exactly once. + - If exists, output parameter (either `am=pre` or `am=out`) is only allowed as the last one. Therefore, there is at most one output parameter. #### Interface Description File