分享

Swift源码分析----swift-proxy实现请求req的转发

tntzbzc 发表于 2014-11-20 15:34:53 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 15703
问题导读



1.controller, path_parts = self.get_controller(req.path)的作用是什么?
2.方法handle_request实现了什么功能?







概述:
这篇博客关注的问题就是:
请求信息如何通过swift-proxy服务实现转发;
这里应用网上找到的一幅图片来看看swift-proxy服务在swift系统中的作用(多谢作者);



    简单说,请求过来之后,通过swift-proxy服务的服务入口点,调用swift-proxy服务上的相关方法,实现通过给定的请求来确定具体要获取的控制器(ObjectController、ContainerController、AccountController),并进一步调用控制器下的具体方法,实现到相应存储服务(Object-server、Container-server、Account-server)的连接,并具体调用相应的方法来实现请求;
下面来看看代码的实现:
  1. def __call__(self, env, start_response):
  2.     """
  3.     调用WSGI服务的入口点;
  4.     """
  5.     try:
  6.         # 获取缓存信息;
  7.         # 在env中获取'swift.cache'的值,如果为none,则报错误提示;
  8.         # 注:env:表示wsgi环境的字典;
  9.             
  10.         if self.memcache is None:
  11.             self.memcache = cache_from_env(env)
  12.             
  13.         req = self.update_request(Request(env))
  14.         return self.handle_request(req)(env, start_response)
  15.     except UnicodeError:
  16.         err = HTTPPreconditionFailed(request=req, body='Invalid UTF8 or contains NULL')
  17.         return err(env, start_response)
  18.     except (Exception, Timeout):
  19.         start_response('500 Server Error',[('Content-Type', 'text/plain')])
  20.         return ['Internal server error.\n']
复制代码



方法handle_request实现了对HTTP传递过来的请求进行具体的处理和执行,来看方法handle_request的实现:
  1. def handle_request(self, req):
  2.     """
  3.     代理服务的入口点;
  4.     对HTTP请求进行具体的处理和执行等操作;
  5.     """
  6.     try:
  7.         self.logger.set_statsd_prefix('proxy-server')
  8.         if req.content_length and req.content_length
  9.             # path_parts = {'object_name': 'ceph9', 'version': 'v1',
  10.             #               'account_name': 'AUTH_2a8cbfbb8ad7411c8465f57311527937',
  11.             #               'container_name': 'testcontainer2'}
  12.                
  13.             p = req.path_info
  14.             if isinstance(p, unicode):
  15.                 p = p.encode('utf-8')
  16.         except ValueError:
  17.             self.logger.increment('errors')
  18.             return HTTPNotFound(request=req)
  19.             
  20.         if not controller:
  21.             self.logger.increment('errors')
  22.             return HTTPPreconditionFailed(request=req, body='Bad URL')
  23.             
  24.         if self.deny_host_headers and req.host.split(':')[0] in self.deny_host_headers:
  25.             return HTTPForbidden(request=req, body='Invalid host header')
  26.             # server_type:不同的类定义了不同的server_type;
  27.             # server_type = 'Object';
  28.             # server_type = 'Account';
  29.             # server_type = 'Base';
  30.             # server_type = 'Container';         
  31.             self.logger.set_statsd_prefix('proxy-server.' + controller.server_type.lower())
  32.             
  33.         # 获取控制器类的实例化对象;
  34.         controller = controller(self, **path_parts)
  35.             
  36.         if 'swift.trans_id' not in req.environ:
  37.             # if this wasn't set by an earlier middleware, set it now
  38.             trans_id = generate_trans_id(self.trans_id_suffix)
  39.             req.environ['swift.trans_id'] = trans_id
  40.             self.logger.txn_id = trans_id
  41.         req.headers['x-trans-id'] = req.environ['swift.trans_id']
  42.         controller.trans_id = req.environ['swift.trans_id']
  43.         self.logger.client_ip = get_remote_client(req)
  44.             
  45.         try:
  46.             # 执行具体控制器类中的指定方法;
  47.             handler = getattr(controller, req.method)
  48.             # req.method = DELETE
  49.             # controller =
  50.             # handler = >            
  51.             getattr(handler, 'publicly_accessible')
  52.         except AttributeError:
  53.             allowed_methods = getattr(controller, 'allowed_methods', set())
  54.             return HTTPMethodNotAllowed(request=req, headers={'Allow': ', '.join(allowed_methods)})
  55.             
  56.         if 'swift.authorize' in req.environ:
  57.             resp = req.environ['swift.authorize'](req)
  58.             if not resp:
  59.                 del req.environ['swift.authorize']
  60.             else:
  61.                 if not getattr(handler, 'delay_denial', None):
  62.                     return resp
  63.         req.environ['swift.orig_req_method'] = req.method
  64.             
  65.         # handler = >
  66.         return handler(req)
  67.     except HTTPException as error_response:
  68.         return error_response
  69.     except (Exception, Timeout):
  70.         self.logger.exception(_('ERROR Unhandled exception in request'))
  71.         return HTTPServerError(request=req)
复制代码



1.controller, path_parts = self.get_controller(req.path)
   根据给定的HTTP的请求路径path获取控制器(ObjectController、ContainerController、AccountController)来处理请求;
2.controller = controller(self, **path_parts)
   获取控制器类的实例化对象;
3.handler = getattr(controller, req.method)
   执行具体控制器类中的指定方法;
4.return handler(req)
   调用相应控制器中具体的方法来对req进行处理;
   接下来将要调用的就是/swift/proxy/controllers/account.py或/swift/proxy/controllers/container.py或/swift/proxy/controllers/obj.py下面的PUT,POST,DELETE,GET,HEAD等方法;然后再在具体的方法中实现到具体存储服务(Object-server、Container-server、Account-server)的连接,继而调用其下具体的PUT,POST,DELETE,GET,HEAD等方法来进行请求req的实现;




没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条