自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

成富的专栏

技术改变生活

  • 博客(174)
  • 收藏
  • 关注

原创 Spring AI 应用开发中设置访问 Ollama 的超时时间

使用 Spring AI 开发 AI 应用时,Ollama 通常在本地开发和测试时使用,用来在本地运行大模型。由于本地开发机器的资源限制,当使用 Ollama 运行较大的模型时,大模型给出响应的时间会比较长。Spring AI 提供的 OllamaChatModel 与 Ollama 服务器交互时,默认的超时时间是 30 秒。也就是说,如果 Ollama 服务器无法在 30 秒内给出响应,Spri...

2024-07-12 23:01:42 226

原创 OpenJDK 23 新特性介绍

OpenJDK 23 将于 2024 年 9 月 17 号正式发布。目前 JDK 23 处于 Rampdown Phase One 阶段。在这个阶段,JDK 23 的功能集已经被冻结,不再添加新的 JEP。GitHub 上已经创建了 JDK 23 的分支,接受 bug 修复。JDK 23 的 Early-Access 版本也已经提供了下载。下面介绍一下 JDK 23 中的新特性。作为一个非 LTS...

2024-07-11 11:14:26 308

原创 字符串模板被噶了,JDK 23 删除了预览功能“字符串模板”

之前出了一个视频,介绍 JDK 23 中的新特性。之后我才发现,在 JDK 21 和 22 中的预览功能“字符串模板(String Templates)”,在 JDK 23 中已经没有了。字符串模板的相关代码,已经被全部删除了。字符串模板的功能,Java 社区已经期待太久了。其他主流的编程语言,都提供了字符串插值的功能。Java 语言一直没有,也确实说不过去。JDK 21 中字符串模板的出现,解决...

2024-07-10 10:38:01 781

原创 通义千问 2,大模型应用开发时的新选择

我在进行 AI 相关的开发中,最常用的模型是通义千问。本地开发的时候,使用 Ollama 来运行 qwen 模型。集成测试和线上环境,使用阿里云模型服务灵积上的通义千问模型。使用阿里云的好处是:模型服务的获取方便,稳定性好,可以及时获取到服务支持。现在通义千问出了新的版本,qwen2。qwen2 有 4 种参数尺寸:0.5b、1.5b、7b 和 72b。qwen2 的 0.5b 和 1.5b 的上...

2024-07-04 17:17:19 395

原创 Spring AI 1.0.0 新变化,从 0.8.1 如何升级

Spring AI 1.0.0-M1 版本已经发布,距离 1.0.0正式版又更近了一步。同时这也意味着,Spring AI 1.0.0的 API 已经基本确定,不会发生大的改动。这里介绍一下,相对于上一个发布版本0.8.1,Spring AI 1.0.0的一些重要的变化。首先是把与 AI 模型进行交互的ModelClient拆分成了两个接口。Model 接口负责与模型进行交互,承接了之...

2024-07-02 10:46:14 1068

原创 模块导入声明 - Java 23 新特性

作为 Java 程序员,对 import 声明肯定并不陌生。通过 import 声明,可以导入单个类型,也可以使用通配符来按需导入。举例来说,如果需要使用 Java 集合框架中的 List 类型,可以使用 import 导入 java.util.List,也可以使用通配符来导入 java.util.*。每个 Java 源文件都会默认导入 java.lang 包。实际上,很多常用的类并不包含在 ja...

2024-06-30 12:09:02 301

原创 2024 New Relic Java 生态系统报告

New Relic 发布了 2024 年度 Java 生态系统报告,数据来源于使用 New Relic 监控的线上 Java 应用。从这个报告中,我们可以看到 Java 发展的一些趋势。在 Java 版本方面,新版本的使用率越来越高。Java 11 的使用率是 32.9%,Java 17 的使用率是 35.4%,Java 8 的使用率降到了 28.8%。值得一提的是,最新的 LTS 版本 Java...

2024-06-11 23:37:18 253

原创 Spring AI 进阶开发实战

随着 AI 技术和大模型的流行,AI 应用开发成为了时下的热点。很多开发者开始学习 AI 应用开发。对广大 Java 开发人员来说,Spring AI 是开发 AI 应用最好的选择。作为 Spring 的子项目,Spring AI 在扩展性上做得很好,可以很方便地集成到已有的 Spring 项目中。Spring AI 的发展,类似于现在的 Spring Cloud,会出现越来越多的集成,包括聊天...

2024-05-22 12:16:29 363

原创 AI 大模型的检索增强生成 - Spring AI 实现

