River is a toolkit to build distributed systems with. The basic communication between client and service is based on RPC.
Client and service communicate with a protocol called JERI. There are JERI implementations for plain-TCP, plain-SSL, HTTP, HTTPS and Kerberos-TCP. For compatibility with RMI there is also a JRMP transport.
From small to big
The smallest river system is comprised of a service and a client. They only make use of JERI to communicate. No dynamic discovery is possible.
The next system in size is a combination of a service, client and a registry. This allows for automatic discovery of client, service and registry. The VM hosting the service registers the service in the registry.
For a system that also provides for ondemand distribution of compiled code, you will need a service, client, registry and class-server.
There are several basic services. For locking, distributed events, leasing, transactions.
River has an implementation of 'Tuple spaces' called JavaSpaces.