1
This commit is contained in:
142
README.md
142
README.md
@@ -1,142 +0,0 @@
|
|||||||
# LingXiao 项目
|
|
||||||
|
|
||||||
基于 Spring Boot 4 和 Spring Cloud 2025 的微服务架构示例,包含认证授权、API 网关和业务服务模块,支持 Kubernetes 原生部署。
|
|
||||||
|
|
||||||
## 技术栈
|
|
||||||
|
|
||||||
- **Java**: 25
|
|
||||||
- **Spring Boot**: 4.0.2
|
|
||||||
- **Spring Cloud**: 2025.1.1
|
|
||||||
- **构建工具**: Maven
|
|
||||||
- **数据库**: MySQL, Redis
|
|
||||||
- **容器编排**: Kubernetes (Fabric8)
|
|
||||||
- **Web 服务器**: Jetty (auth 模块), Netty (网关和业务服务)
|
|
||||||
- **模板引擎**: Thymeleaf
|
|
||||||
- **安全**: Spring Security OAuth2
|
|
||||||
|
|
||||||
## 项目结构
|
|
||||||
|
|
||||||
```
|
|
||||||
lingxiao/
|
|
||||||
├── auth/ # 认证授权服务
|
|
||||||
├── geteway/ # API 网关
|
|
||||||
├── a-service/ # 业务服务
|
|
||||||
├── k8s/ # Kubernetes 部署配置
|
|
||||||
├── keys/ # 密钥文件
|
|
||||||
├── pom.xml # 父 POM
|
|
||||||
└── mvnw, mvnw.cmd # Maven Wrapper
|
|
||||||
```
|
|
||||||
|
|
||||||
### 模块说明
|
|
||||||
|
|
||||||
#### auth (认证授权服务)
|
|
||||||
- 基于 Spring Boot + Jetty
|
|
||||||
- 集成 Spring Security OAuth2 Authorization Server
|
|
||||||
- 使用 Redis 存储会话和缓存
|
|
||||||
- 支持 MySQL 数据库存储用户信息
|
|
||||||
- 启用 Kubernetes 服务发现 (`@EnableDiscoveryClient`)
|
|
||||||
- 提供 Thymeleaf 模板页面
|
|
||||||
|
|
||||||
#### geteway (API 网关)
|
|
||||||
- 基于 Spring Cloud Gateway (WebFlux)
|
|
||||||
- 集成 OAuth2 资源服务器和客户端
|
|
||||||
- 作为微服务架构的入口点,负责路由、安全认证等
|
|
||||||
|
|
||||||
#### a-service (业务服务)
|
|
||||||
- 基于 Spring Boot WebFlux (响应式)
|
|
||||||
- 使用 `@ImportHttpServices` 导入 HTTP 服务客户端
|
|
||||||
- 示例业务逻辑服务
|
|
||||||
|
|
||||||
## 快速开始
|
|
||||||
|
|
||||||
### 环境要求
|
|
||||||
- JDK 25+
|
|
||||||
- Maven 3.9+
|
|
||||||
- Docker & Kubernetes (可选,用于容器化部署)
|
|
||||||
- MySQL 8.0+ 和 Redis 7.0+ (用于 auth 模块)
|
|
||||||
|
|
||||||
### 构建项目
|
|
||||||
```bash
|
|
||||||
# 使用 Maven Wrapper (推荐)
|
|
||||||
./mvnw clean package -DskipTests
|
|
||||||
|
|
||||||
# 或直接使用 Maven
|
|
||||||
mvn clean package -DskipTests
|
|
||||||
```
|
|
||||||
|
|
||||||
### 运行单个服务
|
|
||||||
```bash
|
|
||||||
# 运行认证服务
|
|
||||||
cd auth
|
|
||||||
../mvnw spring-boot:run
|
|
||||||
|
|
||||||
# 运行网关
|
|
||||||
cd geteway
|
|
||||||
../mvnw spring-boot:run
|
|
||||||
|
|
||||||
# 运行业务服务
|
|
||||||
cd a-service
|
|
||||||
../mvnw spring-boot:run
|
|
||||||
```
|
|
||||||
|
|
||||||
### 使用 Docker 运行
|
|
||||||
```bash
|
|
||||||
# 构建 Docker 镜像
|
|
||||||
docker build -t lingxiao-auth ./auth
|
|
||||||
docker build -t lingxiao-gateway ./geteway
|
|
||||||
docker build -t lingxiao-a-service ./a-service
|
|
||||||
```
|
|
||||||
|
|
||||||
## Kubernetes 部署
|
|
||||||
|
|
||||||
项目已包含 Kubernetes 部署配置 (`k8s/` 目录):
|
|
||||||
|
|
||||||
- `auth-deployment.yaml` - 认证服务部署
|
|
||||||
- `gateway-deployment.yaml` - 网关部署
|
|
||||||
- `a-service-deployment.yaml` - 业务服务部署
|
|
||||||
- `secrets.yaml` - 密钥配置
|
|
||||||
|
|
||||||
### 部署步骤
|
|
||||||
1. 确保已安装 kubectl 并配置 Kubernetes 集群
|
|
||||||
2. 应用配置文件:
|
|
||||||
```bash
|
|
||||||
kubectl apply -f k8s/
|
|
||||||
```
|
|
||||||
|
|
||||||
## 配置说明
|
|
||||||
|
|
||||||
### 数据库配置
|
|
||||||
auth 模块需要 MySQL 和 Redis,配置位于 `auth/src/main/resources/application.properties` (或 application.yml)。
|
|
||||||
|
|
||||||
### 服务发现
|
|
||||||
项目使用 Spring Cloud Kubernetes Fabric8 进行服务发现,各服务会自动注册到 Kubernetes。
|
|
||||||
|
|
||||||
### 安全配置
|
|
||||||
- OAuth2 授权服务器运行在 auth 服务
|
|
||||||
- 网关作为资源服务器验证令牌
|
|
||||||
- 业务服务通过 HTTP 服务客户端调用认证服务
|
|
||||||
|
|
||||||
## 开发指南
|
|
||||||
|
|
||||||
### 添加新模块
|
|
||||||
1. 在父 `pom.xml` 的 `<modules>` 中添加新模块
|
|
||||||
2. 创建模块目录,包含自己的 `pom.xml`
|
|
||||||
3. 继承父 POM:`<parent>` 指向 `com:lingxiao`
|
|
||||||
|
|
||||||
### 代码风格
|
|
||||||
- 使用 Lombok 减少样板代码
|
|
||||||
- 遵循 Spring Boot 最佳实践
|
|
||||||
- 响应式编程使用 WebFlux (网关和业务服务)
|
|
||||||
|
|
||||||
### 测试
|
|
||||||
```bash
|
|
||||||
# 运行所有测试
|
|
||||||
./mvnw test
|
|
||||||
|
|
||||||
# 跳过测试
|
|
||||||
./mvnw clean package -DskipTests
|
|
||||||
```
|
|
||||||
|
|
||||||
## 许可证
|
|
||||||
|
|
||||||
本项目仅供学习参考,请根据实际需求调整使用。
|
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.example.demo001.config;
|
||||||
|
|
||||||
|
import io.opentelemetry.api.OpenTelemetry;
|
||||||
|
import io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender;
|
||||||
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
class InstallOpenTelemetryAppender implements InitializingBean {
|
||||||
|
|
||||||
|
private final OpenTelemetry openTelemetry;
|
||||||
|
|
||||||
|
InstallOpenTelemetryAppender(OpenTelemetry openTelemetry) {
|
||||||
|
this.openTelemetry = openTelemetry;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterPropertiesSet() {
|
||||||
|
OpenTelemetryAppender.install(this.openTelemetry);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package com.example.demo001.config;
|
||||||
|
|
||||||
|
import io.micrometer.tracing.TraceContext;
|
||||||
|
import io.micrometer.tracing.Tracer;
|
||||||
|
import jakarta.annotation.Nullable;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.web.server.ServerWebExchange;
|
||||||
|
import org.springframework.web.server.WebFilter;
|
||||||
|
import org.springframework.web.server.WebFilterChain;
|
||||||
|
import reactor.core.publisher.Mono;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
class TraceIdFilter implements WebFilter {
|
||||||
|
|
||||||
|
private final Tracer tracer;
|
||||||
|
|
||||||
|
TraceIdFilter(Tracer tracer) {
|
||||||
|
this.tracer = tracer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
|
||||||
|
String traceId = getTraceId();
|
||||||
|
|
||||||
|
if (traceId != null) {
|
||||||
|
exchange.getRequest().mutate()
|
||||||
|
.header("X-Trace-Id", traceId)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
return chain.filter(exchange);
|
||||||
|
}
|
||||||
|
|
||||||
|
private @Nullable String getTraceId() {
|
||||||
|
TraceContext context = this.tracer.currentTraceContext().context();
|
||||||
|
return context != null ? context.traceId() : null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,3 +9,23 @@ oauth2:
|
|||||||
client-id: oidc-client
|
client-id: oidc-client
|
||||||
client-secret: secret
|
client-secret: secret
|
||||||
|
|
||||||
|
management:
|
||||||
|
otlp:
|
||||||
|
metrics:
|
||||||
|
export:
|
||||||
|
url: http://192.168.1.14:9090/api/v1/otlp/v1/metrics #Prometheus otlp协议 http地址
|
||||||
|
step: 30s
|
||||||
|
opentelemetry:
|
||||||
|
tracing:
|
||||||
|
export:
|
||||||
|
otlp:
|
||||||
|
endpoint: http://192.168.1.14:4317/v1/traces #Jaeger otlp协议 grpc地址
|
||||||
|
transport: grpc
|
||||||
|
# endpoint: http://localhost:4318/v1/traces
|
||||||
|
# transport: http
|
||||||
|
|
||||||
|
logging:
|
||||||
|
export:
|
||||||
|
otlp:
|
||||||
|
endpoint: http://192.168.1.14:32664/otlp/v1/logs #Loki otlp协议 grpc地址
|
||||||
|
# transport: grpc
|
||||||
|
|||||||
12
a-service/src/main/resources/logback-spring.xml
Normal file
12
a-service/src/main/resources/logback-spring.xml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration>
|
||||||
|
<include resource="org/springframework/boot/logging/logback/base.xml"/>
|
||||||
|
|
||||||
|
<appender name="OTEL" class="io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender">
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="INFO">
|
||||||
|
<appender-ref ref="CONSOLE"/>
|
||||||
|
<appender-ref ref="OTEL"/>
|
||||||
|
</root>
|
||||||
|
</configuration>
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.example.springboot4.config;
|
||||||
|
|
||||||
|
import io.opentelemetry.api.OpenTelemetry;
|
||||||
|
import io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender;
|
||||||
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
class InstallOpenTelemetryAppender implements InitializingBean {
|
||||||
|
|
||||||
|
private final OpenTelemetry openTelemetry;
|
||||||
|
|
||||||
|
InstallOpenTelemetryAppender(OpenTelemetry openTelemetry) {
|
||||||
|
this.openTelemetry = openTelemetry;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterPropertiesSet() {
|
||||||
|
OpenTelemetryAppender.install(this.openTelemetry);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package com.example.springboot4.config;
|
||||||
|
|
||||||
|
import io.micrometer.tracing.TraceContext;
|
||||||
|
import io.micrometer.tracing.Tracer;
|
||||||
|
import jakarta.annotation.Nullable;
|
||||||
|
import jakarta.servlet.FilterChain;
|
||||||
|
import jakarta.servlet.ServletException;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.web.filter.OncePerRequestFilter;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
class TraceIdFilter extends OncePerRequestFilter {
|
||||||
|
|
||||||
|
private final Tracer tracer;
|
||||||
|
|
||||||
|
TraceIdFilter(Tracer tracer) {
|
||||||
|
this.tracer = tracer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
|
||||||
|
String traceId = getTraceId();
|
||||||
|
if (traceId != null) {
|
||||||
|
response.setHeader("X-Trace-Id", traceId);
|
||||||
|
}
|
||||||
|
filterChain.doFilter(request, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
private @Nullable String getTraceId() {
|
||||||
|
TraceContext context = this.tracer.currentTraceContext().context();
|
||||||
|
return context != null ? context.traceId() : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -38,4 +38,24 @@ server:
|
|||||||
port: 9000
|
port: 9000
|
||||||
jetty:
|
jetty:
|
||||||
threads:
|
threads:
|
||||||
max: 1000
|
max: 1000
|
||||||
|
management:
|
||||||
|
otlp:
|
||||||
|
metrics:
|
||||||
|
export:
|
||||||
|
url: http://192.168.1.14:9090/api/v1/otlp/v1/metrics #Prometheus otlp协议 http地址
|
||||||
|
step: 30s
|
||||||
|
opentelemetry:
|
||||||
|
tracing:
|
||||||
|
export:
|
||||||
|
otlp:
|
||||||
|
endpoint: http://192.168.1.14:4317/v1/traces #Jaeger otlp协议 grpc地址
|
||||||
|
transport: grpc
|
||||||
|
# endpoint: http://localhost:4318/v1/traces
|
||||||
|
# transport: http
|
||||||
|
|
||||||
|
logging:
|
||||||
|
export:
|
||||||
|
otlp:
|
||||||
|
endpoint: http://192.168.1.14:32664/otlp/v1/logs #Loki otlp协议 grpc地址
|
||||||
|
# transport: grpc
|
||||||
12
auth/src/main/resources/logback-spring.xml
Normal file
12
auth/src/main/resources/logback-spring.xml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration>
|
||||||
|
<include resource="org/springframework/boot/logging/logback/base.xml"/>
|
||||||
|
|
||||||
|
<appender name="OTEL" class="io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender">
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="INFO">
|
||||||
|
<appender-ref ref="CONSOLE"/>
|
||||||
|
<appender-ref ref="OTEL"/>
|
||||||
|
</root>
|
||||||
|
</configuration>
|
||||||
0
geteway/.gitignore → gateway/.gitignore
vendored
0
geteway/.gitignore → gateway/.gitignore
vendored
0
geteway/mvnw → gateway/mvnw
vendored
0
geteway/mvnw → gateway/mvnw
vendored
0
geteway/mvnw.cmd → gateway/mvnw.cmd
vendored
0
geteway/mvnw.cmd → gateway/mvnw.cmd
vendored
@@ -9,7 +9,9 @@
|
|||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>geteway</artifactId>
|
<artifactId>gateway</artifactId>
|
||||||
|
<name>gateway</name>
|
||||||
|
<description>gateway</description>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.example.geteway.config;
|
||||||
|
|
||||||
|
import io.opentelemetry.api.OpenTelemetry;
|
||||||
|
import io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender;
|
||||||
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
class InstallOpenTelemetryAppender implements InitializingBean {
|
||||||
|
|
||||||
|
private final OpenTelemetry openTelemetry;
|
||||||
|
|
||||||
|
InstallOpenTelemetryAppender(OpenTelemetry openTelemetry) {
|
||||||
|
this.openTelemetry = openTelemetry;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterPropertiesSet() {
|
||||||
|
OpenTelemetryAppender.install(this.openTelemetry);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
package com.example.geteway.config;
|
||||||
|
|
||||||
|
import io.micrometer.core.instrument.Tags;
|
||||||
|
import io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics;
|
||||||
|
import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics;
|
||||||
|
import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics;
|
||||||
|
import io.micrometer.core.instrument.binder.jvm.convention.otel.OpenTelemetryJvmClassLoadingMeterConventions;
|
||||||
|
import io.micrometer.core.instrument.binder.jvm.convention.otel.OpenTelemetryJvmCpuMeterConventions;
|
||||||
|
import io.micrometer.core.instrument.binder.jvm.convention.otel.OpenTelemetryJvmMemoryMeterConventions;
|
||||||
|
import io.micrometer.core.instrument.binder.jvm.convention.otel.OpenTelemetryJvmThreadMeterConventions;
|
||||||
|
import io.micrometer.core.instrument.binder.system.ProcessorMetrics;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.http.server.observation.OpenTelemetryServerRequestObservationConvention;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 指标配置,选择需要的指标
|
||||||
|
*/
|
||||||
|
@Configuration(proxyBeanMethods = false)
|
||||||
|
public class OpenTelemetryConfiguration {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
OpenTelemetryServerRequestObservationConvention openTelemetryServerRequestObservationConvention() {
|
||||||
|
return new OpenTelemetryServerRequestObservationConvention();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
OpenTelemetryJvmCpuMeterConventions openTelemetryJvmCpuMeterConventions() {
|
||||||
|
return new OpenTelemetryJvmCpuMeterConventions(Tags.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
ProcessorMetrics processorMetrics() {
|
||||||
|
return new ProcessorMetrics(List.of(), new OpenTelemetryJvmCpuMeterConventions(Tags.empty()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
JvmMemoryMetrics jvmMemoryMetrics() {
|
||||||
|
return new JvmMemoryMetrics(List.of(), new OpenTelemetryJvmMemoryMeterConventions(Tags.empty()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
JvmThreadMetrics jvmThreadMetrics() {
|
||||||
|
return new JvmThreadMetrics(List.of(), new OpenTelemetryJvmThreadMeterConventions(Tags.empty()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
ClassLoaderMetrics classLoaderMetrics() {
|
||||||
|
return new ClassLoaderMetrics(new OpenTelemetryJvmClassLoadingMeterConventions());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package com.example.geteway.config;
|
||||||
|
|
||||||
|
import io.micrometer.tracing.TraceContext;
|
||||||
|
import io.micrometer.tracing.Tracer;
|
||||||
|
import jakarta.annotation.Nullable;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.web.server.ServerWebExchange;
|
||||||
|
import org.springframework.web.server.WebFilter;
|
||||||
|
import org.springframework.web.server.WebFilterChain;
|
||||||
|
import reactor.core.publisher.Mono;
|
||||||
|
|
||||||
|
|
||||||
|
@Component
|
||||||
|
class TraceIdFilter implements WebFilter {
|
||||||
|
|
||||||
|
private final Tracer tracer;
|
||||||
|
|
||||||
|
TraceIdFilter(Tracer tracer) {
|
||||||
|
this.tracer = tracer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
|
||||||
|
String traceId = getTraceId();
|
||||||
|
|
||||||
|
if (traceId != null) {
|
||||||
|
exchange.getRequest().mutate()
|
||||||
|
.header("X-Trace-Id", traceId)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
return chain.filter(exchange);
|
||||||
|
}
|
||||||
|
|
||||||
|
private @Nullable String getTraceId() {
|
||||||
|
TraceContext context = this.tracer.currentTraceContext().context();
|
||||||
|
return context != null ? context.traceId() : null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -47,4 +47,24 @@ spring:
|
|||||||
client:
|
client:
|
||||||
provider:
|
provider:
|
||||||
spring:
|
spring:
|
||||||
issuer-uri: http://localhost:9000
|
issuer-uri: http://localhost:9000
|
||||||
|
management:
|
||||||
|
otlp:
|
||||||
|
metrics:
|
||||||
|
export:
|
||||||
|
url: http://192.168.1.14:9090/api/v1/otlp/v1/metrics #Prometheus otlp协议 http地址
|
||||||
|
step: 30s
|
||||||
|
opentelemetry:
|
||||||
|
tracing:
|
||||||
|
export:
|
||||||
|
otlp:
|
||||||
|
endpoint: http://192.168.1.14:4317/v1/traces #Jaeger otlp协议 grpc地址
|
||||||
|
transport: grpc
|
||||||
|
# endpoint: http://localhost:4318/v1/traces
|
||||||
|
# transport: http
|
||||||
|
|
||||||
|
logging:
|
||||||
|
export:
|
||||||
|
otlp:
|
||||||
|
endpoint: http://192.168.1.14:32664/otlp/v1/logs #Loki otlp协议 grpc地址
|
||||||
|
# transport: grpc
|
||||||
12
gateway/src/main/resources/logback-spring.xml
Normal file
12
gateway/src/main/resources/logback-spring.xml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration>
|
||||||
|
<include resource="org/springframework/boot/logging/logback/base.xml"/>
|
||||||
|
|
||||||
|
<appender name="OTEL" class="io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender">
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="INFO">
|
||||||
|
<appender-ref ref="CONSOLE"/>
|
||||||
|
<appender-ref ref="OTEL"/>
|
||||||
|
</root>
|
||||||
|
</configuration>
|
||||||
12
pom.xml
12
pom.xml
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<modules>
|
<modules>
|
||||||
<module>auth</module>
|
<module>auth</module>
|
||||||
<module>geteway</module>
|
<module>gateway</module>
|
||||||
<module>a-service</module>
|
<module>a-service</module>
|
||||||
</modules>
|
</modules>
|
||||||
<parent>
|
<parent>
|
||||||
@@ -37,6 +37,16 @@
|
|||||||
<artifactId>spring-boot-starter</artifactId>
|
<artifactId>spring-boot-starter</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.opentelemetry.instrumentation</groupId>
|
||||||
|
<artifactId>opentelemetry-logback-appender-1.0</artifactId>
|
||||||
|
<version>2.21.0-alpha</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-opentelemetry</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.ben-manes.caffeine</groupId>
|
<groupId>com.github.ben-manes.caffeine</groupId>
|
||||||
<artifactId>caffeine</artifactId>
|
<artifactId>caffeine</artifactId>
|
||||||
|
|||||||
Reference in New Issue
Block a user