欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Spring Boot微服務(wù)如何集成fescar解決分布式事務(wù)問(wèn)題

 更新時(shí)間:2019年01月30日 11:04:57   作者:Scott Lewis  
這篇文章主要介紹了詳解Spring Boot微服務(wù)如何集成fescar解決分布式事務(wù)問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

什么是fescar?

關(guān)于fescar的詳細(xì)介紹,請(qǐng)參閱fescar wiki。

傳統(tǒng)的2PC提交協(xié)議,會(huì)持有一個(gè)全局性的鎖,所有局部事務(wù)預(yù)提交成功后一起提交,或有一個(gè)局部事務(wù)預(yù)提交失敗后一起回滾,最后釋放全局鎖。鎖持有的時(shí)間較長(zhǎng),會(huì)對(duì)并發(fā)造成較大的影響,死鎖的風(fēng)險(xiǎn)也較高。

fescar的創(chuàng)新之處在于,每個(gè)局部事務(wù)執(zhí)行完立即提交,釋放本地鎖;它會(huì)去解析你代碼中的sql,從數(shù)據(jù)庫(kù)中獲得事務(wù)提交前的事務(wù)資源即數(shù)據(jù),存放到undo_log中,全局事務(wù)協(xié)調(diào)器在回滾的時(shí)候直接使用undo_log中的數(shù)據(jù)覆蓋你提交的數(shù)據(jù)。

Spring Boot如何集成fescar?

我們可以從官方代碼庫(kù)中看到,fescar目前提供的示例是針對(duì)使用dubbo的服務(wù),那Spring Boot的項(xiàng)目如何集成fescar呢?

  

和很多2PC提交協(xié)議(如tx_lcn)的解決方案一樣,fescar也是在數(shù)據(jù)源處做了代理,和事務(wù)協(xié)調(diào)器進(jìn)行通信,來(lái)決定本地事務(wù)是否回滾。所以,第一步,在你的spring boot項(xiàng)目中,首先應(yīng)使用fescar提供的代理數(shù)據(jù)源作為你的數(shù)據(jù)源,例如:

DruidDataSource dataSource = initDataSource(dataSourceProps.get("url").toString(), dataSourceProps.get("username").toString(), dataSourceProps.get("password").toString());

DataSourceProxy proxy = new DataSourceProxy(dataSource);

然后,你需要?jiǎng)?chuàng)建一個(gè)Feign攔截器,把RootContext中的XID(XID用于標(biāo)識(shí)一個(gè)局部事務(wù)屬于哪個(gè)全局事務(wù),需要在調(diào)用鏈路的上下文中傳遞)傳遞到上層調(diào)用鏈路。

@Component

public class RequestHeaderInterceptor implements RequestInterceptor {

  @Override

  public void apply(RequestTemplate template) {

    String xid = RootContext.getXID();

    if(StringUtils.isNotBlank(xid)){

      template.header("Fescar-Xid",xid);

    }

  }

}

最后,你需要?jiǎng)?chuàng)建一個(gè)Http Rest請(qǐng)求攔截器,用于把當(dāng)前上下文中獲取到的XID放到RootContext。

import com.alibaba.fescar.core.context.RootContext;

import org.apache.commons.lang.StringUtils;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.web.filter.OncePerRequestFilter;

 

import javax.servlet.FilterChain;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

 

public class FescarXidFilter extends OncePerRequestFilter {

  protected Logger logger = LoggerFactory.getLogger(FescarXidFilter.class);

 

  @Override

  protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

    String xid = RootContext.getXID();

    String restXid = request.getHeader("Fescar-Xid");

    boolean bind = false;

    if(StringUtils.isBlank(xid)&&StringUtils.isNotBlank(restXid)){

      RootContext.bind(restXid);

      bind = true;

      if (logger.isDebugEnabled()) {

        logger.debug("bind[" + restXid + "] to RootContext");

      }

    }

    try{

      filterChain.doFilter(request, response);

    } finally {

      if (bind) {

        String unbindXid = RootContext.unbind();

        if (logger.isDebugEnabled()) {

          logger.debug("unbind[" + unbindXid + "] from RootContext");

        }

        if (!restXid.equalsIgnoreCase(unbindXid)) {

          logger.warn("xid in change during http rest from " + restXid + " to " + unbindXid);

          if (unbindXid != null) {

            RootContext.bind(unbindXid);

            logger.warn("bind [" + unbindXid + "] back to RootContext");

          }
        }
      }
    }
  }
}

這樣就完成了fescar的集成。

開(kāi)始使用吧!

首先在項(xiàng)目中初始化兩個(gè)Bean:

@Bean

public FescarXidFilter fescarXidFilter(){

  return new FescarXidFilter();

}

 

@Bean

public GlobalTransactionScanner scanner(){

  GlobalTransactionScanner scanner = new GlobalTransactionScanner("fescar-test","my_test_tx_group");

  return scanner;

} 

然后寫(xiě)兩個(gè)服務(wù),服務(wù)A調(diào)用服務(wù)B,并在A服務(wù)的調(diào)用方法上打上@GlobalTransactional標(biāo)簽:

