链接追踪系列-10.mall-swarm微服务运行并整合elk-上一篇的番外
因为上一篇没对微服务代码很详细地说明,所以在此借花献佛,使用开源的微服务代码去说明如何去做链路追踪。
项目是开源项目,fork到github以及gitee中,然后拉取到本地
后端代码:
https://gitee.com/jelex/mall-swarm.git dev分支
前端管理系统后台代码:
https://gitee.com/jelex/mall-admin-web.git dev分支
呃,因为涉及到部分不宜公开的配置内容,大家有兴趣的可自行网上搜索 mall-swarm项目…
启动后端项目之前准备事项:
- 运行本机docker
启动my-nacos容器
启动ES01容器(此容器不用,转而使用服务器上的 es)
启动kibana-tencent容器(本地mac 上的docker kibana,连接服务器上的es作为存储) - 运行本机mysql
- 运行 redis
- 运行服务器 es服务
- 运行本机logstash服务
见 本机mac安装logstash 篇
logstash配置如下:

input {tcp {mode => "server"host => "0.0.0.0"port => 4560codec => json_linestype => "debug"}tcp {mode => "server"host => "0.0.0.0"port => 4561codec => json_linestype => "error"}tcp {mode => "server"host => "0.0.0.0"port => 4562codec => json_linestype => "business"}tcp {mode => "server"host => "0.0.0.0"port => 4563codec => json_linestype => "record"}
}
filter{if [type] == "record" {mutate {remove_field => "port"remove_field => "host"remove_field => "@version"}json {source => "message"remove_field => ["message"]}}
}
output {elasticsearch {hosts => "101.43.xxx.xx:80"index => "mall-%{type}-%{+YYYY.MM.dd}"user => "logstash_writer"password => "logstash_writer"}
}
运行logstash:
cd Documents/work/logstash-7.17.0/bin
jelex@jelexxudeMacBook-Pro bin % ./logstash -f ../config/logstash-mall-swarm.conf &[1] 29577
运行后端服务:

启动前端项目:管理后台:
先设置node版本:
jelex@jelexxudeMacBook-Pro ~ % nvm current
v12.14.0
jelex@jelexxudeMacBook-Pro ~ % node -v
v12.14.0npm install
。。。
运行:
jelex@jelexxudeMacBook-Pro mall-admin-web % nvm use 12
Now using node v12.14.0 (npm v6.13.4)
jelex@jelexxudeMacBook-Pro mall-admin-web % npm run dev

访问测试:随便点几个功能

查看后端控制台日志:

查看响应头:

查看kibana:

