module EnquiryConsul::Breaker

熔断器,主导熔断机制

Public Instance Methods

reassemble_request(request, services) click to toggle source
# File lib/enquiry-consul/breaker.rb, line 20
def reassemble_request(request, services)
  service_name = services.first.ServiceName
  service = EnquiryConsul::Balancer.pick_service(service_name, services)
  uri = URI("http://#{service.ServiceAddress}:#{service.ServicePort}#{request.uri.path}")
  request.instance_variable_set(:@uri, uri)
  request['host'] = uri.host
  request
end
run(request, services, reconnect: 3) click to toggle source
# File lib/enquiry-consul/breaker.rb, line 5
def run(request, services, reconnect: 3)
  # 发送请求
  response = Net::HTTP.start(request.uri.host, request.uri.port, read_timeout: 10) { |http| http.request request }
  # TODO: (zhangjiayuan) 目前为通用判断,今后为不同情况增加不同熔断机制
  raise if response.code != '200'
  response
rescue
  reconnect -= 1
  raise "请求服务失败" if reconnect <= 0
  # 重新组装请求
  request = reassemble_request(request, services)
  sleep(1)
  retry
end