Spring Boot 使用 Log4j2 将日志数据写入 Syslog

1、概览 日志是每个应用的重要组成部分。在应用中,可以将日志存储在文件或数据库中。除此以外,还可以将日志数据发送到集中式日志管理应用,如 Graylog 或 Syslog。 本文将带你了解如何在 Spring Boot 应用中使用 Log4j2 将日志信息发送到 Syslog 服务器。 2、Log4j2 Log4j2 是 Log4j 的最新版本。它是高性能日志记录的常见选择,并被广泛应用于许多生产应用中。 2.1、Maven 依赖 在 pom.xml 中添加 spring-boot-starter-log4j2 依赖。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> <version>2.5.2</version> </dependency> 要在 Spring Boot 应用中配置 Log4j2,需要从 pom.xml 中的任何 Starter 中排除默认的 Logback 日志框架。 在本文示例项目中,只有 spring-boot-starter-web Starter 依赖。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> 2.2、Log4j2 配置 现在,创建 Log4j2 配置文件。Spring Boot 会在 classpath 中搜索 log4j2-spring.xml 或 log4j2.xml 文件。 在 resource 目录中配置一个示例 log4j2-spring.

在 Spring MVC 中设置 JSON Content Type

1、简介 Content Type 表示请求/响应数据的媒体类型(Media Type)。当 Conroller 收到 Web 请求时,它会根据 Content Type 解析请求数据,然后根据 Content Type 响应数据。目前在 REST 中最流行的 Content Type 就是 JSON。 本文将会带你了解如何在 Spring MVC 中设置请求和响应的 Content Type。 2、@RequestMapping 注解 简而言之,@RequestMapping 是将 Web 请求映射到 Spring Controller 的重要注解。它有各种属性,包括 HTTP 方法、请求参数、Header 和媒体类型。 一般来说,媒体类型分为两类:消费(请求)、生产(响应)。也可以在 Spring 中定义自定义媒体类型。 其目的在于限制 Handler 可消费、生产的媒体类型。 2.1、请求的媒体类型 通过 consumes 属性指定 Controller 可接受的媒体类型,可以有多个。 定义一个简单的端点: @RequestMapping(value = "/greetings", method = RequestMethod.POST, consumes="application/json") public void addGreeting(@RequestBody ContentType type, Model model) { } 如果 Controller 不支持客户端指定的媒体类型,则会返回 HTTP “415 Unsupported Media Type” 错误。

Spring Security 中的 @EnableWebSecurity 和 @EnableGlobalMethodSecurity

1、概览 有时我们需要在 Spring Boot 应用的不同路径上应用多个 Security Filter。 本文将带你了解在 Spring Scurity 中自定义 Security 的两种方法 - 通过使用 @EnableWebSecurity 和 @EnableGlobalMethodSecurity。 本文通过一个简单的应用示例来说明这两者的区别。该应用包含一些管理员(ADMIN)才能访问的资源和一些只有认证了的用户(USER)才能访问的资源以及一些任何人都可以访问、下载的公共资源。 2、Spring Boot 整合 Spring Security 2.1、Maven 依赖 无论采用哪种方法,都需要添加 Spring Boot Stater 依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> 2.2、Spring Boot 自动配置 当 classpath 上存在 Spring Security 时,Spring Boot Security Auto-Configuration 的 WebSecurityEnablerConfiguration 就会激活 @EnableWebSecurity。这会在应用中加载默认的安全配置。 默认的安全配置会激活 HTTP Security Filter 和 Security Filter Chain,并对端点应用 Basic Authentication 认证。 3、保护端点 第一种方式,创建一个 MySecurityConfigurer 类,使用 @EnableWebSecurity 对其进行注解。 @EnableWebSecurity public class MySecurityConfigurer { } 3.

更改 Spring Boot 中 Log4j2 配置文件的默认位置

