Basic protocol for communicating between services.
Currently implements HTTP/JSON, see ServiceProtocol::Redis for an alternate adapter.
- Designed to work with ServiceOperation but can interface with any class that respond to
.call(params)and return an object that responds to#to_hash. - Syncronizes metadata (
user_id,trace_id, etc) between services via RequestStore. - Uses
#to_jsonto serialize complex objects in JSON:API format (See Serializtion note below). - Allows batched requests.
Call Math::MultiplyByTwo.call(input: 1) on the 'math service'
ServiceProtocol::Remote.call(
'math_service:math/multiply_by_two',
{ input: 1 }, # params
{ user_id: 1 } # meta
)
=> { input: 1, output: 2 }SERVICE_PROTOCOL - Which adapter to use:
- "basic" - in process calls with serialization.
- "lib" - direct calls without serialization.
- "web" - HTTP/JSON.
SERVICE_PROTOCOL_TOKEN - A token to share across services to add basic security if service is exposed to public networks. Can be rolled by comma separating tokens (eg "old_token,new_token").
Currently #to_json expects a hash in JSON:API format:
{ "id" : 1, "type": "ModelName", "attributes": { ... } }To implement this in ActiveRecord::Base requires modifying the serialization method:
alias serializable_hash_attributes serializable_hash
def serializable_hash(options = {})
attrs = serializable_hash_attributes(options)
{ 'id' => attrs.delete('id'), 'type' => self.class.name.demodulize, 'attributes' => attrs }
end- Decouple serialization strategy
- Move environment variables, logger and
Proxy::REQUIRED_META_KEYStoConfiguration. - Better unit tests.
- Remove
Hash#traversedependency. - BaseServer for
authenticates?method - Rename
ProxyandEntity