Soul源碼中dubbo和sofa的執行過程

Soul源碼中dubbo和sofa的執行過程

Soul源碼中dubbo的執行過程

  • 首先在 soul-examples-apache-dubbo-service 中依賴的soul-client中ApacheDubboServiceBeanPostProcessor對註解SoulDubboClient了向soul-admin中的 http://localhost:9095/soul-client/dubbo-register 進行了註冊。而此處咱們注意到ApacheDubboServiceBeanPostProcessor並非實現的BeanPostProcessor接口而是實現的ApplicationListener 即Spring上下文刷新的事件
  • 在該對應的接口中執行的是與前文相同的利用Spring的事件處理機制進行的數據同步操做,將數據同步到了網關soul-bootstrap,這一部分,可參考zookeeper的數據同步機制進行了解
  • 緊接着是在客戶端發起對dubbo接口的請求的代理時,soul是如何處理的,處理的邏輯主要是

file

經過泛化調用,調用的其實是zk內的某個service而後異步獲取結果。將結果,封裝到具體的字段中,而後返回給前端前端

整個過程當中對於接口的緩存的處理與http的請求基本相同,從這裏就能夠看出soul的設計的狀況很是好java

Soul源碼中Sofa項目的執行過程

  • 一樣的,第一步仍是經過掃描註解經過依賴的soul-client中SofaServiceBeanPostProcessor對註解SoulDubboClient了向soul-admin中的 http://localhost:9095//soul-client/sofa-register 進行了註冊/soul-client/sofa-register,而這個類中使用的並非與dubbo相同的事件處理器接口,而是與http請求相同的實現了BeanPostProcessor的接口對註解和參數等進行的處理,這是一個須要考慮的點,目前我還不是太清楚,後續須要再深刻了解。
  • 隨後的流程與Http和dubbo的流程基本相同,即在該對應的接口中執行的是與前文相同的利用Spring的事件處理機制進行的數據同步操做,將選擇器規則數據同步到了網關soul-bootstrap,這一部分幾乎全部插件都同樣。
  • 後面一樣的是和dubbo相同的泛化調用的過程,不一樣的是dubbo的泛化調用是異步的調用,而sofa的泛化調用是異步的調用,從這一點上來講,在soul中使用dubbo或許性能更好。
genericService.$invoke(metaData.getMethodName(), pair.getLeft(), pair.getRight());
        return Mono.fromFuture(future.thenApply(ret -> {
            if (Objects.isNull(ret)) {
                ret = Constants.SOFA_RPC_RESULT_EMPTY;
            }
            exchange.getAttributes().put(Constants.SOFA_RPC_RESULT, ret);
            exchange.getAttributes().put(Constants.CLIENT_RESPONSE_RESULT_TYPE, ResultEnum.SUCCESS.getName());
            return ret;
        })).onErrorMap(SoulException::new);

關於ApacheDubboServiceBeanPostProcessor並非實現的BeanPostProcessor接口而是實現的ApplicationListener 的問題

在類中的onApplicationEvent中有對應issue中有對應的https://github.com/dromara/soul/issues/415答疑,主要是上傳的順序跟dubbo暴露的順序問題致使的。使用beanPostProcessor可能致使no provider的狀況。git

歡迎搜索關注本人與朋友共同開發的微信面經小程序【大廠面試助手】和公衆號【微瞰技術】,以及總結的分類面試題https://github.com/zhendiao/JavaInterviewgithub

file
file

相關文章
相關標籤/搜索