试用Spring Native
我一直在玩GraalVM AOT编译功能,因为我知道它。作为一个长期的Spring爱好者,我仔细地观察了Tanzu的工程师们为使Spring-AOT兼容所做的努力。最近,他们宣布了测试版的集成。在这篇文章中,我想看看制作一个(正在工作的!)来自现有Spring引导应用程序的Docker image镜像。 GraalVM提供了许多不同的特性。其中,名为substratevm的组件允许AOT将常规字节
我一直在玩GraalVM AOT编译功能,因为我知道它。作为一个长期的Spring爱好者,我仔细地观察了Tanzu的工程师们为使Spring-AOT兼容所做的努力。最近,他们宣布了测试版的集成。在这篇文章中,我想看看制作一个(正在工作的!)来自现有Spring引导应用程序的Docker image镜像。 GraalVM提供了许多不同的特性。其中,名为substratevm的组件允许AOT将常规字节
在本教程中,我们将研究标准Spring框架和Spring Boot之间的区别。 我们将重点讨论Spring的模块,如MVC和Security,在核心Spring中使用时与在Boot中使用时的区别。 Spring是什么? 简单地说,Spring框架为开发Java应用程序提供了全面的基础设施支持。 它包含了一些很好的功能,比如依赖注入,以及一些现成的模块,比如: Spring JDBC Spring
定义web应用程序 在Tomcat中定义web应用程序有两种方法:编辑配置文件或使用交互式管理工具。 手动编辑配置文件 修改<Tomcat home>/conf/server.xml:通过插入 <Context path="/jchem" docBase="<JChem home>" reloadable="true" > </Context> &l
java.lang包在Java应用程序中自动导入。这个包包含许多常用的类,从NullPointerException到Object、Math和String。 这个java.lang.System系统类是最后一个类,这意味着我们不能将其子类化,因此所有方法都是静态的。 我们将研究两种读取系统属性和环境变量的系统方法之间的差异。 这些方法是getProperty和getenv。 使用System.ge
一旦您编写了一个Java程序,您需要使用javac命令来编译它,这将显示发生的编译时错误(如果有的话)。 一旦解析它们并成功编译程序,将在当前文件夹中生成一个与类名同名的可执行文件,扩展名为.class。 然后需要使用java命令执行它,如: java class_name 在执行时,当JVM找不到具有指定名称的.class文件时,会出现运行时错误,错误为"Could not found or l
GraalVM是一个高性能运行时,它在应用程序性能和效率方面提供了显著的改进,这是微服务的理想选择。它是为java、JavaScript、LLVM等语言编写的,如C++和C++语言,以及其他动态语言。它消除了编程语言之间的隔离,并在共享运行时启用互操作性。它可以独立运行,也可以在OpenJDK的上下文中运行,Node.js或者Oracle数据库。 对于Java程序 对于现有的Java应用程序,Gr
Dolt是一个SQL数据库,您可以像git存储库一样进行分叉、克隆、分支、合并、推送和拉取。连接到Dolt就像任何MySQL数据库一样,使用SQL命令运行查询或更新数据。使用命令行界面导入CSV文件、提交更改、将更改推送到远程服务器或合并队友的更改。 你所知道的Git的所有命令对Dolt的作用完全相同。Git版本文件,Dolt版本表。就像Git和MySQL生了个孩子一样! 我们还建立了DoltHu
领域驱动设计(Domain-Driven Design,DDD)是一套帮助我们设计有效的软件体系结构以提供更高业务价值的原则和工具。有界上下文(Bounded Context)是将整个应用程序域划分为多个语义一致的部分,从而将体系结构从一个大泥球中解救出来的核心和基本模式之一。 同时,利用java9模块系统,我们可以创建强封装的模块。 在本文中,我们将创建一个简单的存储应用程序,并了解如何利用Ja
什么是RocksDB? RocksDB是一个用于快速存储的可嵌入持久键值存储。ROCKSDB也可以是客户机-服务器数据库的基础,但我们目前的重点是嵌入式工作负载。 RocksDB构建在LevelDB之上,可以在具有许多CPU核心的服务器上运行,可以高效地使用快速存储,支持IO绑定、内存中和一次写入的工作负载,并且可以灵活地进行创新。 性能如何比较? 我们对LevelDB进行了基准测试,发现它不适合
Micronaut:现代的JVM微服务框架 一个现代的、基于JVM的、全栈框架,用于构建模块化的、易于测试的微服务应用程序micronaut.io Micronaut是Grails团队在2018年Greach大会上正式宣布的一个全新的全栈框架。它专注于模块化、最小的内存占用和启动时间,这使得它成为运行在AWS lambda或类似环境中的完美解决方案。用Java编写的服务器需要不到1秒的时间来启动8
Netflix开源了领域图形服务 Domain Graph Service (DGS)框架,DGS简化了框架的独立性和联合GraphQL服务的实现。 通过开源项目,希望对Java和GraphQL社区做出贡献,并向所有使用该框架的人学习和合作,使其变得更好。 DGS框架的主要功能包括: 基于注解的Spring-Boot编程模型 将查询测试编写为单元测试的测试框架 Gradle代码生成插件,可以从Gr
Java9反应流允许我们实现非阻塞异步流处理。这是将反应式编程模型应用于核心java编程的一个重要步骤。 RxJava和Akka流是反应流的流行实现。现在Java9通过java.util.concurrent.Flow API。 Java 9 Reactive Streams 反应流是关于流的异步处理,所以应该有一个发布者和一个订阅者。发布者发布数据流,订阅者使用数据。 有时我们必须在发布者和订阅
介绍 Apache Ignite是一个开源的以内存为中心的分布式平台。我们可以将其用作数据库、缓存系统或内存中的数据处理。 该平台使用内存作为存储层,因此具有令人印象深刻的性能。简单地说,这是目前生产中使用的最快的原子数据处理平台之一。 官网地址:https://ignite.apache.org/ 安装 我们将要构建的应用程序的Maven依赖关系: <dependency> <
介绍 在本文中,我们将看一看Caffeine—一个针对Java的高性能缓存库。 缓存和映射之间的一个基本区别是缓存淘汰/过期策略。 逐出策略(缓存淘汰策略)决定应在任何给定时间删除哪些对象。此策略直接影响缓存的命中率—缓存库的一个关键特性。 Caffeine使用Window TinyLfu逐出策略,它提供了一个接近最佳的命中率。 maven依赖 我们需要把Caffeine的依赖添加到我们项目的中p
Hashed wheel timers介绍 哈希轮计时器是一种非常有趣的数据结构,在网络服务器中得到了广泛的应用。它们的低内存开销和合理的效率保证非常适合处理数百万个连接的服务器,每个连接都有一个计时器。我们不会花太多时间描述它们是如何工作的,相反,我们将研究一些实现,并尝试评估它们的相对权衡。 让我们快速回顾一下哈希轮计时器的基本数据结构: 基本的数据结构看起来像一个hashmap,带有单独的链
概述 在本文中,我们将介绍JCTools(Java并发工具)库。 简单地说,这提供了许多适用于多线程环境的实用数据结构。 非阻塞算法 传统上,在可变共享状态下工作的多线程代码使用锁来确保数据一致性和发布(一个线程所做的更改对另一个线程可见)。 这种方法有许多缺点: 线程在试图获取锁时可能会被阻塞,在另一个线程的操作完成之前不会取得任何进展—这有效地防止了并行性 锁争用越重,JVM处理
ActiveMQ与RabbitMQ的区别 ActiveMQ与RabbitMQ是流行的开源消息代理。消息代理通过将定义的消息共享给各种应用程序来帮助计算机彼此交互,从而支持电信系统。消息代理帮助将发送方消息的格式转换为接收方标准的格式。RabbitMQ是AMQP协议的最佳实现。它执行一个代理体系结构,其中消息在发送到目的地之前在中心节点上排队。ActiveMQ工作在中间地带,使用代理和P2P架构进行
本文的目的是让大家快速了解Kafka与消息队列的关系,以及为什么会考虑使用它。 Kafka是Linkedin最初开发的一项技术。简而言之,它有点像一个消息队列系统,有一些曲折,使它能够支持pub/sub,扩展到多个服务器,并重放消息。 当您想要采用反应式编程风格而不是命令式编程风格时,这些都是您需要考虑的问题。 命令式编程与反应式编程的区别 命令式编程是一种我们都开始使用的编程类型。有些事情发生了
什么是RSocket? RSocket是一种用于分布式应用程序的二进制点对点通信协议。从这个意义上说,它提供了一种替代HTTP等其他协议的方法。 RSocket和其他协议之间的全面比较超出了本文的范围。相反,我们将关注RSocket的一个关键特性:它的交互模型。 RSocket提供了四种交互模型。考虑到这一点,我们将用一个例子来探讨每一个问题。 Maven依赖项 对于我们的示例,RSocket只需
Java并行流Parallel Streams是Java8和更高版本的一个特性,用于利用处理器的多个核心。通常,任何java代码都有一个处理流,在这里它是按顺序执行的。然而,通过使用并行流,我们可以将代码分成多个流,这些流在不同的内核上并行执行,最终的结果是各个结果的组合。然而,处理的顺序不在我们的控制之下。 因此,建议在以下情况下使用并行流:无论执行顺序如何,结果不受影响,一个元素的状态不影响另