1、概览 本文将会带你了解如何在 Spring Boot 应用中修改 Log4j2 配置文件的默认位置。 2、通过配置文件更改 默认情况下,把 Log4j2 配置文件(log4j2.xml / log4j2-spring.xml)放在项目的 classpath 或 resources 文件夹中。 可以在 application.properties 中修改该文件的位置: logging.config=/path/to/log4j2.xml 3、通过 VM 参数修改 还可以在运行程序时通过以下 VM 参数来指定 log4j2 的配置文件: -Dlogging.config=/path/to/log4j2.xml 4、编程式配置 最后,还可以通过更改 Spring Boot Application 类,以编程方式配置该文件的位置: @SpringBootApplication public class Application implements CommandLineRunner { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Override public void run(String... param) { // Log4j2 的 Configurator 类 Configurator.initialize(null, "/path/to/log4j2.xml"); } } 这种解决方案有一个缺点:应用启动过程不会使用 Log4j2 输出日志。

Spring 中的 Context Path 与 Servlet Path

1、简介 DispatcherServlet 在 Spring 应用中扮演着重要角色,它为应用提供了一个入口点。Context Path 定义了终端用户访问应用的 URL。 本文将带你了解 Spring 中 Context Path(上下文路径)与 Servlet Path(Servlet 路径)的区别。 2、Context Path 简而言之,Context Path 是访问 Web 应用时使用的名称。它是应用的根路径。默认情况下,Spring Boot 在 ROOT 上下文路径("/")上提供服务。 因此,默认情况下,Spring Boot 应用可以通过 http://localhost:8080/ 访问。 不过,在某些情况下,我们可能需要更改应用的 Context。配置 Context Path 有多种方法,最简单的方式就是通过位于 src/main/resources 文件夹下的 application.properties 进行配置。 server.servlet.context-path=/demo 如上,此时应用的主页为: http://localhost:8080/demo 特别是在把应用部署到外部服务器时,往往需要修改应用的 Context Path,以便于其他一起部署的应用分开来。 3、Servlet Path Servlet Path 表示 DispatcherServlet 的 Path。DispatcherServlet 是一个实际的 Servlet,继承自 HttpSerlvet 。默认值与 Context Path 类似,即(“/”): spring.mvc.servlet.path=/ 在 Boot 的早期版本中,该属性位于 ServerProperties 类中,名称为 server.servlet-path=/。 从 2.

自定义 Apache Kafka Serializer(序列化器)

1、简介 在 Apache Kafka 中传输消息时,客户端和服务器会就使用共同的语法格式达成协议。Apache Kafka 提供了默认的转换器(Converter),如 String 和 Long。同时也支持针对特定用例的自定义序列化器 (Serializer)。 2、Apache Kafka 中的 Serializer 序列化是将对象转换为字节的过程。反序列化则是将字节流转换为对象的逆过程。简而言之,它将内容转换为可读和可解释的信息。 如上所述,Apache Kafka 为几种基本类型提供了默认序列化器,并允许我们实现自定义序列化器: 上图显示了通过网络向 Kafka Topic 发送消息的过程。在此过程中,生产者将消息发送到 Topic 之前,自定义序列化器会将对象转换成字节。同样,它也显示了反序列化器如何将字节转换回对象,以便消费者正确处理。 2.1、自定义 Serializer Apache Kafka 为几种基本类型提供了预置的序列化器和反序列化器: StringSerializer ShortSerializer IntegerSerializer LongSerializer DoubleSerializer BytesSerializer 它也提供了实现自定义序列化器/反序列化器的功能。为了序列化自己的对象,需要实现 Serializer 接口。同样,要创建自定义的反序列化器,需要实现 Deserializer 接口。 这两个接口都有可覆写的方法: configure:用于实现配置细节 serialize / deserialize:这些方法包括自定义序列化和反序列化的实际实现 close:使用该方法关闭 Kafka Session 3、实现自定义 Serializer Kafka 提供了自定义序列化器的功能。可以为消息的 Key 和 Value 实现特定的转换器(Converter)。 3.1、依赖 在 pom.xml 中添加 Kafka Consumer API 依赖: <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>3.4.0</version> </dependency> 3.

Spring Boot 配置 Kafka SSL 双向认证

1、简介 本文将带你了解在 Spring Boot 中如何配置 SSL 认证以连接到 Apache Kafka Broker。 安全套接字层(SSL)实际上已被弃用,自 2015 年起被传输层安全(TLS)所取代。不过,由于历史原因,Kafka(和 Java)仍然使用 “SSL”。 2、SSL 概览 默认情况下,Apache Kafka 以明文形式发送所有数据,且不进行任何身份认证。 首先,可以为 Broker 和客户端之间的加密配置 SSL。默认情况下,这需要使用公钥加密进行单向身份认证,由客户端验证服务器证书。 此外,服务器还可以使用单独的机制(如 SSL 或 SASL)对客户端进行身份认证,从而实现双向身份认证或相互 TLS(mTLS)。基本上,双向 SSL 认证确保客户端和服务器都使用 SSL 证书来认证对方的身份,并在双向上相互信任。 在本文中,Broker 使用 SSL 对客户端进行身份验证,使用 Keystore 和 Truststore 保存证书和密钥。 每个 Broker 都需要自己的 Keystore,其中包含私钥和公共证书。客户端使用其 Truststore 来验证该证书并信任服务器。同样,每个客户端也需要自己的 Keystore,其中包含私钥和公共证书。服务器使用其 Truststore 来验证和信任客户端的证书,并建立安全连接。 Truststore 可以包含一个可以签署证书的证书颁发机构(CA)。在这种情况下,Broker 或客户端会信任由 Truststore 中的 CA 签发的任何证书。这就简化了证书验证,因为添加新客户端或 Broker 无需更改 Truststore。 3、依赖和设置 创建一个简单的 Spring Boot 示例应用,在 pom.xml 中添加 spring-kafka 依赖: <dependency> <groupId>org.

使用 Postman 测试 Spring Websockets API

1、概览 本文将会带你了解如何使用 spring-websockets 创建一个 Websocket 应用,并且使用 Postman 来进行测试。 2、Java WebSocket WebSocket 是 Web 浏览器和服务器之间的一种双向、全双工、持久连接。一旦建立了 WebSocket 连接,该连接就会一直打开,直到客户端或服务器决定关闭该连接。 WebSocket 协议是实现应用处理实时消息的一种方式之一。最常见的替代方案是长轮询(long polling)和服务器推送事件(server-sent events)。每种解决方案都有其优点和缺点。 在 Spring 中使用 WebSockets 的一种方式是使用 STOMP 子协议。不过,本文使用原始 WebSockets,因为到目前为止,Postman 还不支持 STOMP。 3、Postman Postman 是一个用于构建和使用 API 的 API 平台。使用 Postman 时,无需为了测试而编写 HTTP 客户端基础设施代码。相反,可以创建称为集合(collections)的测试套件,并让 Postman 与 API 进行交互。 4、WebSocket 应用 创建一个简单的应用,工作流程如下: 服务器向客户端发送一次性消息 服务器定期向客户端发送消息 从客户端接收消息时,通过日志记录消息并将其发送回客户端 客户端向服务器发送非周期性消息 客户端接收来自服务器的消息并将其输出到日志 程图如下: 5、Spring WebSocket 服务器由两部分组成。Spring WebSocket Event Handler(事件处理器)和 Spring WebSocket 配置。 5.1、Spring WebSocket 配置 在配置类上添加 @EnableWebSocket 注解,可以在 Spring 服务器中启用 WebSocket 支持。

使用 WebClient 上传文件

1、概览 文件上传是现在应用中很常见的需求,从 Spring 5 开始可以通过响应式上传文件。有了响应式编程的加持,能够使用较少的线程和背压(Backpressure)机制,以非阻塞的方式进行上传。 本文将带你了解使用 WebClient(一种非阻塞、响应式的 HTTP 客户端)通过 BodyInserters 上传文件的两种不同方法。WebClient 是名为 Project Reactor 的响应式编程库的一部分。 2、使用 WebClient 上传文件 首先,在项目中添加 spring-boot-starter-webflux 依赖: <dependency> <groupId>org.springframework.boot</groupId>. <artifactId>spring-boot-starter-webflux</artifactId> </dependency> 2.1、上传单个文件 首先,声明上传地址的 URL: URI url = UriComponentsBuilder.fromHttpUrl(EXTERNAL_UPLOAD_URL).build().toUri(); 比方说,在本例中要上传 PDF。因此使用 MediaType.APPLICATION_PDF 作为 ContentType。上传端点会返回一个 HttpStatus。由于只希望得到一个结果,所以将其封装在一个 Mono 中: Mono<HttpStatus> httpStatusMono = webClient.post() .uri(url) .contentType(MediaType.APPLICATION_PDF) .body(BodyInserters.fromResource(resource)) .exchangeToMono(response -> { if (response.statusCode().equals(HttpStatus.OK)) { return response.bodyToMono(HttpStatus.class).thenReturn(response.statusCode()); } else { throw new ServiceException("Error uploading file"); } }); 调用这个方法的方法也可以返回一个 Mono,可以一直进行下去,直到真正需要访问结果为止。就绪后,可以在 Mono 对象上调用 block() 方法。

根据不同的 Profile 激活不同的 Log4j2 配置

1、概览 本文将带你了解如何在 Spring Boot 中根据不同的 Profile 激活不同的 Log4j2 配置。 2、使用不同的配置文件 例如,假设我们有两个文件:log4j2.xml 和 log4j2-dev.xml,一个用于默认配置文件,另一个用于 dev Profile。 创建 application.properties 文件,指定日志配置文件: logging.config=/path/to/log4j2.xml 接着,为 dev Profile 创建一个名为 application-dev.properties 的新 properties 文件,并添加类似的日志配置: logging.config=/path/to/log4j2-dev.xml 如果还有其他的 Profile,例如 prod,只需为其创建一个名称相似的 properties 文件 - application-prod.properties。特定 Profile 的属性总是优先于默认属性。 3、编程式配置 可以通过更改 Spring Boot Application 类,以编程方式选择使用哪个 Log4j2 配置文件: @SpringBootApplication public class Application implements CommandLineRunner { @Autowired private Environment env; public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Override public void run(String... param) { if (Arrays.