The “who is client and who is server” question seems unfair.
There is a controlling level…analogous to the shell, which has the job of wiring up the inputs and outputs.
Strawman solution for RPC-over-HTTP…..each line-at-a-time service also accepts a destination url, which accepts line-at-a-time input. So every service reads the http op, performs its function, then pushed onto the next. The final service can be the ‘append to file X’ service.
If we’re mimicking Unix cmdline we can also have the services conspire to ‘batch’ (i.e. block buffer) lines for efficiency.
RPC may have several problems, but it doesn’t seem this is one of them (it seems no worse then Unix pipeline)