-------------附录-----logback-spring.xml--------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration><!--引用默认日志配置--><include resource="org/springframework/boot/logging/logback/defaults.xml"/><!--使用默认的控制台日志输出实现--><include resource="org/springframework/boot/logging/logback/console-appender.xml"/><!--应用名称--><springProperty scope="context" name="APP_NAME" source="spring.application.name" defaultValue="mall-swarm"/><!--日志文件保存路径--><property name="LOG_FILE_PATH" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/logs}"/><property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/><!--LogStash访问host--><springProperty name="LOG_STASH_HOST" scope="context" source="logstash.host" defaultValue="localhost"/><!--DEBUG日志输出到文件--><appender name="FILE_DEBUG"class="ch.qos.logback.core.rolling.RollingFileAppender"><!--输出DEBUG以上级别日志--><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>DEBUG</level></filter><encoder><!--设置为默认的文件日志格式--><pattern>${FILE_LOG_PATTERN}</pattern><charset>UTF-8</charset></encoder><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!--设置文件命名格式--><fileNamePattern>${LOG_FILE_PATH}/debug/${APP_NAME}-%d{yyyy-MM-dd}-%i.log</fileNamePattern><!--设置日志文件大小,超过就重新生成文件,默认10M--><maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize><!--日志文件保留天数,默认30天--><maxHistory>${LOG_FILE_MAX_HISTORY:-30}</maxHistory></rollingPolicy></appender><!--ERROR日志输出到文件--><appender name="FILE_ERROR"class="ch.qos.logback.core.rolling.RollingFileAppender"><!--只输出ERROR级别的日志--><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><encoder><!--设置为默认的文件日志格式--><pattern>${FILE_LOG_PATTERN}</pattern><charset>UTF-8</charset></encoder><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!--设置文件命名格式--><fileNamePattern>${LOG_FILE_PATH}/error/${APP_NAME}-%d{yyyy-MM-dd}-%i.log</fileNamePattern><!--设置日志文件大小,超过就重新生成文件,默认10M--><maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize><!--日志文件保留天数,默认30天--><maxHistory>${LOG_FILE_MAX_HISTORY:-30}</maxHistory></rollingPolicy></appender><!--DEBUG日志输出到LogStash--><appender name="LOG_STASH_DEBUG" class="net.logstash.logback.appender.LogstashTcpSocketAppender"><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>DEBUG</level></filter><destination>${LOG_STASH_HOST}:4560</destination><encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"><providers><timestamp><timeZone>Asia/Shanghai</timeZone></timestamp><!--自定义日志输出格式--><pattern><pattern>{"project": "mall-swarm","traceId":"%X{traceId}","spanId":"%X{spanId}","level": "%level","line": "%line","service": "${APP_NAME:-}","pid": "${PID:-}","thread": "%thread","class": "%logger","message": "%message","stack_trace": "%exception{20}"}</pattern></pattern></providers></encoder><!--当有多个LogStash服务时,设置访问策略为轮询--><connectionStrategy><roundRobin><connectionTTL>5 minutes</connectionTTL></roundRobin></connectionStrategy></appender><!--ERROR日志输出到LogStash--><appender name="LOG_STASH_ERROR" class="net.logstash.logback.appender.LogstashTcpSocketAppender"><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><destination>${LOG_STASH_HOST}:4561</destination><encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"><providers><timestamp><timeZone>Asia/Shanghai</timeZone></timestamp><!--自定义日志输出格式--><pattern><pattern>{"project": "mall-swarm","traceId":"%X{traceId}","spanId":"%X{spanId}","level": "%level","line": "%line","service": "${APP_NAME:-}","pid": "${PID:-}","thread": "%thread","class": "%logger","message": "%message","stack_trace": "%exception{20}"}</pattern></pattern></providers></encoder><!--当有多个LogStash服务时,设置访问策略为轮询--><connectionStrategy><roundRobin><connectionTTL>5 minutes</connectionTTL></roundRobin></connectionStrategy></appender><!--业务日志输出到LogStash--><appender name="LOG_STASH_BUSINESS" class="net.logstash.logback.appender.LogstashTcpSocketAppender"><destination>${LOG_STASH_HOST}:4562</destination><encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"><providers><timestamp><timeZone>Asia/Shanghai</timeZone></timestamp><!--自定义日志输出格式--><pattern><pattern>{"project": "mall-swarm","traceId":"%X{traceId}","spanId":"%X{spanId}","level": "%level","line": "%line","service": "${APP_NAME:-}","pid": "${PID:-}","thread": "%thread","class": "%logger","message": "%message","stack_trace": "%exception{20}"}</pattern></pattern></providers></encoder><!--当有多个LogStash服务时,设置访问策略为轮询--><connectionStrategy><roundRobin><connectionTTL>5 minutes</connectionTTL></roundRobin></connectionStrategy></appender><!--接口访问记录日志输出到LogStash--><appender name="LOG_STASH_RECORD" class="net.logstash.logback.appender.LogstashTcpSocketAppender"><destination>${LOG_STASH_HOST}:4563</destination><encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"><providers><timestamp><timeZone>Asia/Shanghai</timeZone></timestamp><!--自定义日志输出格式--><pattern><pattern>{"project": "mall-swarm","traceId":"%X{traceId}","spanId":"%X{spanId}","level": "%level","line": "%line","service": "${APP_NAME:-}","class": "%logger","message": "%message"}</pattern></pattern></providers></encoder><!--当有多个LogStash服务时,设置访问策略为轮询--><connectionStrategy><roundRobin><connectionTTL>5 minutes</connectionTTL></roundRobin></connectionStrategy></appender><!--控制框架输出日志--><logger name="org.slf4j" level="INFO"/><logger name="springfox" level="INFO"/><logger name="io.swagger" level="INFO"/><logger name="org.springframework" level="INFO"/><logger name="org.hibernate.validator" level="INFO"/><logger name="com.alibaba.nacos.client.naming" level="INFO"/><root level="DEBUG"><appender-ref ref="CONSOLE"/><appender-ref ref="FILE_DEBUG"/><appender-ref ref="FILE_ERROR"/><appender-ref ref="LOG_STASH_DEBUG"/><appender-ref ref="LOG_STASH_ERROR"/></root><logger name="com.macro.mall.common.log.WebLogAspect" level="DEBUG"><appender-ref ref="LOG_STASH_RECORD"/></logger><logger name="com.macro.mall" level="DEBUG"><appender-ref ref="LOG_STASH_BUSINESS"/></logger>
</configuration>
sleuth 官方reference示例:
TraceFilterConfig
package org.jeecg.config;import brave.Span;
import brave.Tracer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.servlet.Filter;
import javax.servlet.http.HttpServletResponse;/*** @author: sleuth* @Date: 2023/9/11 11:04* @desc:**/
@Configuration
public class TraceFilterConfig {private static final String TRACE_ID = "TraceId";/*** a servlet Filter for non-reactive applications* @param tracer* @return*/@BeanFilter traceIdInResponseFilter(Tracer tracer) {return (request, response, chain) -> {Span currentSpan = tracer.currentSpan();if (currentSpan != null) {HttpServletResponse resp = (HttpServletResponse) response;resp.addHeader(TRACE_ID, currentSpan.context().traceIdString());}chain.doFilter(request, response);};}
}相关文章:
链接追踪系列-10.mall-swarm微服务运行并整合elk-上一篇的番外
因为上一篇没对微服务代码很详细地说明,所以在此借花献佛,使用开源的微服务代码去说明如何去做链路追踪。 项目是开源项目,fork到github以及gitee中,然后拉取到本地 后端代码: https://gitee.com/jelex/mall-swarm.gi…...
用Agent大模型,我发现了Prompt工程师的10大必备技能
随着 AI 如此快速的发展,目前求职市场上已经出现了 AI提示词 岗位。 大家应该跟我一样,对这种新兴岗位充满好奇心,比如:想知道这类岗位目前的需求量、技能要求、薪资情况等等。 这两天我用 Agent 大模型,对AI提示词岗…...
【GraphRAG】微软 graphrag 效果实测
GraphRAG 本文将基于以下来源,对Microsoft GraphRAG分析优缺点、以及示例实测分析。 1. Source 代码仓库: Welcome to GraphRAGhttps://microsoft.github.io/graphrag/ 微软文章1(2024.2.13):GraphRAG: Unlocking…...
十大常用加密软件排行榜|2024企业常用加密软件推荐
在2024年的市场环境中,随着数字化转型的深入和网络威胁的日益复杂,企业对数据安全的重视达到了新高度。加密软件作为保护信息免遭未授权访问和恶意攻击的关键工具,其重要性日益凸显。以下是根据市场反馈和专业评测整理的2024年度十大常用加密…...
lua 游戏架构 之 资源加载 LoaderManager (一)
定义一个 LoaderManager class,用于管理各种资源加载器。它使用了对象池(Object Pool)来优化资源加载器的创建和销毁,从而提高性能 举例定义一个 PrefabLoader --[[Desc: 封装AAS的接口,加载Prefab --]]---alias Pre…...
【人工智能】-- 迁移学习
个人主页:欢迎来到 Papicatch的博客 课设专栏 :学生成绩管理系统 专业知识专栏: 专业知识 文章目录 🍉引言 🍉迁移学习 🍈基本概念 🍍定义 🍌归纳迁移学习(Induct…...
Flink源码学习资料
Flink系列文档脑图 由于源码分析系列文档较多,本人绘制了Flink文档脑图。和下面的文档目录对应。各位读者可以选择自己感兴趣的模块阅读并参与讨论。 此脑图不定期更新中…… 文章目录 以下是本人Flink 源码分析系列文档目录,欢迎大家查阅和参与讨论。…...
HarmonyOS4.0开发-环境配置
鸿蒙应⽤开发快速体验 1.1. 准备开发环境 1.1.1 安装IDE 鸿蒙应⽤开发需要使⽤配套的IDE——HUAWEI DevEco Studio。 DevEco Studio基于IntelliJIDEA Community(IDEA社区版)构建,为鸿蒙应⽤提供了⼀站式开发环境,集成了开发、运⾏…...
GESP CCF C++ 三级认证真题 2024年6月
第 1 题 小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级,那他可以选择的认证语言有()种。 A. 1 B. 2 C. 3 D. 4 第 2 题 下面流程图在yr输入2024时,可以判定yr代表闰年,并输出 2月是29天 &#x…...
华为的热机备份和流量限制
要求: 12,对现有网络进行改造升级,将当个防火墙组网改成双机热备的组网形式,做负载分担模式,游客区和DMZ区走FW4,生产区和办公区的流量走FW5 13,办公区上网用户限制流量不超过100M,…...
Vite的WebSocket
Vite的webSocket SocketJava Socket概述工作原理优势劣势 Java WebSocket概述工作原理代码示例nodeJS WebSocket优势劣势 vite中的WebSocket💫代码示例使用vite进行创建服务器并对Vue实行HMR 总结 Socket Java 中的 Socket 与 WebSocket 都用于网络通信,…...
Vue3项目基于Axios封装request请求
在 Vue 3 的项目开发中,使用 Axios 进行 HTTP 请求是非常常见的作法,为了更方便开发者更高效的进行代码编写和项目的维护,可以通过再次封装 Axios 来实现。 在本文中,博主将详细指导你如何在自己的 Vue 3 项目中使用 Axios 二次封…...
html(抽奖设计)
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>抽奖</title><style type"text/css">* {margin: 0;padding: 0;}.container {width: 800px;height: 800px;border: 1px dashed red;position: absolut…...
Linux·权限与工具(上)
1. shell命令以及运行原理 Linux严格意义上来说是一个操作系统,我们称之为 "核心(kernel)" ,但我们一般的用户不呢个直接使用到核心,因为不会用。所以开发者在核心外面封装了一层 "外壳(shell)" 程序,来与核心…...
成为CMake砖家(2): macOS创建CMake本地文档的app
大家好,我是白鱼。 使用 CMake 的小伙伴, 有的是在 Windows 上, 还有的是在 macOS 上。之前咱们讲了 windows 上查看 cmake 本地 html 文档的方式, 这篇讲讲 macOS 上查看 cmake 本地 html 文档的方法。 1. 问题描述 当使用 CMa…...
基于opencv的图片加水印实现方案
加水印应该是个很常见的需求,但是网上找的代码,都感觉不太完善。记录下自己搞出来的一个方案 水印有几个需求: 中文文字水印文字倾斜满图都是,而不是只有一个地方水印文字所在之处完全展示水印 实现思路 准备水印图 我是这么…...
STM32 IAP 需要关注的一些事
1、首先要知道STM32的程序是如何分布在FLASH中的。 2、升级的时候涉及到两个程序,一个是bootloader,一个是user程序,这两个程序的功能分别的什么作用的? 3、编译的固件是怎么分布的?通过那个配置文件去指导编译器去排布…...
高并发服务器-使用多进程(Multi-Process)实现【C语言】
在上期的socket套接字的使用详解中(socket套接字的使用详解)最后实现的TCP服务器只能处理一个客户端的请求发送,当有其他客户端请求连接时会被阻塞。为了能同时处理多个客户端的连接请求,本期使用多进程的方式来解决。 解决方案步…...
线程控制
对线程的控制思路和进程相似,创建、等待、终止,只需要调用接口就行。但是在Linux下没有线程的概念,因为Linux的设计者认为,线程是一种轻量级的进程,毕竟创建线程只需要创建PCB。因此Linux中使用多线程必须使用第三方pt…...
Spring Data Jpa 原生SQL联表查询返回自定义DTO
Spring Data Jpa 原生SQL联表查询返回自定义DTO 方案一:返回Map 这个就不说了 方案二:实体定义成接口的形式 该方式最直观!!推荐!!! 注意:XxxDto是interface接口,而…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