@GlobalTransactional(timeoutMills = 300000, name = "fescar-test-tx")

public void testFescar() throws BusinessException {

  DictionVO dictionVO = new DictionVO();

  dictionVO.setCode("simidatest");

  dictionVO.setValue("1");

  dictionVO.setDesc("simidatest");

  dictionVO.setAppId("sso");

  commonService.createDiction(dictionVO);//遠(yuǎn)程調(diào)用服務(wù)B

  areaMapper.deleteAreaBySysNo(2);//本地事務(wù)

 

  throw new BusinessException("主動(dòng)報(bào)錯(cuò)");

}

最后,兩個(gè)項(xiàng)目中添加application.conf文件,用于告訴客戶端如何與分布式協(xié)調(diào)器通信,官方示例中有這個(gè)文件,就不在此貼代碼啦,application.conf傳送門(mén)

啟動(dòng)事務(wù)協(xié)調(diào)器,sh fescar-server.sh 8091 ~/dksl/git/fescar/data,啟動(dòng)你的項(xiàng)目,開(kāi)始測(cè)試吧!

last thing

分布式事務(wù)作為微服務(wù)應(yīng)用中的老大難問(wèn)題,在現(xiàn)有的解決方案中,個(gè)人認(rèn)為fescar是目前最輕量并且代價(jià)最小的一種解決方案。目前的版本,事務(wù)協(xié)調(diào)器還不能分布式部署,官方給出的路線圖是在三月底會(huì)有第一個(gè)生產(chǎn)可用版本。讓我們一起參與到fescar的社區(qū)中,共同推動(dòng)fescar生態(tài)建設(shè),讓落地微服務(wù)不必再擔(dān)心分布式事務(wù)的問(wèn)題。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringSecurity 自定義表單登錄的實(shí)現(xiàn)

    SpringSecurity 自定義表單登錄的實(shí)現(xiàn)

    這篇文章主要介紹了SpringSecurity 自定義表單登錄的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Java中MapStruct使用方法解析

    Java中MapStruct使用方法解析

    這篇文章主要介紹了Java中MapStruct使用方法解析,接受請(qǐng)求參數(shù)都會(huì)使用一個(gè)vo類,這個(gè)vo類里封裝了所有需要接受的參數(shù),然后對(duì)參數(shù)進(jìn)行業(yè)務(wù)邏輯處理,處理完后會(huì)持久化處理,?使用MapStruct可以快速幫你解決轉(zhuǎn)換工作,需要的朋友可以參考下
    2023-10-10
  • jvm雙親委派 vs 破壞雙親委派理解加載器的權(quán)責(zé)分配

    jvm雙親委派 vs 破壞雙親委派理解加載器的權(quán)責(zé)分配

    這篇文章主要為大家介紹了jvm雙親委派 vs 破壞雙親委派對(duì)比來(lái)理解加載器的權(quán)責(zé)分配,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Springmvc國(guó)際化自動(dòng)配置代碼實(shí)現(xiàn)

    Springmvc國(guó)際化自動(dòng)配置代碼實(shí)現(xiàn)

    這篇文章主要介紹了Springmvc國(guó)際化自動(dòng)配置代碼實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java中數(shù)組越界異常的優(yōu)雅解決方式

    Java中數(shù)組越界異常的優(yōu)雅解決方式

    ?數(shù)組越界報(bào)錯(cuò)通常發(fā)生在嘗試訪問(wèn)數(shù)組中不存在的索引時(shí),這可能導(dǎo)致程序崩潰或異常,這篇文章主要給大家介紹了關(guān)于Java中數(shù)組越界異常的優(yōu)雅解決方式,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • Java中線程死亡的幾種情況實(shí)例分析

    Java中線程死亡的幾種情況實(shí)例分析

    線程是進(jìn)程中的一個(gè)實(shí)體,是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單位,線程自己不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源,但它可與同屬一個(gè)進(jìn)程的其它線程共享進(jìn)程所擁有的全部資源。下面這篇文章主要給大家介紹了Java線程死亡的幾種情況,需要的朋友可以參考下。
    2017-01-01
  • 老生常談java中cookie的使用

    老生常談java中cookie的使用

    下面小編就為大家?guī)?lái)一篇老生常談java中cookie的使用。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • WebSocket無(wú)法注入屬性的問(wèn)題及解決方案

    WebSocket無(wú)法注入屬性的問(wèn)題及解決方案

    這篇文章主要介紹了WebSocket無(wú)法注入屬性的問(wèn)題及解決方法,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • 淺談?dòng)肧pringBoot實(shí)現(xiàn)策略模式

    淺談?dòng)肧pringBoot實(shí)現(xiàn)策略模式

    本文主要介紹了SpringBoot實(shí)現(xiàn)策略模式,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 如何解決Maven打包時(shí)每次都出現(xiàn)Download maven-metadata.xml卡住問(wèn)題

    如何解決Maven打包時(shí)每次都出現(xiàn)Download maven-metadata.xml卡住問(wèn)題

    這篇文章主要介紹了如何解決Maven打包時(shí)每次都出現(xiàn)Download maven-metadata.xml卡住問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評(píng)論