Retrieval Augmented Generation,简称 RAG 技术,在构建知识库类型的应用中有着广泛的使用。RAG 技术可以弥补基座大模型,数据缺失和过时的问题,不需要进行模型微调,适用的范围广,在实现上的成本更低。RAG 技术弥补了大模型信息不完整和过时的问题。大模型训练完成之后,其中所包含的信息不再变化。如果大模型训练时的材料中不包含某些方面的信息,在生成相关的内容时,就会输出一...

2024-05-21 12:20:35 695

原创 深入理解 Java 虚拟线程

作为主流的服务器端开发语言之一,开发高并发的应用一直是 Java 核心的应用场景。线程是 Java 中并发的基本单元。开发高并发的应用,离不开对线程的高效使用。很多人一听到多线程开发,就有种头大的感觉。但是,在日常开发中都会直接或间接地与线程打交道。线程是绕不开的难题。多线程开发确实不容易。如果可以选择,大家肯定都会选择同步单线程的方式,而不是异步多线程。同步单线程的方式对开发人员很友好。代码可读...

2024-05-20 13:09:26 289

原创 AI 大模型智能体,人设、记忆、规划与行动

提到大模型相关的应用,就肯定会听过一个词,叫智能体,也就是 Agent。打开通义千问的 APP,就有一个“智能体”的标签页,里面有各种智能体。这里我们说到的智能体,全称是 Large Language Model based Autonomous Agent,简称为 LLM Agent,或直接叫 Agent,指的是以大模型作为推理引擎的智能体。智能体之所以受到关注,是因为借助大模型的推理能力,智...

2024-04-24 08:00:22 677

原创 Java 22 发布,新特性一览

Java 22 发布于 2024 年 3 月 19 号。目前已经可以下载到不同供应商的构建版本了。推荐使用 Eclipse Temurin 的版本。这个最新的 Java 版本有哪些新东西呢?我们来看一下。首先介绍 Java 22 全新的功能。第一个是Class File API。这是解析、生成和转换 Java 类文件的标准 API。目前在处理 Java 的字节码时,必须用到第三方库,比如 ASM...

2024-03-26 20:00:18 1387

原创 Java 22 的流收集器,自定义流处理中间操作

Java 中的流终于可以自定义中间处理操作了。这是 Java 22 中新增的预览功能。自从 Java 8 引入了 Stream 之后,Stream 在 Java 应用中的使用频率非常高。Stream 处理时的 pipeline 由 3 个部分组成,分别是源、中间操作和终结操作:源是 Stream 中元素的来源,可以通过 Stream.of 方法创建,或者从集合类得到。中间操作对流中的元素进行处理,...

2024-03-12 08:01:30 744

原创 【Java 22 新特性】构造器 super(...) 之前可以添加语句

在学习 Java 的时候,我们都会记得一条 Java 的语法规则,与 Java 的 类继承和构造器有关。在继承一个类的时候,子类的构造器必须要使用super(...)来调用父类的构造器。这个super(...)语句必须是子类构造器方法的第一条语句。如果super(...)不是第一条语句,就会出现编译错误。这一条规则对于调用同一个类的构造器也是适用的,也就是调用this(...)的...

2024-02-21 14:01:02 765

原创 Epsilon GC - 不回收垃圾的 Java GC 实现

提到垃圾回收器,Java 开发人员应该都不陌生。Java 虚拟机提供了不同的垃圾回收器实现。这里介绍的 Epsilon 是一个很特别的垃圾回收器,它只负责分配内存,并不回收内存。当堆内存耗尽之后,JVM 直接因为 OutOfMemory 而终止。Epsilon 在 Java 11 中加入。一个不回收内存的 GC 实现有什么用呢?Epsilon 有自己的应用场景。首先是那些运行时间很短的程序,比如命...

2024-02-08 18:00:18 405

原创 java 命令直接运行包含多个 Java 源文件的程序【Java 22 新变化】

Java 11 中增加了一个功能,java 命令可以直接运行单个 Java 源代码文件,不需要首先通过 javac 编译之后再由 java 来运行。Java 11的这个功能在一定程度上简化了 Java 程序的运行。比如 Hello World 的简单 Java 程序,直接用下面的命令就可以运行。java HelloWorld.java不过这种方式存在一定的局限性,只允许有一个 Java 源文件。在...

2024-01-27 11:35:46 399

原创 通义灵码试用体验 - 阿里云的 AI 编程助手

阿里云的通义灵码全面开放公测已经有一段时间了。在通义灵码刚开始公测的时候,我就进行了试用,也录制了相关的视频。这篇文章算是一个文字版。实际的演示视频可以看我的 B 站 / 抖音 / 视频号。通义灵码可以在编程时作为辅助。在作用上类似 GitHub 的 Copilot。我之前也试用过类似 Cursor 这样的工具,确实对编程开发有一定的帮助。对于阿里云的通义灵码也是有所期待。通义灵码支持 VS Co...

2023-12-05 08:00:40 1463

