Class: Gruf::Client

Inherits:
SimpleDelegator
  • Object
show all
Includes:
Loggable
Defined in:
lib/gruf/client.rb,
lib/gruf/client/error.rb,
lib/gruf/client/error_factory.rb

Overview

Abstracts out the calling interface for interacting with gRPC clients. Streamlines calling and provides instrumented response objects that also can contain deserialized error messages via serialized objects transported via the service’s trailing metadata.

begin
  client = ::Gruf::Client.new(service: ::Demo::ThingService)
  response = client.call(:GetMyThing, id: 123)
  puts response.message.inspect
rescue Gruf::Client::Error => e
  puts e.error.inspect
end

Utilizes SimpleDelegator to wrap the given service that the client is connecting to, which allows a clean interface to the underlying RPC descriptors and methods.

Direct Known Subclasses

SynchronizedClient

Defined Under Namespace

Modules: Errors Classes: Error, ErrorFactory

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Loggable

#logger

Constructor Details

#initialize(service:, options: {}, client_options: {}) ⇒ Client

Initialize the client and setup the stub

Options Hash (options:):

  • :password (String)

    The password for basic authentication for the service.

  • :hostname (String)

    The hostname of the service. Defaults to linkerd.



55
56
57
58
59
60
61
62
63
64
# File 'lib/gruf/client.rb', line 55

def initialize(service:, options: {}, client_options: {})
  @base_klass = service
  @service_klass = "#{base_klass}::Service".constantize
  @opts = options || {}
  @opts[:password] = options.fetch(:password, '').to_s
  @opts[:hostname] = options.fetch(:hostname, Gruf.default_client_host)
  @error_factory = Gruf::Client::ErrorFactory.new
  client = "#{service}::Stub".constantize.new(@opts[:hostname], build_ssl_credentials, client_options)
  super(client)
end

Instance Attribute Details

#base_klassClass (readonly)



40
41
42
# File 'lib/gruf/client.rb', line 40

def base_klass
  @base_klass
end

#optsHash (readonly)



44
45
46
# File 'lib/gruf/client.rb', line 44

def opts
  @opts
end

#service_klassClass (readonly)



42
43
44
# File 'lib/gruf/client.rb', line 42

def service_klass
  @service_klass
end

Instance Method Details

#call(request_method, params = {}, metadata = {}, opts = {}, &block) ⇒ Gruf::Response

Call the client’s method with given params

for the given above call error type that was returned

Raises:

  • (Gruf::Client::Error|GRPC::BadStatus)

    If an error occurs, an exception will be raised according to the



78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/gruf/client.rb', line 78

def call(request_method, params = {},  = {}, opts = {}, &block)
  request_method = request_method.to_sym
  req = streaming_request?(request_method) ? params : request_object(request_method, params)
  md = ()
  call_sig = call_signature(request_method)

  raise NotImplementedError, "The method #{request_method} has not been implemented in this service." unless call_sig

  resp, operation = execute(call_sig, req, md, opts, &block)

  raise @error_factory.from_exception(resp.result) unless resp.success?

  Gruf::Response.new(operation: operation, message: resp.result, execution_time: resp.time)
end

#timeoutInteger|NilClass

Returns the currently set timeout on the client stub



98
99
100
# File 'lib/gruf/client.rb', line 98

def timeout
  __getobj__.instance_variable_get(:@timeout)
end