自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

SpringCloud Alibaba微服務實戰(zhàn)之業(yè)務日志組件

開發(fā) 架構
要實現(xiàn)上述的功能我們需要借助SringBoot Starter來實現(xiàn),SpringBoot 的一大優(yōu)勢就是Starter,通過Starter我們可以封裝公共的業(yè)務邏輯以及參數(shù)的初始化,如果你在進行微服務開發(fā),Starter的編寫是一定要掌握的。

 [[399437]]

本文轉載自微信公眾號「JAVA日知錄」,作者單一色調。轉載本文請聯(lián)系JAVA日知錄公眾號。

概述

在單體項目中如果我們需要記錄操作日志一般會通過如下手段實現(xiàn):

  • 建立一個自定義注解,標注業(yè)務操作類型
  • 通過AOP組裝日志實體,完成日志的收集工作

具體實現(xiàn)可以參考如下的文章鏈接:

http://javadaily.cn/articles/2020/05/13/1589330750429.html

但是在微服務架構中我們不可能每個服務都寫一個自定義注解,再寫一個AOP,這很明顯違反了 Don’t repeat yourself 精神。所以這時候我們一般都會建立一個公共的組件,在公共組件中完成日志的收集,后端服務只需要引入這個公共的組件即可。

這就是今天文章的內容,獨立的業(yè)務日志收集組件。

SpringBoot Starter

要實現(xiàn)上述的功能我們需要借助SringBoot Starter來實現(xiàn),SpringBoot 的一大優(yōu)勢就是Starter,通過Starter我們可以封裝公共的業(yè)務邏輯以及參數(shù)的初始化,如果你在進行微服務開發(fā),Starter的編寫是一定要掌握的。

這里我們簡單提一下SpringBoot Starter實現(xiàn)自動化配置的流程

  • spring-boot啟動的時候會找到starterjar包中的resources/META-INF/spring.factories文件,根據(jù)spring.factories文件中的配置,找到需要自動配置的類,xxxAutoConfigure
  • 通過xxxAutoConfigure上的注解@EnableConfigurationProperties將當前模塊的屬性綁定到「Environment」 上(若有)。
  • 通過xxxAutoConfigure中定義的bean自動裝配到IOC容器中。

實戰(zhàn)

過程如下:

首先我們在項目中建立一個starter的module,如cloud-component-logging-starter

