中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

使用springboot整合dubbo設置全局唯一ID進行日志追蹤的方法

發布時間:2020-10-27 14:49:17 來源:億速云 閱讀:306 作者:Leah 欄目:開發技術

使用springboot整合dubbo設置全局唯一ID進行日志追蹤的方法?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

1.新建項目

使用springboot整合dubbo設置全局唯一ID進行日志追蹤的方法

利用idea創建一個父項目,三個子項目,其中一個項目為生產者,一個項目為消費者,一個為接口等公共服務項目,生產者和消費者需要有web依賴,可以作為tomcat容器啟動。

2.項目依賴

<dependencies>
    <dependency>
      <groupId>org.apache.dubbo</groupId>
      <artifactId>dubbo-spring-boot-starter</artifactId>
      <version>2.7.6</version>
    </dependency>

    <!-- zk的依賴 -->
    <dependency>
      <groupId>org.apache.dubbo</groupId>
      <artifactId>dubbo-dependencies-zookeeper</artifactId>
      <version>2.7.6</version>
      <type>pom</type>
      <exclusions>
        <exclusion>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-aop</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
    </dependency>

3.在facade項目中新建接口

使用springboot整合dubbo設置全局唯一ID進行日志追蹤的方法

4.編寫生產者

4.1 增加dubbo配置

server.port=8081
dubbo.registry.address=zookeeper://localhost:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.registry.timeout=30000
dubbo.application.name=dubbo-provider-ll

4.2 編寫生產者dubbo filter

public class ProviderFilter implements Filter {
  @Override
  public Result invoke(Invoker<&#63;> invoker, Invocation invocation) throws RpcException {
    Object threadName= invocation.getAttachment("ThreadName");
    if(null!=threadName){
      Thread thread = Thread.currentThread();
      thread.setName(threadName.toString());
    }
    return invoker.invoke(invocation);
  }
}

注意:此處Filter 是dubbo的filter,不是servlet的filter

這里代碼的目的是將從消費端傳來的線程名稱設置為線程名稱

在resources目錄下新建META-INF/dubbo/com.alibaba.dubbo.rpc.Filter 文件
即新增目錄META-INF/dubbo和文件 com.alibaba.dubbo.rpc.Filter

在文件中增加,等號后面為實現dubbo filter的實現類路徑
providerFilter=com.dubbo.spring.provider.filter.ProviderFilter

4.3編寫dubbo生產者實現類

@Service(filter = {"providerFilter"})
public class DemoServiceImpl implements IDemoService {
  public Logger LOGGER= LoggerFactory.getLogger(DemoServiceImpl.class);
  @Override
  public String getName() {
    LOGGER.info("provider ThreadName : "+Thread.currentThread().getName());
    return "dubbo-test";
  }
}

5.編寫消費者

5.1編寫消費者filter

public class DubboFilter implements Filter {
  @Override
  public Result invoke(Invoker<&#63;> invoker, Invocation invocation) throws RpcException {
    String name = Thread.currentThread().getName();
    invocation.setAttachment("ThreadName",name);
    return invoker.invoke(invocation);
  }
}

此處是將線程名稱放入到attachment中,attachment底層是hashmap,后續使用dubbo請求生產者時,會把attachment給到生產者,故在生產中中可以通過key ThreadName來獲取消費者端的線程名稱
在resources目錄下新建META-INF/dubbo/com.alibaba.dubbo.rpc.Filter 文件
即新增目錄META-INF/dubbo和文件 com.alibaba.dubbo.rpc.Filter

在文件中增加,等號后面為實現dubbo filter的實現類路徑
consumerFilter=com.dubbo.spring.consumer.filter.DubboFilter

5.2 編寫response對象

public class Response implements Serializable {

  private static final long serialVersionUID = -3186818832535757509L;
  private String code;

  private String message;

  private Object result;

  private String index;

  public String getCode() {
    return code;
  }

  public void setCode(String code) {
    this.code = code;
  }

  public String getMessage() {
    return message;
  }

  public void setMessage(String message) {
    this.message = message;
  }

  public Object getResult() {
    return result;
  }

  public void setResult(Object result) {
    this.result = result;
  }

  public String getIndex() {
    return index;
  }

  public void setIndex(String index) {
    this.index = index;
  }
}

此response為web端返回到頁面統一對象

5.3 編寫aop切面

@Aspect
@Component
public class AopContext {

  @Before("execution(* com.dubbo.spring..*.*(..))")
  public void before(){
    Thread thread = Thread.currentThread();
    thread.setName(UUIDUtil.getUUID());
  }
  @Around("execution(* com.dubbo.spring..*.*(..))")
  public Object around(ProceedingJoinPoint pjp){
    Response response=new Response();
    try {
      Object proceed = pjp.proceed();
      if(proceed instanceof Response){
         response=(Response) proceed;
        response.setIndex(Thread.currentThread().getName());
      }
    } catch (Throwable throwable) {
      throwable.printStackTrace();
    }
    return response;
  }
}

1.before是在請求進入時給線程設置名稱,為隨機生成的uuid
2.around是環繞通知,在執行完之后,在返回的結果中將線程名稱設置進去,便于以后異常追蹤

5.4 編寫web

@RestController
public class WebController {

  private Logger LOGGER= LoggerFactory.getLogger(WebController.class);

  @Reference(filter = {"consumerFilter"})
  private IDemoService iDemoService;

  @GetMapping("/getName")
  public Response getName(){
    LOGGER.info("consumer ThreadName : "+Thread.currentThread().getName());
    String name = iDemoService.getName();
    Response response=new Response();
    response.setResult(name);
    response.setCode("1001");
    response.setMessage("success");
    return response;
  }
}

請求結果

使用springboot整合dubbo設置全局唯一ID進行日志追蹤的方法

此處為postman響應的,index 為1ca55cb7a17148879923265b89102ccf

生產者線程名稱:

使用springboot整合dubbo設置全局唯一ID進行日志追蹤的方法

消費者線程名稱:

使用springboot整合dubbo設置全局唯一ID進行日志追蹤的方法

可以看到從web頁面到生產者,消費者,都有一個全局唯一id進行貫穿,如果在web頁面提示有異常時,可以通過這個uuid進行日志追蹤

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

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

AI

西乌珠穆沁旗| 启东市| 调兵山市| 河池市| 鄢陵县| 内乡县| 连城县| 临江市| 达孜县| 宜阳县| 宿迁市| 临汾市| 沅陵县| 北川| 资源县| 五大连池市| 治多县| 乐陵市| 滦平县| 安阳县| 鹤山市| 临清市| 洛宁县| 嵊州市| 沈阳市| 连南| 宜川县| 宁河县| 扬州市| 金平| 砚山县| 望谟县| 邛崃市| 普陀区| 民勤县| 蓝山县| 辽中县| 桂林市| 兴和县| 清远市| 二手房|