链接追踪系列-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);};}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/872934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

密码学原理精解【7】

文章目录 流密码密码体制概述唯吉尼亚密码一、历史与背景二、加密算法三、特点与应用四、破译方法五、原理概述加密过程解密过程注意事项 流密码理论解释一、定义与原理二、特点与优势三、工作原理四、应用实例五、安全性与限制 RC4算法一、算法概述二、算法原理三、算法特点四…

11.FreeRTOS_事件组

事件组概述 事件组的作用&#xff1a; 可以等待某一个事件发生可以等待若干个事件发生可以等待若干个事件中的某一个事件发生 同步点是事件组的另一个使用方式&#xff0c;它可以让多个任务进行阻塞等待&#xff0c;当全部事件完成后&#xff0c;再一起解除任务的阻塞。常常…

【字幕】字幕特效入门

前言 最近两周调研了一下字幕特效的底层程序逻辑&#xff0c;因为工作内容的原因&#xff0c;就分享几个自己找的链接具体细节就不分享了&#xff0c;CSDN也是我的个人笔记&#xff0c;只记录一些简单的内容用于后续自己方便查询&#xff0c;顺便帮助一下正在苦苦查阅资料入门…

【JavaScript脚本宇宙】解锁 JavaScript 二维码/条形码库的指南

JavaScript框架中的二维码与条形码生成库大比拼&#xff1a;选择适合你项目的最佳利器 前言 随着二维码和条形码在商业和日常生活中的广泛应用&#xff0c;为了方便开发人员在各种前端框架和库中集成生成二维码和条形码的功能&#xff0c;出现了多款专门用于在不同JavaScript…

51单片机学习(4)

一、串口通信 1.串口通信介绍 写完串口函数时进行模块化编程&#xff0c;模块化编程之后要对其进行注释&#xff0c;以便之后使用模块化函数&#xff0c;对模块化.c文件中的每一个函数进行注释。 注意&#xff1a;一个函数不能既在主函数又在中断函数中 模式1最常用&#xf…

Elasticsearch与其他系统的集成(如Logstash、Kibana、Beats等):构建强大的数据处理与分析平台

在当今的数据驱动时代&#xff0c;Elasticsearch以其强大的搜索和分析能力&#xff0c;成为了众多企业和项目中的核心组件。然而&#xff0c;Elasticsearch的强大并不止于其本身&#xff0c;其与其他系统的紧密集成&#xff0c;如Logstash、Kibana、Beats等&#xff0c;共同构建…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(十)-服务体验保证的用例

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…

Java前后端分离开发的步骤以及注意事项

在现代Web应用程序开发中&#xff0c;前后端分离是一种常见的架构模式。这种模式将前端&#xff08;用户界面&#xff09;和后端&#xff08;业务逻辑和数据处理&#xff09;分开独立开发和部署&#xff0c;从而提高开发效率、代码的可维护性和团队协作能力。本文将介绍Java前后…

Go语言中的并发

简单介绍go中的并发编程. 涉及内容主要为goroutine, goroutine间的通信(主要是channel), 并发控制(等待、退出). 想查看更多与Go相关的内容, 可以查看我的Go编程栏目 Goroutine 语法 在一个函数调用前加上go即可, go func(). 语法很简单, 可以说是并发写起来最简单的程序语言…

rust编译安卓各个平台so库

安卓studio 安装SDK 和 NDK 所有操作是mac m1 上操作的 NDK 可以在 Android studio 设置里面,搜索sdk &#xff0c;然后看下SDK 位置例如我下面的位置: /Users/admin/Library/Android/sdk/ndkAndroid NDK&#xff08;Native Development Kit&#xff09;生成一个独立的工具链…

Java中锁的全面详解(深刻理解各种锁)

一.Monitor 1. Java对象头 以32位虚拟机位例 对于普通对象,其对象头的存储结构为 总长为64位,也就是8个字节, 存在两个部分 Kclass Word: 其实也就是表示我们这个对象属于什么类型,也就是哪个类的对象.而对于Mark Word.查看一下它的结构存储 64位虚拟机中 而对于数组对象,我…

Java面试题(企业真题)

01.泛型的理解 泛型是Java 5引入的一种特性,它允许程序员在定义类、接口或方法时指定一个或多个类型参数,从而可以在运行时处理各种不同的数据类型,同时保持类型安全。泛型提供了编译时类型检查,消除了强制类型转换的需要,减少了运行时ClassCastException异常的可能性。02…

设计模式使用场景实现示例及优缺点(行为型模式——状态模式)

在一个遥远的国度中&#xff0c;有一个被称为“变幻之城”的神奇城堡。这座城堡有一种特殊的魔法&#xff0c;能够随着王国的需求改变自己的形态和功能。这种神奇的变化是由一个古老的机制控制的&#xff0c;那就是传说中的“状态宝石”。 在变幻之城中&#xff0c;有四颗宝石&…

神经网络中的激活函数举例,它们各自的特点,以及哪个激活函数效果更好,为什么

sigmoid&#xff1a; \(\sigma(x)1/(1e^{-x})\)&#xff1b; 优&#xff1a;将数值压缩到 0 1&#xff0c;导数为 \(\sigma(x)(1-\sigma(x))\) 好算。劣&#xff1a;输出均值非0&#xff08;0.5&#xff09;&#xff0c;梯度消失&#xff08;Gradient vanishing&#xff09;每次…

Java中的迭代器(Iterator)

Java中的迭代器&#xff08;Iterator&#xff09; 1、 迭代器的基本方法2、 迭代器的使用示例3、注意事项4、克隆与序列化5、结论 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;迭代器&#xff08;Iterator&#xff0…

langchain 入门指南(三)- token的计算

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 在上一篇文章中&#xff0c;我们知道了&#xff0c;ChatOpenAI 对象调用 invoke 方法返回的的信息中&#xff0c; 包含了输入的 token 数…

Web开发:四角线框效果(HTML、CSS、JavaScript)

目录 一、实现效果 二、完整代码 三、页面准备 1、页面结构 2、初始样式 3、现有效果 三、线框实现 1、需求分析 2、线框结构 3、线框大小 4、线框位置 5、线框样式 6、移动线框 7、添加过渡效果 8、使用CSS变量 一、实现效果 如下图所示&#xff0c;当鼠标移动…

html 单页面引用vue3和element-plus

引入方式&#xff1a; element-plus基于vue3.0&#xff0c;所以必须导入vue3.0的js文件&#xff0c;然后再导入element-plus自身所需的js以及css文件&#xff0c;导入文件有两种方法&#xff1a;外部引用、下载本地使用 通过外部引用ElementPlus的css和js文件 以及Vue3.0文件 …

光热熔盐储能

长时储能的新赛道上&#xff0c;多种技术正在加速竞逐&#xff0c;谁最有可能成为其中的王者&#xff1f; 液流电池、压缩空气储能、重力储能&#xff1f;储能行业的玩家们通常不会想到的答案是光热熔盐储能。 1 基础的原理 光热发电系统包括太阳能集热、传储热、发电三大模…

DP讨论——适配器、桥接、代理、装饰器模式通用理解

学而时习之&#xff0c;温故而知新。 共性 适配器、桥接、代理和装饰器模式&#xff0c;实现上基本没啥区别&#xff0c;怎么区分&#xff1f;只能从上下文理解&#xff0c;看目的是啥。 它们&#xff0c;我左看上看下看右看&#xff0c;发现理解可以这么简单:都是A类调用B/…