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 无需修改内核源码和重新编译就可以扩展 ...
eBPF - Overview
eBPF
Extended Berkeley Packet Filter
eBPF 是一种数据包过滤技术,从 BPF 技术扩展而来
BPF 提供了一种在内核事件和用户程序事件发生时安全注入代码的机制,让非内核开发人员也可以对内核进行控制
随着内核的发展,BPF 从最初的数据包过滤,扩展到网络、内核、安全、跟踪等,扩展后的 BPF 被称为 eBPF,早期的 BPF 被称为经典 BPF,即 cBPF
现代内核所运行的都是 eBPF
特性
在 eBPF 之前,内核模块是注入内核的最主要机制
由于缺乏对内核模块的安全控制,内核的基本功能很容易被一个有缺陷的内核模块破坏
eBPF 借助 JIT,在内核中运行一个虚拟机,保证只有被验证安全的 eBPF 指令才会被内核执行
同时,eBPF 指令依然运行在内核中,无需向用户态复制数据,极大地提高了事件处理的效率
eBPF 在故障诊断、网络优化、安全控制、性能监控等领域获得了大量应用
高性能网络负载均衡器 - Katran
容器网络方案 - Cilium
内核跟踪排错工具 - BCC + bpftrace
概览
技术栈
掌握 eBPF 并不需要掌握内核开发
...