編寫配置類SysLogAutoConfigure

  1. @Configuration 
  2. public class SysLogAutoConfigure { 
  3.  
  4.     @Bean 
  5.     public SysLogAspect controllerLogAspect(){ 
  6.         return new SysLogAspect(); 
  7.     } 
  8.  

在SysLogAutoConfigure中我們注入了一個日志切面SysLogAspect,由于日志收集工具不需要額外配置屬性,所以我們也就不需要定義屬性配置類了。

自定義日志注解 SysLog

  1. @Target(ElementType.METHOD) 
  2. @Retention(RetentionPolicy.RUNTIME) 
  3. @Documented 
  4. public @interface SysLog { 
  5.  /** 
  6.   * 日志內容 
  7.   * @return {String} 
  8.   */ 
  9.  String value(); 

定義日志切面 SysLogAspect

  1. @Aspect 
  2. public class SysLogAspect { 
  3.  
  4.     private final Logger log = LoggerFactory.getLogger(this.getClass()); 
  5.  
  6.     @Pointcut("@annotation(com.javadaily.component.logging.annotation.SysLog)"
  7.     public void logPointCut() { 
  8.  
  9.     } 
  10.  
  11.     @Around("logPointCut()"
  12.     public Object around(ProceedingJoinPoint pjp) throws Throwable { 
  13.         MethodSignature signature = (MethodSignature) pjp.getSignature(); 
  14.         Method method = signature.getMethod(); 
  15.        //類名 
  16.         String className = pjp.getTarget().getClass().getName(); 
  17.         //方法名 
  18.         String methodName = signature.getName(); 
  19.      
  20.         SysLog syslog = method.getAnnotation(SysLog.class); 
  21.         //操作 
  22.         String operator =syslog.value(); 
  23.  
  24.         long beginTime = System.currentTimeMillis(); 
  25.  
  26.         Object returnValue = null
  27.         Exception ex = null
  28.         try { 
  29.             returnValue = pjp.proceed(); 
  30.             return returnValue; 
  31.         } catch (Exception e) { 
  32.             ex = e; 
  33.             throw e; 
  34.         } finally { 
  35.             long cost = System.currentTimeMillis() - beginTime; 
  36.             if (ex != null) { 
  37.                 log.error("[class: {}][method: {}][operator: {}][cost: {}ms][args: {}][發(fā)生異常]"
  38.                         className, methodName, operator, pjp.getArgs(), ex); 
  39.             } else { 
  40.                 log.info("[class: {}][method: {}][operator: {}][cost: {}ms][args: {}][return: {}]"
  41.                         className, methodName, operator, cost, pjp.getArgs(), returnValue); 
  42.             } 
  43.         } 
  44.  
  45.     } 

上面的切面表示,對于使用了@SysLog注解的方法自動進行日志收集,將日志輸入到日志文件。

在resource/META-INF目錄下建立spring.factories文件,加載配置類SysLogAutoConfigure

  1. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 
  2. com.javadaily.component.logging.configure.SysLogAutoConfigure 

在微服務中引入日志組件

  1. <dependency> 
  2.     <groupId>com.jianzh5.cloud</groupId> 
  3.     <artifactId>cloud-component-logging-starter</artifactId> 
  4.     <version>1.0.0</version> 
  5. </dependency> 

在需要進行日志收集的方法上添加@SysLog注解

  1. @SysLog("查找用戶"
  2. public ResultData<AccountDTO> getByCode(@PathVariable(value = "accountCode") String accountCode){ 
  3.     log.warn("get account detail,accountCode is :{}",accountCode); 
  4.  
  5.     SecurityUser securityUser = SecurityUtils.getUser(); 
  6.     log.info(securityUser); 
  7.  
  8.     AccountDTO accountDTO = accountService.selectByCode(accountCode); 
  9.     return ResultData.success(accountDTO); 

小結

通過上面7步我們完成了日志收集組件的自定義Starter編寫,這里可能有的同學會問,在 SysLogAutoConfigure類中不是有了 @Configuration和 @Bean注解,這兩個注解不是可以自動加載定義的Bean到IOC容器嗎?為什么還需要通過在spring.factories文件中導入 SysLogAutoConfigure呢?

這是因為springboot項目默認只會掃描本項目下的帶@Configuration注解的類,如果自定義starter,不在本工程中,是無法加載的,所以要配置META-INF/spring.factories配置文件,通過spring.factories來裝載配置類。

 

責任編輯:武曉燕 來源: JAVA日知錄
相關推薦

2021-03-09 09:33:42

網(wǎng)關授權微服務

2021-08-02 09:27:02

微服務接口場景

2021-01-28 10:10:51

微服務后端SpringCloud

2021-04-22 09:31:58

服務器微服務配置

2021-06-09 09:42:50

SpringCloud微服務灰度發(fā)布

2022-04-09 14:45:02

微服務常見概念Spring

2021-03-26 06:01:45

日志MongoDB存儲

2025-03-13 00:55:00

微服務架構系統(tǒng)

2025-03-07 08:57:46

HTTP客戶端框架

2022-04-27 08:23:34

微服務負載均衡

2016-08-25 20:55:19

微服務架構發(fā)布

2016-08-25 21:12:31

微服務架構發(fā)布

2023-12-29 18:53:58

微服務Saga模式

2021-02-04 09:18:20

服務器認證自定義

2021-01-25 15:00:44

微服務分布式日志

2023-02-07 07:43:27

微服務應用框架

2017-09-05 14:05:11

微服務spring clou路由

2024-06-04 10:05:48

微服務網(wǎng)關日志

2025-04-17 02:00:00

2021-05-31 11:22:24

微服務開發(fā)框架
點贊
收藏

51CTO技術棧公眾號