部署Kafka+ZK及其日誌採集實戰(系統版本:linux_CentOs_7.8)

来源:https://www.cnblogs.com/xietingwei/archive/2023/08/19/17642448.html
-Advertisement-
Play Games

- 部署ZK ``` docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper ``` - 部署Kafka ``` docker run -d --name xdclass_kafka \ -p 9092:9092 \ ...


  • 部署ZK

    docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper
    
  • 部署Kafka

    	docker run -d --name xdclass_kafka \
    	-p 9092:9092 \
    	-e KAFKA_BROKER_ID=0 \
    	--env KAFKA_HEAP_OPTS=-Xmx256M \
    	--env KAFKA_HEAP_OPTS=-Xms128M \
    	-e KAFKA_ZOOKEEPER_CONNECT=[內網ip]:2181 \
    	-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://[外網ip]:9092 \
    	-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka:2.13-2.7.0
    
  • 採用Slf4j採集日誌(lombok)

  • 需求

    • 控制台輸出訪問日誌,方便測試
    • 業務數據實際輸出到kafka
    • 常用的框架 log4j、logback、self4j等
  • log4j、logback、self4j 之間有啥關係

    • SLF4J(Simple logging Facade for Java) 門面設計模式 |外觀設計模式

      • 把不同的日誌系統的實現進行了具體的抽象化,提供統一的日誌使用介面

      • 具體的日誌系統就有log4j,logback等;

      • logback也是log4j的作者完成的,有更好的特性,可以取代log4j的一個日誌框架, 是slf4j的原生實現

      • log4j、logback可以單獨的使用,也可以綁定slf4j一起使用

    • 編碼規範建議不直接用log4j、logback的API,應該用self4j, 日後更換框架所帶來的成本就很低

  • 依賴引入

    <!-- 代碼自動生成依賴 end-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <!--Springboot項目整合spring-kafka依賴包配置-->
    <dependency>
        <groupId>org.springframework.kafka</groupId>
        <artifactId>spring-kafka</artifactId>
    </dependency>
    
  • kafka配置application.properties

    #----------kafka配置--------------
    spring.kafka.bootstrap-servers=[外網ip]:9092
    spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
    spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
    
  • logback.xml配置

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <property name="LOG_HOME" value="./data/logs/link" />
    
        <!--採用列印到控制台,記錄日誌的方式-->
        <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n</pattern>
            </encoder>
        </appender>
    
        <!-- 採用保存到日誌文件 記錄日誌的方式-->
        <appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${LOG_HOME}/link.log</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${LOG_HOME}/link-%d{yyyy-MM-dd}.log</fileNamePattern>
            </rollingPolicy>
            <encoder>
                <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n</pattern>
            </encoder>
        </appender>
    
    
        <!-- 指定某個類單獨列印日誌 -->
        <logger name="net.xdclass.service.impl.LogServiceImpl"
                level="INFO" additivity="false">
            <appender-ref ref="rollingFile" />
            <appender-ref ref="console" />
        </logger>
    
        <root level="info" additivity="false">
            <appender-ref ref="console" />
        </root>
    
    </configuration>
    
  • LogServiceImpl

    @Service
    @Slf4j
    public class LogServiceImpl implements LogService {
    	
    	// Kafka:topic
        private static final String TOPIC_NAME = "ods_link_visit_topic";
    
        @Autowired
        private KafkaTemplate kafkaTemplate;
    
        /**
         * 記錄日誌
         *
         * @param request
         * @param shortLinkCode
         * @param accountNo
         * @return
         */
        @Override
        public void recodeShortLinkLog(HttpServletRequest request, String shortLinkCode, Long accountNo) {
            // ip、 瀏覽器信息
            String ip = CommonUtil.getIpAddr(request);
            // 全部請求頭
            Map<String, String> headerMap = CommonUtil.getAllRequestHeader(request);
    
            Map<String,String> availableMap = new HashMap<>();
            availableMap.put("user-agent",headerMap.get("user-agent"));
            availableMap.put("referer",headerMap.get("referer"));
            availableMap.put("accountNo",accountNo.toString());
    
            LogRecord logRecord = LogRecord.builder()
                    //日誌類型
                    .event(LogTypeEnum.SHORT_LINK_TYPE.name())
                    //日誌內容
                    .data(availableMap)
                    //客戶端ip
                    .ip(ip)
                    // 時間
                    .ts(CommonUtil.getCurrentTimestamp())
                    //業務唯一標識(短鏈碼)
                    .bizId(shortLinkCode).build();
    
            String jsonLog = JsonUtil.obj2Json(logRecord);
    
            //列印日誌 in 控制台
            log.info(jsonLog);
    
            // 發送kafka
            kafkaTemplate.send(TOPIC_NAME,jsonLog);
    
        }
    }
    
  • kafka命令

    ```
    創建topic
    ./kafka-topics.sh --create --zookeeper 172.17.0.1:2181 --replication-factor 1 --partitions 1 --topic ods_link_visit_topic
    
    查看topic
    ./kafka-topics.sh --list --zookeeper 172.17.0.1:2181
    
    刪除topic
    ./kafka-topics.sh --zookeeper 172.17.0.1:2181 --delete --topic ods_link_visit_topic
    
    消費者消費消息
    ./kafka-console-consumer.sh --bootstrap-server 192.168.75.146:9092 --from-beginning --topic ods_link_visit_topic
    
    生產者發送消息
    ./kafka-console-producer.sh --broker-list 192.168.75.146:9092  --topic ods_link_visit_topic
    ```
    
    
  • 測試

    @Controller
    @Slf4j
    public class LinkApiController {
        @Autowired
        private ShortLinkService shortLinkService;
    
        @Autowired
        private LogService logService;
    
    
        @GetMapping(path = "/test")
        public void dispatch(HttpServletRequest request, HttpServletResponse response) {
    
            logService.recodeShortLinkLog(request, shortLinkCode, shortLinkVO.getAccountNo());
            
        }
    
    

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 轉載請標明出處,維權必究: https://www.cnblogs.com/tangZH/p/12900387.html Glide源碼解析一,初始化 Glide源碼解析二—into方法 Glide源碼解析三(註冊組件) Glide源碼解析四(解碼和轉碼) Glide自定義組件註冊 通過Glide加 ...
  • > Vue2.x使用EventBus進行組件通信,而Vue3.x推薦使用`mitt.js`。 > > > 比起Vue實例上的`EventBus`,`mitt.js`好在哪裡呢?首先它足夠小,僅有200bytes,其次支持全部事件的監聽和批量移除,它還不依賴Vue實例,所以可以跨框架使用,React或 ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202308/3076680-20230817140634376-621525736.png) # 1. 康威定律 ## 1.1. 梅爾文·康威 ### 1.1.1. Melvin Conway ### 1.1 ...
  • 這篇文章總結了常用的架構圖類型,可以借鑒筆者提供的模板,快速地產出符合業務需要的架構圖。 為什麼要畫好一幅架構圖?一幅漂亮的架構圖既是創作者的深度結構化思考和表達,對於讀者來說也更加容易理解架構所要表達的意思。 然而不擅長畫圖的程式員,在大腦里已經有了思路,如何快速能夠產出精美的架構圖呢?這篇文章幫 ...
  • [TOC] # 本篇前瞻 歡迎來go語言的基礎篇,這裡會幫你梳理一下go語言的基本類型,註意本篇有參考[go聖經](https://gopl-zh.github.io/),如果你有完整學習的需求可以看一下。另外,go語言的基本類型比較簡單,介紹過程就比較粗暴,不過我們需要先從一個例題開始。 # Le ...
  • - LogServiceImpl ``` @Service @Slf4j public class LogServiceImpl implements LogService { private static final String TOPIC_NAME = "ods_link_visit_topi ...
  • 本文通過簡單的示例代碼和說明,讓讀者能夠瞭解微服務如何集成RabbitMq 之前的教程 https://www.cnblogs.com/leafstar/p/17641358.html 在這裡我將介紹Centos中通過docker進行安裝RabbitMq 1.首先你已經有一臺可以使用的虛擬機(教程很 ...
  • ## 背景 前段時間開源的 [STC](https://github.com/long-woo/stc) 工具,這是一個將 OpenApi 規範的 Swagger/Apifox 文檔轉換成代碼的工具。可以在上一篇([《OpenApi(Swagger)快速轉換成 TypeScript 代碼 - STC ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...