[关闭]
@yanglfyangl 2018-05-30T11:46:44.000000Z 字数 1839 阅读 508

支持引擎之 -- 第三方Http调用服务

简介

  • 主要是为了更有效的提高调用第三方的效率。(一般调用第三方都需要秒级的返回,所以通过强制异步的方式来降低业务端等待造成的并发上不去的问题)
  • 内部封装okHttp框架。
  • 利用Redis/队列 的发布订阅机制来最大化的降低对服务器性能的影响。

需要支持的功能主要有:

  • 账号、Token等管理;
  • 支持异步调用;
  • 支持批量调用;
  • 方便的参数设置;
  • 支持资源调度。
  • 调用数量控制。(很多调用第三方都有限制的,超过限制会报错)

对于资源调度、安全策略、调用数量等,可以放到后期再来支持。

调用流程

如果使用队列的话

Created with Raphaël 2.1.2其它服务其它服务thirdQueryClientthirdQueryClient队列队列thirdQueryServerthirdQueryServer外部外部buildParm()startAsync()入队,并监听通知通知建立连接并请求。异步返回结果入队通知OnSuccess(RespondData)OnError(ErrorMessage)

也可以直接使用Spring Boot 或 Dubbo的异步模式;

Created with Raphaël 2.1.2其它服务其它服务thirdQueryClientthirdQueryClientthirdQueryServerthirdQueryServer外部外部buildParm()startAsync()调用建立连接并请求。异步返回异步返回OnSuccess(RespondData)OnError(ErrorMessage)

API定义

  1. // 这样不需要每个人都知道各种token等信息,由服务端统一管理
  2. Class QueryType {
  3. RongYun
  4. QiNiu
  5. ...
  6. }
  7. interface QueryCallBack{
  8. void onSucess(RespondData);
  9. void onError(RespondError);
  10. }
  11. class ThirdQueryReuqst:{
  12. public boolean ;
  13. public QueryType queryType;
  14. public void addPara(String key, String value);
  15. public void resetPara();
  16. }
  17. class ThirdQueryClient:{
  18. public ThirdQueryClient init(...);
  19. //将request放进去,返回一个RequestID,可以用这个ID来做判断。
  20. public String putRequst(ThirdQueryReuqst request);
  21. //返回对应的requestID 列表。
  22. public List<String> putRequsts(List<ThirdQueryReuqst> list);
  23. public Boolean startExcute(QueryCallBack callback);
  24. public void stop();
  25. }

服务端

  1. class ThirdQueryService:{
  2. }

示例代码

  1. List<String, Object> requestList;
  2. ThirdQueryClient client;
  3. client.init(QueryType.RongYun);
  4. client.asyncExcute(new QueryCallBack(){
  5. void onSucess(RespondData){
  6. String requestID = RespondData.requestID();
  7. data = requestList.get(requestID)
  8. 拿着数据进行处理
  9. ...
  10. ...
  11. requestList.remove(requestID);
  12. }
  13. void onError(RespondError){
  14. String requestID = RespondData.requestID();
  15. data = requestList.get(requestID)
  16. 拿着数据进行处理
  17. ...
  18. ...
  19. requestList.remove(requestID);
  20. }
  21. });
  22. //下面的方法可以在任何方法中做;
  23. ThirdQueryReuqst request = new ThirdQueryReuqst(QueryType.RongYun);
  24. String requestID = client.putRequst(request);
  25. requestList.push(requestID, Data); //data可以是asyncFuture等。
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注