跳至主要內容
Black-HoleBlack-Hole

YUDI-Corgi

Get doing!Get good!Get smart!

深入浅出 String 字符串

引子

相信每个 Javaer 都遇到过这个问题:String abc = new String("123"); 创建了几个对象?其作为八股文已是老生常谈,考究的是大伙对对象创建以及字符串在 JVM 中的存储理解。本篇文章就来深入探讨下 String 方方面面的问题。

String 内部结构

char[] -> byte[]

String 内部原本使用一个 char[] value 存储字符,若不是”版本任你更,我用 Java 8“ 的钉子户,应该能发现从 JDK 9 开始,它就变成了 byte[] value。这么做的目的主要是为了减少字符串占用的内存,减少 GC 次数。(详见参考资料JEP 254


YUDI-Corgi原创JavaJavaString大约 18 分钟
WebSocket vs SSE vs Long-Polling vs WebRTC vs WebTransport

写在前头

本篇是 WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport 一文的中文翻译(由沉浸式翻译提供并优化了下排版),文章表达了在如今的实时 Web 应用程序中,由服务器主动推送事件数据到客户端的多种方案实现,分别是 Long-Polling(长轮询)、WebSocketsServer-Sent-Events(SSE,服务器发送事件)、WebTransportWebRTC。这五种方式各有优劣,文章讲述了五种方案的概念与对比后,也给出了选择建议,读者在实际开发中可引为参考。


YUDI-Corgi杂谈杂谈大约 30 分钟
Spring Cloud Stream 系列(三)

分区

Spring Cloud Stream 提供对给定应用程序的多个实例之间的数据分区的支持。在分区场景中,物理通信介质(例如 Broker 的 Topic)被视为由多个分区组成。一个或多个生产者应用程序实例将数据发送到多个消费者应用程序实例,并确保以共同特征标识的数据由同一消费者实例处理。

Spring Cloud Stream 提供了一个通用抽象,用于以统一的方式实现分区处理用例。因此,无论 MQ 本身是否自然分区(如 Kafka)或不自然分区(如 RabbitMQ),都可以使用分区。

分区结构图

YUDI-Corgi原创Spring CloudMQSpring CloudMQ大约 11 分钟
Spring Cloud Stream 系列(二)

上篇主要讲了 Spring Cloud Stream 的基础用法以及对 RabbitMQ 的配置使用,但若只看这点,那么跟 Spring Boot 集成 MQ 的方式比起来并没有什么突出的地方。Spring Cloud Stream 强大之处是在于隐藏了各类 MQ 不同且(可能)繁琐的配置和代码操作,提供了统一的概念(Binder、Binding、Message)、配置(输入/输出绑定、生产/消费)、消息收发 API 以及函数定义,用一套做法就完成对不同 MQ 系统的使用。这听起来是不是很熟悉~~~?其实这就是门面(或外观)模式的体现,类似 SLF4J 日志、Spring 的 ApplicationContext 等,隐藏了背后依赖库、框架或其它对象的复杂实现,提供一个简单的门面接口来使用。


YUDI-Corgi原创Spring CloudMQSpring CloudMQ大约 11 分钟
Spring Cloud Stream 系列(一)

Spring Cloud Stream:是用于构建与共享消息传递系统连接的高度可扩展的事件驱动微服务,其提供一个灵活的编程模型,基于 Spring 习语来实现对各类常见的 MQ 系统的支持,如官方自己提供的 RabbitMQ Binder、Kafka Binder,还有其它 MQ 厂商自己提供的适配。其内部使用 Spring Integration 提供与 broker 的连接,并能够在同样的配置、代码下实现不同 MQ 产品的消息发布订阅、消费者组、持久化、分区等特性。


YUDI-Corgi原创Spring CloudMQSpring CloudMQ大约 14 分钟
分布式事务

分布式事务是在分布式系统下绕不开的一个话题,它的概念是指:在分布式系统下,一个业务跨多个服务或数据源,每个服务都是一个分支事务,要保证多个分支事务最终一致性,即为分布式事务。本篇便是来介绍常见的几种分布式事务实现方案。

理论规范

先来了解下分布式领域的一些定理。

CAP 定理

分布式系统的三个指标:在分布式系统中,最多只能实现其中的两点,由于网络硬件肯定会出现延迟丢包等问题,所以分区容错性是必须实现的,因此只能在一致性和可用性之间进行权衡。

  • 一致性(Consistency):用户访问分布式系统中的任意节点,得到的数据都是一致的
  • 可用性(Availability):分布式系统中任意健康节点在任何时候都可以读写
  • 分区容错性(Partition tolerance):在网络故障、某些节点不能通信的时候系统仍能继续工作
    • 分区(Partition):因为网络故障或其它原因导致分布式系统中的部分节点与其它节点失去连接,形成独立分区
    • 容错(Tolerance):在出现分区情况时,系统也要持续对外提供服务

YUDI-Corgi原创Spring分布式事务大约 13 分钟
WebSocket 集成(二)

本篇介绍 Spring 集成 WebSocket 的第二种方式:使用 Spring 本身的 WebSocket 模块,先从基础开始。

依赖

使用的 Spring Boot 版本为3.2.2,添加依赖如下:

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

YUDI-Corgi原创SpringSpring BootWebSocket大约 6 分钟
WebSocket 集成(一)

介绍

WebSocket 协议 是基于 TCP 协议的全双工通信协议,是通过单个 TCP 连接在客户端和服务器之间建立全双工、双向通信通道,可让客户端与服务端建立持久连接,并实时互传数据。它与 HTTP 同为应用层协议,但相比于 HTTP 的请求 - 响应模型,WebSocket 则提供了实时、低延迟的数据传输能力和长连接功能,旨在解决 HTTP 协议在实时通信方面的局限性,如请求 - 响应模式的单向性以及频繁的连接、断开开销。WebSocket 的特性,使得其在即时通讯、游戏同步、IOT 设备实时监控等应用场景大放异彩,已成为现代 Web 应用中常用的通讯协议之一。


YUDI-Corgi原创SpringSpring BootWebSocket大约 10 分钟
2