原创 从源代码出发,Jenkins 任务排队时间过长问题的解决过程

最近开发了一个部署相关的工具,使用 Jenkins 来构建应用。Jenkins 的任务从模板中创建而来。每次部署时,通过 Jenkins API 来触发构建任务。在线上运行时发现,通过 API 触发的 Jenkins 任务总是会时不时在队列中等待较长的时间。某些情况下的等待时间甚至长达几分钟。直接在 Jenkins 界面上触发的任务却几乎不需要排队,直接马上就可以执行。过长的等待时间影响了构建的效...

2023-11-28 08:00:21 956

原创 Git 删除已经合并的本地分支

在使用 Git 的开发流程中,经常会创建很多的 Git 分支,包括功能分支(features/*)、发布分支(release/*)和 hotfix 分支(hotfix/*)。在开发了一段时间之后,本地就会有出现很多分支。这些分支最终都会被合并到主分支。虽然这些分支在远端 Git 仓库已经被删除,仍然会出现在本地。这些本地分支可以被清理。在清理之前,首先运行git fetch来进行更新。有两种清...

2023-08-25 20:00:22 1262

原创 Java 21 新特性和改进

Java 21 是 Java 17 之后的下一个 LTS 版本。虚拟线程在 Java 21 中将成为正式功能。可以预期的是,Java 21 会成为一个很流行的 Java 版本。Java 21 将在 2023 年 9 月 19 日发布。目前 Java 21 包含的内容已经基本确定了。下面来梳理一下 Java 21 中会包含的内容。正式功能虚拟线程 (Virtual Threads)自从 Java 1...

2023-05-28 18:14:06 5915

原创 【Java 21 新特性 】顺序集合(Sequenced Collections)

Java 21 中增加了一种新的集合类型:顺序集合(Sequenced Collections)。要介绍顺序集合,就首先要说明一下出现顺序(encounter order)。出现顺序指的是在遍历一个集合时,集合中元素的出现顺序。有些集合类型,有确定的出现顺序,比如List。不管遍历多少次这样的集合,其中元素的出现顺序始终是固定。有些集合类型,并没有确定的出现顺序,比如HashSet。如果多次遍...

2023-04-01 22:45:13 3436 1

原创 Cursor:GPT-4 驱动的强大代码编辑器

Cursor (https://www.cursor.so/)是 GPT-4 驱动的一款强大代码编辑器,可以辅助程序员进行日常的编码。下面通过一个实际的例子来展示 Cursor 如何帮助你编程。这个例子做的事情是网页抓取。抓取的目标是百度首页上的百度热搜,如下图所示。我用的是 JavaScript 来实现的。同时按下 Ctrl + K,给出的提示是:抓取 https://www.baidu.com...

2023-03-17 19:00:44 24878 9

原创 ChatGPT 又整活了,从零开始设计并实现一个类似数独的游戏 Sumplete

ChatGPT 又整活了。这次是从零开始设计并实现一个类似数独的游戏。数独应该很多人都玩过,规则也很简单。那能不能设计一款与数独类似的新游戏呢?国外有位叫 Daniel Tait 的工程师就想到了让 ChatGPT 来试试。经过几个小时与 ChatGPT 的对话,ChatGPT设计并开发了这款名为 Sumplete 的游戏。这款游戏的规则也很简单。给定 3x3、4x4、5x5、6x6、7x7、8x...

2023-03-10 21:00:20 984

原创 Java应用使用 Reflections 库时提升启动性能

Reflections 是 Java 应用中进行反射操作时的常用库。比如,如果想要找到所有标注了@Tag注解的方法,可以用 Reflections 提供的getMethodsAnnotatedWith方法,如下面的代码所示。public class TagLoader { Set<String> findTags() { var reflections = new...

2023-02-13 23:58:51 830

原创 Git commit 消息的格式与约定式提交

在开发人员的日常工作中,提交代码到 Git 是必不可少的动作。代码提交时的消息该怎么写呢?最基本的原则是:如果团队有 commit 格式要求,就遵循该要求。这一点与代码风格是一样的。commit 消息的格式没有绝对的好与坏,最重要的是保持一致性。如果团队没有具体的格式要求,可以参考下面的一些建议。消息应该分成主题和内容两个部分,两部分用一个空行分隔。主题部分对 commi...

2022-06-09 23:07:24 1456

原创 介绍 Docker 的多阶段构建功能

云原生应用以容器镜像作为发布形式。云原生应用的构建过程负责把源代码转换成可以直接运行的镜像。这个转换过程根据编程语言而有所不同:解释型语言,如 JavaScript 和 Python,一般...

2021-12-28 14:16:35 1117

原创 OCI 容器镜像的优化策略

OCI 容器镜像在云原生应用的开发中起着非常重要的作用。如何优化 OCI 容器镜像也是一个重要的话题。一般来说,OCI 容器镜像的优化有三个方向:容器镜像的尺寸容器镜像的拉取和推送速度容器...

2021-12-23 15:47:33 791

原创 详解 OCI 容器镜像的层

在 OCI 容器镜像规范中,最重要的概念是层(layer)。如果需要对容器镜像的存储尺寸进行优化,就离不开对层的理解。变化集层表示的是文件系统的变化集(Changeset)。每个层表示的是...

2021-12-10 12:42:58 1356

原创 了解 OCI 容器镜像的 ID 与标签

在本地开发中使用 Docker 时,一个常用的命令是docker pull,用来拉取镜像到本地。如下面代码所示:docker pull nginx上面的代码仅包含了nginx,这是一个...

2021-12-04 15:36:39 592

原创 手把手教你了解 OCI 镜像规范

在云原生应用的开发中,应用会被打包成容器镜像。容器镜像遵循OCI 镜像规范。了解 OCI 镜像规范,对构建容器镜像有重要的作用。在介绍 OCI 镜像规范之前,首先需要介绍内容可寻址的文件...

2021-11-29 17:16:13 3003 1

原创 Java 的字符串连接与 StringBuilder 的使用

Java 的字符串连接与 StringBuilder作为一名Java程序员,当看到下面的代码时,第一反应可能是:为什么要用字符串相加?得用 StringBuilder 啊,不然性能有问题。...

2021-11-12 20:24:59 400

原创 使用 run-java.sh 运行 Java 应用

当需要运行Java应用时,不管在机器上还是容器里,一般的做法是运行java命令。一些 Java 应用会被打包成单个可执行的 JAR 文件,如 Spring Boot 应用。对于这样的 ...

2021-11-11 18:58:00 4101

原创 【升级到Java 17】文本块

一直以来,Java 语言中并没有很好的方式在代码中直接添加多行的字符串常量。一种常见的做法是使用字符串连接。每一个字符串表示一行,需要手动添加换行符。字符串连接的问题在于很难维护。尤其是需...

2021-10-10 11:21:41 3449

原创 【升级到Java 17】模式匹配

提到模式匹配,可能很多 Java 开发人员比较陌生。了解模式匹配我们从一个具体的示例出发来看模式匹配的作用。我们的目标是把任意的 Java 对象转换成字符串。我们可以很容易的写出类似下面的...

2021-10-07 20:08:12 2250

原创 【升级到Java 17】switch 表达式

提到switch, 所有 Java 开发人员应该都不陌生。switch根据变量的值来执行不同的逻辑,用来替代多分支的if/else。不过switch语句在使用时存在一些常见问题。首...

2021-10-04 12:25:04 3976

原创 使用Kafka UI管理Kafka

在使用Kafka进行开发时,有个可视化的管理界面有助于提高开发效率。目前已经有很多Kafka的管理界面实现。本文介绍的Kafka UI是一个新的实现。该界面的GitHub地址是provectus/kafka-ui。GitHub - provectus/kafka-ui: Open-Source Web GUI for Apache Kafka ManagementOpen-Source Web GUI for Apache Kafka Management. Contribute to provectu

2021-10-02 13:33:03 12121 2

原创 【升级到Java 17】密封类

提到密封类,需要首先介绍Java的继承机制。Java继承机制Java的继承机制的设计理念是开放的。在满足可见性限制的前提下,类默认都是可以被继承的。这种开放的继承机制在有些情况下会产生问题...

2021-10-01 20:30:00 828

原创 Docker Desktop 4.1为免费用户提供了卷管理功能

在最新发布的 Docker Desktop 4.1中,之前为付费用户提供的卷管理(Volume Management)功能已经免费。只需要升级到 4.1 就可以使用该功能。下面是 Docker Desktop 4.1 的版本信息。在 Docker Desktop的仪表盘界面可以查看全部的卷。对每个卷可以查看详细信息。还可以查看卷中的文件结构,并进行管理。这个功能有助于对容器运行时产生的错误进行调试。...

2021-10-01 07:57:17 353

原创 使用单一代码仓库管理微服务应用

如何组织源代码,是实现微服务架构中的一个现实问题。由于每个微服务相对独立,一种最直接的做法是为每个微服务使用各自独立的代码仓库。这种做法的好处很明显,就是从源头开始对微服务进行隔离。每个微...

2021-09-30 18:55:57 899

原创 了解 Java 的记录类型

提到记录类型,就首先要介绍值对象。熟悉领域驱动设计的人应该听过实体和值对象这两个概念。值对象每个实体都唯一的标识符,可以是业务ID或是由应用指派的ID。实体的相等性完全由标识符来确定。值对...

2021-09-28 19:14:04 471

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除