New Java Feature - Sealed
无法穷举
判断一个形状是不是正方形
上述判断 - 一个形状的对象是不是一个正方形的实例
一个形状的对象即使不是一个正方形的实例,也可能是一个正方形
很多形状的特殊形式就是正方形 - 长方形、菱形、梯形、多边形等 - 无法穷举
通过 instanceof 并不能正确判断一个形状是否为正方形
问题根源 - 无限制的扩展性
限制扩展性
OOP 的最佳实践之一,就是把可扩展性限制在可以预测和控制的范围内,而不是无限的扩展性
继承的安全缺陷
一个可扩展的类,子类和父类可能会相互影响,从而导致不可预知的行为
涉及敏感信息的类,增加可扩展性不一定是个优先选项,要尽量避免父类或者子类的影响
在设计 API 时,需要反复思考
一个类,有没有真实的可扩展需求,能不能使用 final 修饰符
一个方法,子类有没有重写的必要性,能不能使用 final 修饰符
限制住不可预测的可扩展性,是实现安全代码、健壮代码的一个重要目标
在 JDK 17 之前,限制可扩展性只有两个方法 - 使用私有类或者 final 修饰符
私有类不是公开接口,只能内部使用,而 final 修饰符则彻底放弃了可扩展性
要么全开放,要 ...
New Java Feature - Record
概述
JDK 16
Java 档案类是用来表示不可变数据的透明载体
OOP
封装 + 继承 + 多态
接口不是多线程安全的 - 将 Public 方法设置成同步方法 - 开销很大
更优方案 - 即使不使用线程同步,也能做到多线程安全 - 不可变对象
天生的多线程安全 - 类对象一旦实例化就不能再修改
简化代码 - 删除读取半径的方法,直接公开半径这个变量 - 与 Go 类似
Circle 一直可以用半径来表达,所以并没有带来违反封装原则的实质性后果
进一步简化
使用公开的只读变量 - 使用 final 修饰符来表明只读变量
公开的只读变量,只在在公开的构造方法中赋值 - 解决对象的初始化问题
公开的只读变量,替换掉了读取的方法 - 减少代码量
声明档案类
Java 档案类是用来表示不可变数据的透明载体
record 关键字是 class 关键字的一种特殊表现形式,用来标识档案类
record 关键字可以使用与 class 关键字差不多一样的类修饰符 - public/static
类标识符 Circle 后,用小括号括起来的参数 - 类似于一个构造方法
...
New Java Feature - Text Blocks
概述
JDK 15
文字块 - 一个由多行文字构成的字符串
复杂字符串
需要处理 - 文本对齐、换行字符、连接符以及双引号的转义字符串 - 不美观 + 不简约 + 不自然
1234567String stringBlock = "<!DOCTYPE html>\n" + "<html>\n" + " <body>\n" + " <h1>\"Hello World!\"</h1>\n" + " </body>\n" + "</html>\n";
所见即所得的文字块
文字块是一个由多行文件构成的字符串
文字块使用新的形式,尝试消除换行符、连接符、转义字符的影响
使得文字对齐和必要的占位符更加清晰,从而简化多行文字字符串的表达
换行符 \n 没有出现在文字块这个
连字符 + ...
New Java Feature - JShell
概述
JDK 9
JShell 是 Java 的交互式编程环境
JShell API 和工具提供了一种在 JShell 状态下评估 Java 编程语言的声明、语句和表达式的方式
JShell 的状态包括不断发展的代码和执行状态
为了便于快速调查和编码
语句和表达式不需要出现在方法中
变量和方法也不需要出现在类中
启动 JShell12345$ jshell| Welcome to JShell -- Version 21.0.7| For an introduction type: /help introjshell>
详尽模式
12345$ jshell -v| Welcome to JShell -- Version 21.0.7| For an introduction type: /help introjshell>
退出 JShell123456$ jshell -v| Welcome to JShell -- Version 21.0.7| For an introduction type: /help introjshell> /exit| Go ...
Observability - OpenTelemetry Python
OverviewStatus and Releases
Traces
Metrics
Logs
Stable
Stable
Development
Version supportOpenTelemetry-Python supports Python 3.9 and higher.
Installation
The API and SDK packages are available on PyPI, and can be installed via pip:
12pip install opentelemetry-apipip install opentelemetry-sdk
In addition, there are several extension packages which can be installed separately as:
12pip install opentelemetry-exporter-{exporter}pip install opentelemetry-instrumentation-{instrumentat ...
Observability - OpenTelemetry Go
OverviewStatus and Releases
The logs signal is still experimental. Breaking changes may be introduced in future versions.
Traces
Metrics
Logs
Stable
Stable
Beta
Getting StartedExample applicationSetup
To begin, set up a go.mod in a new directory:
12345$ go mod init dicego: creating new go.mod: module dice$ lsgo.mod
Create and launch an HTTP server
In that same folder, create a file called main.go and add the following code to the file:
123456789101112package mainimport ( "log" ...
Observability - OpenTelemetry Node.js
OverviewStatus and Releases
Traces
Metrics
Logs
Stable
Stable
Development
Client instrumentation for the browser is experimental and mostly unspecified.
Version Support
OpenTelemetry JavaScript supports all active or maintenance LTS versions of Node.js.
Previous versions of Node.js may work, but are not tested by OpenTelemetry.
OpenTelemetry JavaScript has no official supported list of browsers. It is aimed to work on currently supported versions of major browsers.
OpenTelemetry JavaScript foll ...
Observability - OpenTelemetry Doc V2
Language APIs & SDKs
OpenTelemetry code instrumentation is supported for many popular programming languages
OpenTelemetry code instrumentation is supported for the languages listed in the Statuses and Releases table below.
For Go, .NET, PHP, Python, Java and JavaScript you can use zero-code solutions to add instrumentation to your application without code changes.
If you are using Kubernetes, you can use the OpenTelemetry Operator for Kubernetes to inject these zero-code solutions into your applicat ...
Observability - OpenTelemetry Doc V1
架构
OpenTelemetry 也被称为 OTel,是一个供应商中立的、开源的可观测性框架, 可用于插桩、生成、采集和导出链路、 指标和日志等遥测数据
概述
专注于数据标准,不提供存储和可视化
OpenTelemetry 是一个可观测性框架和工具包, 旨在创建和管理遥测数据,如链路、 指标和日志
OpenTelemetry 是供应商和工具无关的,这意味着它可以与各种可观测性后端一起使用, 包括 Jaeger 和 Prometheus 这类开源工具以及商业化产品
OpenTelemetry 不是像 Jaeger、Prometheus 或其他商业供应商那样的可观测性后端
OpenTelemetry 专注于遥测数据的生成、采集、管理和导出
OpenTelemetry 的一个主要目标是, 无论应用程序或系统采用何种编程语言、基础设施或运行时环境,你都可以轻松地将其仪表化
遥测数据的存储和可视化是有意留给其他工具处理
可观测性
可观测性是通过检查系统输出来理解系统内部状态的能力
在软件的背景下,这意味着能够通过检查遥测数据(包括链路、指标和日志)来理解系统的内部状态
要使系统可观测,必须对其进行 ...
eBPF - Principle
发展历程
1992 年,在 BSD 操作系统中引入了革命性的包过滤机制 BPF,性能非常好
BPF 的两大设计
内核态引入一个新的虚拟机,所有指令都在内核虚拟机中运行
用户态使用 BPF 字节码来定义过滤表达式,然后传递给内核,由内核虚拟机解释执行
BPF 使得包过滤可以直接在内核中执行,避免向用户态复制每个数据包,从而极大提升了包过滤的性能,被各大操作系统广泛接受
BPF 诞生 5 年后,在 Linux 2.1.75 首次引入了 BPF 技术,在 Linux 3.0 中增加的 BPF JIT,替换掉性能更差的解释器,进一步优化了 BPF 指令运行的效率
直到此时,BPF 的应用领域还仅限于网络包过滤
2014 年,将 BPF 扩展为一个通用的虚拟机,即 eBPF
eBPF 不仅扩展了寄存器的数量,引入了全新的 BPF 映射存储
还在 4.x 内核中将原本单一的数据包过滤事件逐步扩展到了内核态函数、用户态函数、跟踪点、性能事件以及安全控制等
eBPF 的诞生了 BPF 技术的转折点,使得 BPF 不再仅限于网络栈,而是成为内核的一个顶级子系统 - 最活跃
eBPF 无需修改内核源码和重新编译就可以扩展 ...