Java学习,一文掌握Java之SpringBoot框架学习文集(5)

在这里插入图片描述

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。
🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。
🎉欢迎 👍点赞✍评论⭐收藏

SpringBoot知识专栏学习

SpringBoot知识云集访问地址备注
SpringBoot知识点(1)https://blog.csdn.net/m0_50308467/article/details/135322153SpringBoot专栏
SpringBoot知识点(2)https://blog.csdn.net/m0_50308467/article/details/135323253SpringBoot专栏
SpringBoot知识点(3)https://blog.csdn.net/m0_50308467/article/details/135373512SpringBoot专栏
SpringBoot知识点(4)https://blog.csdn.net/m0_50308467/article/details/135417447SpringBoot专栏
SpringBoot知识点(5)https://blog.csdn.net/m0_50308467/article/details/135435918SpringBoot专栏

文章目录

  • 🏆 学习Java框架之Spring Boot
    • 🔎 Java框架之Spring Boot学习(5)
      • 🍁🍁 01、Spring Boot 中如何处理大文件上传?
      • 🍁🍁 02、Spring Boot 中的安全认证和授权如何实现?
      • 🍁🍁 03、如何在 Spring Boot 中集成 Swagger 文档工具?
      • 🍁🍁 04、Spring Boot 中的缓存机制是如何实现的?
      • 🍁🍁 05、Spring Boot 中如何处理分页查询?
      • 🍁🍁 06、Spring Boot 中如何监控应用的健康状态?
      • 🍁🍁 07、Spring Boot 中如何实现定时任务?
      • 🍁🍁 08、Spring Boot 如何处理多数据源的事务?
      • 🍁🍁 09、如何在 Spring Boot 中集成消息队列?
      • 🍁🍁 10、Spring Boot 如何实现分布式日志追踪?

🏆 学习Java框架之Spring Boot

🔎 Java框架之Spring Boot学习(5)

🍁🍁 01、Spring Boot 中如何处理大文件上传?

在 Spring Boot 中处理大文件上传可以使用 Streaming API 来实现,它可以将上传的文件流直接传递给处理器,而不需要先将整个上传文件保存在内存或磁盘中。这种方法对于处理大的文件上传很有用,因为可以避免耗尽内存或者磁盘空间的问题。

下面是一个使用 Spring Boot 和 Apache Commons FileUpload 库处理大文件上传的例子:

1. 引入依赖

在 Maven 项目中,你需要在 pom.xml 文件中添加以下依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version>
</dependency>

2. 配置上传文件大小限制

application.properties 文件中添加以下配置项:

# 最大上传文件大小 10MB
spring.servlet.multipart.max-file-size=10MB# 最大上传请求大小 10MB
spring.servlet.multipart.max-request-size=10MB

3. 实现文件上传的接口

import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.support.DefaultMultipartHttpServletRequest;import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;@RestController
public class FileUploadController {@PostMapping("/upload")public String upload(HttpServletRequest request) throws IOException, FileUploadException {// 创建文件上传处理器ServletFileUpload fileUpload = new ServletFileUpload();// 获取上传文件的迭代器FileItemIterator iter = fileUpload.getItemIterator(request);while (iter.hasNext()) {FileItemStream item = iter.next();String fieldName = item.getFieldName();InputStream stream = item.openStream();if (item.isFormField()) {System.out.println("Form field " + fieldName + " with value " + stream.toString() + " detected.");} else {// 处理文件流,例如将其保存到磁盘上System.out.println("File field " + fieldName + " with file name " + item.getName() + " detected.");}}return "Upload Success";}@PostMapping("/upload/multipart")public String uploadMultipart(DefaultMultipartHttpServletRequest request) throws IOException, FileUploadException {MultipartFile file = request.getFile("file");String fileName = file.getOriginalFilename();InputStream inputStream = file.getInputStream();// 处理文件流,例如将其保存到磁盘上System.out.println("File " + fileName + " uploaded successfully.");return "Upload Success";}}

上面的代码中提供了两个接口:/upload/upload/multipart,分别演示了如何处理自定义的文件上传请求和使用 Spring Boot 内置的 MultipartFile 完成文件上传。

其中 /upload 接口使用了 Apache Commons FileUpload 库,通过迭代请求参数流的方式处理文件上传请求。/upload/multipart 接口使用了 Spring Boot 内置的 MultipartFile 完成文件上传,DefaultMultipartHttpServletRequest 中已经将文件流封装为了 MultipartFile 类型的对象,可以直接使用相关 API 访问文件的内容和文件名。

🍁🍁 02、Spring Boot 中的安全认证和授权如何实现?

在Spring Boot中,安全认证和授权可以通过Spring Security框架来实现。Spring Security是一个功能强大且易于使用的框架,为应用程序提供了身份验证和授权的支持。

以下是在Spring Boot中实现安全认证和授权的基本步骤:

