亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Boot微服務怎么集成fescar解決分布式事務問題

發布時間:2021-02-08 09:38:09 來源:億速云 閱讀:215 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關Spring Boot微服務怎么集成fescar解決分布式事務問題,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

什么是fescar?

關于fescar的詳細介紹,請參閱fescar wiki。

Spring Boot微服務怎么集成fescar解決分布式事務問題

傳統的2PC提交協議,會持有一個全局性的鎖,所有局部事務預提交成功后一起提交,或有一個局部事務預提交失敗后一起回滾,最后釋放全局鎖。鎖持有的時間較長,會對并發造成較大的影響,死鎖的風險也較高。

Spring Boot微服務怎么集成fescar解決分布式事務問題

fescar的創新之處在于,每個局部事務執行完立即提交,釋放本地鎖;它會去解析你代碼中的sql,從數據庫中獲得事務提交前的事務資源即數據,存放到undo_log中,全局事務協調器在回滾的時候直接使用undo_log中的數據覆蓋你提交的數據。

Spring Boot如何集成fescar?

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

  Spring Boot微服務怎么集成fescar解決分布式事務問題

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

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

DataSourceProxy proxy = new DataSourceProxy(dataSource);

然后,你需要創建一個Feign攔截器,把RootContext中的XID(XID用于標識一個局部事務屬于哪個全局事務,需要在調用鏈路的上下文中傳遞)傳遞到上層調用鏈路。

@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);

    }

  }

}

最后,你需要創建一個Http Rest請求攔截器,用于把當前上下文中獲取到的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的集成。

開始使用吧!

首先在項目中初始化兩個Bean:

@Bean

public FescarXidFilter fescarXidFilter(){

  return new FescarXidFilter();

}

 

@Bean

public GlobalTransactionScanner scanner(){

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

  return scanner;

}

然后寫兩個服務,服務A調用服務B,并在A服務的調用方法上打上@GlobalTransactional標簽:

@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);//遠程調用服務B

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

 

  throw new BusinessException("主動報錯");

}

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

啟動事務協調器,sh fescar-server.sh 8091 ~/dksl/git/fescar/data,啟動你的項目,開始測試吧!

last thing

分布式事務作為微服務應用中的老大難問題,在現有的解決方案中,個人認為fescar是目前最輕量并且代價最小的一種解決方案。目前的版本,事務協調器還不能分布式部署,官方給出的路線圖是在三月底會有第一個生產可用版本。讓我們一起參與到fescar的社區中,共同推動fescar生態建設,讓落地微服務不必再擔心分布式事務的問題。

關于“Spring Boot微服務怎么集成fescar解決分布式事務問題”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

左权县| 永修县| 莱西市| 靖西县| 双牌县| 乃东县| 吉安市| 惠安县| 霍林郭勒市| 永昌县| 景洪市| 杭锦旗| 克山县| 昌乐县| 巨鹿县| 牡丹江市| 赫章县| 塔城市| 寿阳县| 东阳市| 晋江市| 福清市| 襄樊市| 吉水县| 铁岭县| 文化| 洪雅县| 米易县| 宁阳县| 土默特左旗| 高台县| 金乡县| 贵溪市| 商洛市| 湖口县| 灵丘县| 大新县| 巴林右旗| 成都市| 泽库县| 兰溪市|