  1. 添加依赖:在Maven或Gradle配置文件中添加Spring Security的依赖项,以便将其引入到项目中。

  2. 配置Spring Security:创建一个配置类,继承自WebSecurityConfigurerAdapter并覆盖其中的方法来进行自定义配置。例如,你可以设置登录页面、允许访问的URL路径、启用HTTP基本认证等。

  3. 用户认证:你可以使用用户名和密码进行基本的表单登录认证,或者与数据库集成来验证用户凭据。可以通过实现UserDetailsService接口来自定义用户认证逻辑,并将其配置为Spring Security。

  4. 授权访问控制:配置URL路径的访问权限。你可以使用@PreAuthorize@Secured等注释来在方法级别进行授权,或者使用.antMatchers().hasRole()等方法来在配置类中进行全局授权。

  5. 添加安全过滤器:Spring Security提供了一系列过滤器来处理不同类型的安全控制,例如登录认证、注销用户和跨站请求伪造(CSRF)保护等。你可以使用@EnableWebSecurity注释启用默认的安全配置,并可以通过HttpSecurity对象自定义过滤器的行为。

以上是在Spring Boot中实现安全认证和授权的基本步骤。通过使用Spring Security框架,你可以有效地保护你的应用程序,并对用户进行身份验证和授权控制。

当在Spring Boot中实现安全认证和授权时,下面是每个步骤的详细说明:

1. 添加依赖:在你的项目的构建文件(例如Maven或Gradle)中添加Spring Security的依赖项。对于Maven项目,可以在pom.xml文件中添加以下依赖项:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>

2. 配置Spring Security:创建一个配置类,该类继承自WebSecurityConfigurerAdapter,并覆盖其中的方法以自定义配置。可以使用@EnableWebSecurity注解启用Spring Security并自动将配置类注册为Bean。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {// 进行自定义配置}
}

configure(HttpSecurity http)方法中,你可以设置登录页面、允许访问的URL路径、启用HTTP基本认证等。例如,可以配置允许所有用户访问登录页面和静态资源,但要求用户在访问其他路径之前进行身份验证:

@Override
protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/login", "/css/**", "/js/**").permitAll().anyRequest().authenticated().and().formLogin().loginPage("/login").permitAll().and().logout().permitAll();
}

3. 用户认证:可以使用用户名和密码进行基本的表单登录认证,或者与数据库集成来验证用户凭据。可以通过实现UserDetailsService接口来自定义用户认证逻辑,并将其注入到Spring Security中。在configure(AuthenticationManagerBuilder auth)方法中,可以配置用户详细信息来源、密码编码器等。

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}

4. 授权访问控制:配置URL路径的访问权限。你可以使用@PreAuthorize@Secured等注释来在方法级别进行授权,也可以在配置类中使用.antMatchers().hasRole()等方法来进行全局授权。

@Override
protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN").antMatchers("/user/**").hasAnyRole("USER", "ADMIN").antMatchers("/public/**").permitAll().anyRequest().authenticated().and().formLogin().loginPage("/login").permitAll().and().logout().permitAll().and().exceptionHandling().accessDeniedPage("/403");
}

在上面的示例中,/admin/**路径只有具有"ADMIN"角色的用户才能访问,/user/**路径要求用户具有"USER"或"ADMIN"角色,/public/**路径是公开可访问的。

5. 添加安全过滤器:Spring Security提供了一系列过滤器来处理不同类型的安全控制。你可以使用@EnableWebSecurity注解启用默认的安全配置,并可以通过HttpSecurity对象自定义过滤器的行为。

例如,你可以通过覆盖configure(HttpSecurity http)方法来启用CSRF保护、启用HTTP基本认证、配置自定义登录页面等。

@Override
protected void configure(HttpSecurity http) throws Exception {http.csrf().disable() // 禁用 CSRF 保护.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN").antMatchers("/user/**").hasAnyRole("USER", "ADMIN").antMatchers("/public/**").permitAll().anyRequest().authenticated().and().httpBasic() // 启用 HTTP 基本认证.and().formLogin().loginPage("/login").permitAll()

🍁🍁 03、如何在 Spring Boot 中集成 Swagger 文档工具?

在 Spring Boot 中集成 Swagger 文档工具,可以让我们更方便地管理和查看接口信息。以下是集成步骤:

1.添加Swagger2依赖

在pom.xml文件中添加以下Swagger2依赖:

<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>${springfox.version}</version> <!-- 版本号可自定义 -->
</dependency>

2.添加Swagger UI依赖

在pom.xml文件中添加以下Swagger UI依赖:

<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>${springfox.version}</version> <!-- 版本号可自定义 -->
</dependency>

3.创建配置类

创建一个Swagger配置类,设置基本信息和扫描的包路径,代码如下:

@Configuration
@EnableSwagger2
public class SwaggerConfig {@Beanpublic Docket createRestApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select().apis(RequestHandlerSelectors.basePackage("com.example.demo"))//扫描的包.paths(PathSelectors.any()).build();}private ApiInfo apiInfo() {return new ApiInfoBuilder().title("API文档").description("API文档").version("1.0").build();}
}

在这里,我们添加了Swagger2和Swagger UI支持@EnableSwagger2注解,并@Bean添加了创建Docket的方法。Docket是Swagger的API配置类,通过select()方法,我们可以选择特定的接口和实现类扫描。

4.查看Swagger UI

启动应用程序后,在浏览器中输入http://localhost:8080/swagger-ui.html,即可看到Swagger UI页面,可以查看API接口信息和测试API接口。

🍁🍁 04、Spring Boot 中的缓存机制是如何实现的?

在 Spring Boot 中,缓存机制原生支持多种缓存技术,包括 Ehcache、Redis、Caffeine、Guava 等,使用非常方便。下面简单介绍一下 Spring Boot 中的缓存机制实现原理。

在 Spring Boot 中,通过在方法上添加缓存注解,即可开启方法缓存,常用的注解有:

  • @Cacheable:查询方法,在调用前会检查缓存中是否有数据,如果有直接返回缓存数据,否则执行方法并把执行结果缓存起来。
  • @CachePut:更新方法,不论缓存是否存在,方法都会被执行,并把执行结果放入缓存。
  • @CacheEvict:删除方法,删除指定 key 的缓存,或者清空所有缓存。

Spring Boot 中缓存默认使用 ConcurrentHashMap 存放缓存数据,如果需要使用其他缓存技术,只需要在 pom.xml 文件中引入对应缓存的依赖,并在配置文件中配置相关参数即可,例如:

spring:cache:type: redis # 使用 redis 作为缓存,默认的缓存存储将被禁用

当我们使用缓存时,Spring Boot 会先检查缓存中是否存在该条记录,如果存在,则直接返回缓存中的数据,否则去查找数据库。执行完查询操作并返回结果后,将会把查询结果缓存到字典中,下一次查询相同的条件时,将直接返回缓存数据,不再执行查询操作,提高了查询效率。当我们执行增加、更新、删除等操作时,会自动清除对应的缓存数据,以确保数据的正确性和一致性。

综上所述,Spring Boot 中的缓存机制通过使用注解和缓存技术配合实现,大大简化了缓存的使用和维护。

🍁🍁 05、Spring Boot 中如何处理分页查询?

Spring Boot 提供了多种方式处理分页查询,以下是其中几种常用的方式:

1.使用 Spring Data JPA 的分页查询

在 Spring Data JPA 中,可以通过 PageRequest 对象来进行分页查询,代码如下:

Pageable pageable = PageRequest.of(pageNum, pageSize);
Page<User> userPage = userRepository.findAll(pageable);

其中,pageNumpageSize 分别代表第几页和每页查询的数量,userRepository 是继承了 JpaRepository 的接口,通过 findAll 方法实现分页查询,返回类型为 Page 对象。

2.使用 MyBatis 的分页插件

在 MyBatis 中,可以使用第三方的分页插件来实现分页查询,常用的有 PageHelper 插件,代码如下:

PageHelper.startPage(pageNum, pageSize);
List<User> userList = userMapper.selectByExample(example);
PageInfo<User> pageInfo = new PageInfo<>(userList);

其中,PageHelper.startPage 方法表示开始分页,pageNumpageSize 分别代表第几页和每页查询的数量,userMapper 是继承了 Mapper 的接口,通过 selectByExample 方法实现分页查询,返回类型为 List 对象。PageInfo 则是对分页结果进行封装的类,提供了许多对分页数据进行处理的方法。

3.使用 Spring 自带的分页插件

Spring Boot 中内置了一个分页插件,可以通过在 application.propertiesapplication.yml 文件中配置相关参数来实现分页查询。

spring:datasource:url: jdbc:mysql://localhost:3306/testusername: rootpassword: rootjpa:properties:hibernate:dialect: org.hibernate.dialect.MySQL55Dialectopen-in-view: truejackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8redis:host: localhostport: 6379data:pageable:default-page-size: 10 # 每页默认显示条数max-page-size: 50 # 每页最大显示条数

以上是 application.yml 中的一段配置,其中针对分页查询的配置为:

data:pageable:default-page-size: 10max-page-size: 50

表示每页默认显示 10 条记录,最大显示 50 条记录。在使用 PageRequest 进行分页查询时,可以不传入每页显示数量,使用系统默认值即可,代码如下:

Pageable pageable = PageRequest.of(pageNum, pageable.getPageSize());
Page<User> userPage = userRepository.findAll(pageable);

综上所述,Spring Boot 中处理分页查询有多种方式,可以根据具体情况选择最合适的方式来实现。

🍁🍁 06、Spring Boot 中如何监控应用的健康状态?

在 Spring Boot 中,可以使用 Actuator 模块来监控应用的健康状态。Actuator 提供了一系列的 REST 风格的端点(endpoints),用于监控应用的各项指标。

要启用 Actuator 模块,只需在 pom.xml 文件中添加以下依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

添加依赖后,Actuator 默认会添加一系列端点,包括 /actuator/health 端点,用于检查应用的健康状态。

默认情况下,/actuator/health 端点会返回一个 JSON 格式的响应,表示应用的健康状态,例如:

{"status": "UP","components": {"db": {"status": "UP","details": {"database": "H2","result": "OK"}},"diskSpace": {"status": "UP","details": {"total": 107374182400,"free": 50534774384,"threshold": 10485760}}}
}

其中,status 字段表示应用的总体健康状态,components 字段表示各个组件的健康状态。

除了 /actuator/health 端点外,Actuator 还提供了其他一些有用的端点,例如:

  • /actuator/info:用于显示应用的信息。
  • /actuator/metrics:用于显示应用的监控指标。
  • /actuator/beans:用于显示应用中的 Bean 信息。
  • /actuator/mappings:用于显示应用中的请求映射信息。

你可以根据具体需求选择使用哪些端点。默认情况下,这些端点都是开启的,你可以在配置文件中进行配置来关闭或重新命名端点。

以上就是在 Spring Boot 中监控应用健康状态的简单介绍。使用 Actuator 可以方便地查看应用的状态和性能指标,帮助你更好地进行监控和排查问题。

🍁🍁 07、Spring Boot 中如何实现定时任务?

在 Spring Boot 中,可以使用 @EnableScheduling 注解来启用定时任务,并使用 @Scheduled 注解来定义定时任务的执行规则。

首先,在启动类上添加 @EnableScheduling 注解,开启定时任务的支持,例如:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;@SpringBootApplication
@EnableScheduling
public class YourApplication {public static void main(String[] args) {SpringApplication.run(YourApplication.class, args);}
}

然后,在需要执行定时任务的方法上添加 @Scheduled 注解,指定任务的执行规则,例如:

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class ScheduledTasks {@Scheduled(fixedRate = 5000) // 每隔 5 秒执行一次public void task1() {// 执行任务逻辑}@Scheduled(cron = "0 0 12 * * ?") // 每天中午 12 点执行一次public void task2() {// 执行任务逻辑}
}

在上述示例中,task1 方法使用 fixedRate 属性定义了任务的执行频率,每隔 5 秒执行一次。而 task2 方法使用 cron 表达式定义了任务的执行时间规则,表示在每天中午 12 点执行一次。

除了 fixedRatecron 属性外,@Scheduled 注解还支持其他属性,例如:

  • fixedDelay:表示在上一次任务执行完成后,等待指定的时间间隔后再次执行任务。
  • initialDelay:表示在启动后延迟指定的时间后执行任务。
  • zone:指定 cron 表达式中使用的时区。

需要注意的是,定时任务默认是在 Spring Boot 中内置的线程池中执行的。如果需要自定义线程池的配置,可以通过创建一个实现了 SchedulingConfigurer 接口的配置类,并覆盖 configureTasks 方法,在方法内部配置自定义的线程池。

以上就是在 Spring Boot 中实现定时任务的简单介绍。通过 @Scheduled 注解和相应的规则,你可以轻松地定义和管理定时任务的执行。

🍁🍁 08、Spring Boot 如何处理多数据源的事务?

在 Spring Boot 中处理多数据源的事务,可以使用 @Transactional 注解和 JdbcTemplate 以及 TransactionTemplate 进行控制。

首先,需要配置多个数据源和事务管理器。

@Configuration
public class DataSourceConfig {@Bean@Primary@ConfigurationProperties(prefix = "spring.datasource.primary")public DataSource primaryDataSource() {return DataSourceBuilder.create().build();}@Bean@ConfigurationProperties(prefix = "spring.datasource.secondary")public DataSource secondaryDataSource() {return DataSourceBuilder.create().build();}@Bean@Primarypublic PlatformTransactionManager primaryTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Beanpublic PlatformTransactionManager secondaryTransactionManager(@Qualifier("secondaryDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}

在上述配置中,定义了两个数据源 primaryDataSourcesecondaryDataSource,并为它们分别创建了对应的事务管理器 primaryTransactionManagersecondaryTransactionManager

然后,需要使用 @Transactional 注解来标记需要进行事务管理的方法,并指定对应的事务管理器。

@Service
public class UserService {@Autowired@Qualifier("primaryDataSource")private DataSource primaryDataSource;@Autowired@Qualifier("secondaryDataSource")private DataSource secondaryDataSource;@Transactional(transactionManager = "primaryTransactionManager")public void doTransactionWithPrimaryDataSource() {// 使用 primaryDataSource 执行数据库操作}@Transactional(transactionManager = "secondaryTransactionManager")public void doTransactionWithSecondaryDataSource() {// 使用 secondaryDataSource 执行数据库操作}
}

在上述示例中,doTransactionWithPrimaryDataSource 方法使用 primaryDataSource 执行数据库操作,并由 primaryTransactionManager 进行事务管理。而 doTransactionWithSecondaryDataSource 方法则使用 secondaryDataSource 执行数据库操作,并由 secondaryTransactionManager 进行事务管理。

需要注意的是,使用 @Transactional 注解进行事务管理时,需要确保方法所在的类是 Spring 容器管理的 Bean。否则,事务注解将不生效。

如果需要手动控制事务边界,可以使用 TransactionTemplate

@Service
public class UserService {@Autowired@Qualifier("primaryDataSource")private DataSource primaryDataSource;@Autowired@Qualifier("transactionManager")private PlatformTransactionManager transactionManager;public void doTransaction() {TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);transactionTemplate.execute(status -> {try {JdbcTemplate jdbcTemplate = new JdbcTemplate(primaryDataSource);jdbcTemplate.execute("INSERT INTO user ...");// 执行其他数据库操作return null;} catch (Exception e) {status.setRollbackOnly();throw e;}});}
}

在上述示例中,通过 TransactionTemplate 创建事务模板,并使用 execute 方法来执行需要进行事务管理的代码块。

通过上述方式,你可以在 Spring Boot 中处理多数据源的事务,确保数据库操作的一致性和完整性。请根据你的实际需求和业务场景,选择适合的方式来管理多数据源的事务。

🍁🍁 09、如何在 Spring Boot 中集成消息队列?

在Spring Boot中集成Apache RocketMQ消息队列,您可以按照以下步骤进行操作:

1. 导入RocketMQ依赖:在您的pom.xml文件中添加以下依赖:

<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.0</version>
</dependency>

2. 配置RocketMQ连接信息:在application.propertiesapplication.yml文件中配置RocketMQ的连接信息,如下所示:

rocketmq.name-server=your-nameserver-address

3. 创建生产者Producer: 在您的代码中创建一个RocketMQ的生产者,可以使用RocketMQTemplate来发送消息。在您的Java类中添加如下代码:

import org.apache.rocketmq.spring.core.RocketMQTemplate;@Autowired
private RocketMQTemplate rocketMQTemplate;public void sendMessage(String topic, String message) {rocketMQTemplate.convertAndSend(topic, message);
}

4. 创建消费者Consumer:您可以使用注解@RocketMQMessageListener@RocketMQMessageListener来创建RocketMQ的消费者。在您的Java类中添加如下代码:

import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;@RocketMQMessageListener(topic = "your-topic", consumerGroup = "your-group")
public class MyConsumer implements RocketMQListener<String> {@Overridepublic void onMessage(String message) {// 处理收到的消息System.out.println("Received message: " + message);}
}

5. 配置消费者:在application.propertiesapplication.yml文件中配置消费者的相关信息,如下所示:

rocketmq.consumer.group=your-group

这样,您就可以在Spring Boot中成功集成RocketMQ消息队列。

请注意,以上步骤是基于Apache RocketMQ的最新版本2.2.0进行的,您可以根据使用的RocketMQ版本进行相应的调整。另外,确保正确配置RocketMQ的相关信息,如命名服务器地址、主题和消费者组。

🍁🍁 10、Spring Boot 如何实现分布式日志追踪?

在Spring Boot中实现分布式日志追踪,可以使用一种名为"分布式追踪系统"的解决方案。其中,最常见的开源分布式追踪系统是Zipkin和Jaeger。

以下是一个基本的步骤,以在Spring Boot应用程序中集成Zipkin或Jaeger进行分布式日志追踪:

1. 导入依赖:在您的pom.xml文件中添加适当的依赖。对于Zipkin,使用以下依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

对于Jaeger,使用以下依赖:

<dependency><groupId>io.opentracing.contrib</groupId><artifactId>opentracing-spring-jaeger-cloud-starter</artifactId>
</dependency>

2. 配置追踪系统:在application.propertiesapplication.yml文件中,根据您选择的追踪系统添加适当的配置。对于Zipkin,使用以下配置:

spring.zipkin.base-url=http://your-zipkin-server:9411

对于Jaeger,使用以下配置:

spring.jaeger.enable-b3-propagation=true
spring.jaeger.udp-sender.host=your-jaeger-agent
spring.jaeger.udp-sender.port=6831

3. 启用分布式追踪:在启动类中添加@EnableZipkinTracing(对于Zipkin)或@EnableJaeger(对于Jaeger)注解,以启用分布式追踪。

4. 配置日志追踪:如果您想跟踪自定义的方法或请求,可以使用@NewSpan@ContinueSpan注解来标记需要追踪的代码块。

import brave.Tracer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class MyController {@Autowiredprivate Tracer tracer;@GetMapping("/hello")public String hello() {// 创建一个新的追踪try (Span span = tracer.newTrace().name("mySpan").start()) {// 在这里添加需要追踪的代码// 创建子追踪try (Span childSpan = tracer.newChild(span.context()).name("myChildSpan").start()) {// 在这里添加需要追踪的子代码return "Hello World!";} finally {childSpan.finish();}}}
}

这样,您就可以在Spring Boot应用程序中实现分布式日志追踪了。分布式追踪系统将追踪请求的跟踪信息记录在一个集中的存储中,并提供一个用户界面,用于查看和分析请求的流程和性能。

请注意,上述步骤是基于Spring Cloud Sleuth,它是一个与Spring Boot集成的分布式追踪解决方案。您可以根据选择的追踪系统的文档或指南进行适当的配置和使用。

在这里插入图片描述

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

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

相关文章

Java设计模式-模板方法模式

目录 一、豆浆制作问题 二、模板方法模式基本介绍 三、原理类图 四、模板方法模式解决豆浆制作问题 五、模板方法模式的钩子方法 六、模板方法模式在Spring框架应用的源码分析 七、注意事项和细节 一、豆浆制作问题 编写制作豆浆的程序&#xff0c;说明如下 : 1) 制作…

【Docker基础三】Docker安装Redis

下载镜像 根据自己需要下载指定版本镜像&#xff0c;所有版本看这&#xff1a;Index of /releases/ (redis.io) 或 https://hub.docker.com/_/redis # 下载指定版本redis镜像 docker pull redis:7.2.0 # 查看镜像是否下载成功 docker images 创建挂载目录 # 宿主机上创建挂…

swing快速入门(四十)JList、JComboBox实现列表框

注释很详细&#xff0c;直接上代码 新增内容 &#x1f9e7;1.列表的属性设置与选项监听器 &#x1f9e7;2.下拉框的属性设置与选项监听器 &#x1f9e7;3.Box中组件填充情况不符合预期的处理方法 &#x1f9e7;4.LIst向Vector的转化方法 源码&#xff1a; package swing31_40;i…

ReentrantLock底层原理学习一

J.U.C 简介 Java.util.concurrent 是在并发编程中比较常用的工具类&#xff0c;里面包含很多用来在并发场景中使用的组件。比如线程池、阻塞队列、计时器、同步器、并发集合等等。并发包的作者是大名鼎鼎的 Doug Lea。我们在接下来的课程中&#xff0c;回去剖析一些经典的比较…

【数据结构】二叉树的创建和遍历:前序遍历,中序遍历,后序遍历,层次遍历

目录 一、二叉树的定义 1、二叉树的定义 2、二叉树的五种形态 二叉树的子树 &#xff1a; 3、满二叉树与完全二叉树 4、二叉树的性质 5、二叉树的存储结构 1、顺序存储 ​编辑 2、链式存储 二、二叉树的遍历 按照前序序列构建二叉树 1、前 (先) 序遍历(Preorder …

axure rp9添加当前日期、表单添加到中继器

1.[[Now.toLocaleDateString()]] [[Now.toLocaleTimeString()]]当前日期&#xff1a;2024/1/6 13:19:47 2. 输入内容添加到表单&#xff1b; 3.中继器的序号显示&#xff1b; 4. 中继器中添加按钮以及其他的&#xff1b;在中继器中添加动态面板&#xff0c;放入需要添加的按…

计数器的LED显示控制电路图

如图所示&#xff0c;图a中采用十进制七段存储-译码-驱动单元74143,此单元对所有段都有恒流输出。在电压为5V时每段电流约为15~22mA.七段译码器的BCD数据可以由脚17~20上取出。脚22用于进位&#xff0c;即当计数值到9后就为低电平&#xff0c;其余为高电平。利用这个信号可以控…

mysql视图和sql语句

mysql视图和sql语句 一.mysql视图1.数据的虚拟表示&#xff1a;2.简化复杂查询&#xff1a;3.安全性和权限控制&#xff1a;4.逻辑数据组织&#xff1a;5.更新限制&#xff1a;6.视图的创建&#xff1a; 二.mysq语句使用案列 MySQL的视图&#xff08;View&#xff09;是一个虚拟…

图神经网络|5.消息传递的计算方法 6.多层GNN的作用

5.消息传递的计算方法 边的存放方式 注意&#xff0c;在实际的边的实现方式中&#xff0c;并不是以邻接矩阵来进行实现的&#xff0c;这是因为在图的更新中&#xff0c;用邻接矩阵进行更新所占用的时间开销相对大&#xff0c;二是因为领接矩阵占用的空间大&#xff08;N方&am…

每天刷两道题——第七天+第八天

力扣官网 1.1移动零 给定一个数组 n u m s nums nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序&#xff0c;在不复制数组的情况下原地对数组进行操作。 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 代码 def moveZeroea…

《3D数学基础-图形和游戏开发》阅读笔记 | 3D数学基础 (学习中 1.6更新)

文章目录 3D数学基础矢量/向量什么是向量点与矢量的关系 向量基础运算 向量加法向量基础运算 数乘 线性组合 - 坐标系的基如果选择不同的基向量会怎么样&#xff1f;- 张成(Span)的空间三维向量的张成空间线性相关与线性相关 矩阵与线性变换矩阵-几何意义线性变换矩阵乘法与线性…

Linux内核--网络协议栈(一)Socket通信原理和实例讲解

目录 一、引言 二、Socket ------>2.1、socket编程 ------>2.2、Socket的创建 三、收发数据 四、断开连接 五、删除套接字 六、网络 IO 一、引言 本章开始进入linux内核中网络部分的学习,先简单介绍一下socket套接字 二、Socket 一个数据包经由应用程序产生…