Java 微服务框架新选择:Spring 5

竟然有5种微服务框架可以替代Spring Boot 在 Java 和 Kotlin 中, 除了使用Spring Boot创建微服务外,还有很多其他的替代方案。 名称 版本 发布时间 开发商 GitHub Helidon SE 1.4.1 2019年 甲骨文 链接 Ktor 1.3.0 2018 阅读详情

在这篇文章中,我们将讨论即将发布的第五代 Spring 框架中的新概念—— “Functional Web Framework”,来看看它如何帮助我们构建轻量级的微服务。

file

你可能会对标题中出现的 “Spring” 和 “微服务框架”感到惊讶。但是确实如此,Spring 5非常适合成为你 Java Web 微服务框架的新选择。首先,为了避免混淆让我们来对“微服务”中的“微”达成共识:

简洁 - 无需样板工程,无需额外设置

简单 - 没有任何“魔法”

易于部署 - 产生单一的可部署工件

容易运行 - 没有额外的依赖

轻量级 - 最小内存占用/CPU 使用

非阻塞 - 更好的并发性

虽然 Spring Boot 已经能做到上述的一些点,但 Spring MVC 本身依然引入了很多魔法。比如 @Controller 这个广泛使用的注解就有点含糊不清,更不用说 Spring 的自动配置和组件扫描等特性了。通常来说,这是开发一个大规模应用时可以承受的烦恼,毕竟 Spring 帮我们搞定了依赖注入、请求路由、各类复杂的配置等。然而,在微服务的世界中,应用程序只是类似一个大机器中运行的小齿轮,Spring Boot 就显得有些“杀鸡用牛刀”了。

为了解决这些问题,Spring 团队引出了一个名为“Functional Web Framework”的新概念,它是 Spring WebFlux(以前称为 Spring Reactive Web)这个大项目的一部分。同时也是我们现在要讨论的。

首先,让我们回顾一下基础知识,看看一个 Web 应用程序到底是什么样的,以及由什么组件构成。很显然,最基本的部分就是网络服务器(Web server)本身,为了避免手工解析 HTTP 请求,然后委派给应用程序的某个方法,我们需要一个请求路由器(router),同时我们也需要一个请求处理器或处理程序(handler),其实就是一段代码,它可以接受请求,做实际的逻辑处理,并最终返回一个响应。所有这些也正是 Spring Functional Web 所做的,它剥离了所有的抽象层(beans 和 contexts)。注意,这并不意味着它脱离并放弃了成熟的 Spring MVC 模型,而是提供了使用 Spring 来构建 Web 应用程序的另一种选择。

请求处理器

我们来看一下这个例子。 开始前请访问 http://start.spring.io 使用项目创建器创建一个新的空白工程,使用 Spring Boot 2.0 和 Reactive Web 作为唯一的依赖。 接着我们就可以定义第一个请求处理器或处理方法(handler)了,很简单,它接受请求并返回响应。

file

从上述代码可以看出来,它是 HandlerFunction 接口的一个实现,定义了一个方法来获取一个请求(类型为 ServerRequest),并返回具有 "Hello" 字符串的 ServerResponse 对象。 Spring 还提供了方便的构建器(builder)来构造响应。在我们的例子中,我们使用 ok() 自动将返回码设置为 HTTP 200 。为了构造响应体,我们使用另一个叫 Mono 的概念,它代表 single reactive value ,但我们这里先不管它,只要明白 Mono.just(...) 是一种通过返回 Publisher 类型对象(其实是类似 Promise)来实现非阻塞编程范式的方式。Reactive Web 是Spring 5 的一部分,它是通过 Java 9 的 Reactive Stream 来实现的。你可以参考 Dave Syer 的这篇文章。

我们还可以使用 Java 8 的 lambdas 表达式使代码更简洁,如下:

file

请求路由器

上面我们已经有一个 handler 了,现在我们可以定义一个请求路由器了。 假设我们要使用 GET 方法请求 "/" 时调用我们的 handler。 为此,我们可以使用 RouterFunction 。

file

route 和 GET 都是 RequestPredicates 和 RouterFunctions 的静态方法,它们可以用来构建 RouterFunction 。它接受一个请求,检查它是否能匹配现有handler(比如请求路径(path)、请求方法(method)或者是内容类型(content type)等)。如果匹配则调用 handler。 在我们的例子中,HTTP 方法是 GET,请求路径是 "/", handler 函数是上面定义的 hello。

file

Web 服务器

现在我们可以把他们组装在一起来完成整个应用程序。我们将使用非常轻量、简单的 Reactive Netty 作为 Web 服务器。要将我们的请求路由器集成到 Web 服务器中,我们需要将其转换为 HttpHandler。

file

接着这样来启动 Web 服务器:

file

其中 ReactorHttpHandlerAdapter 只是一个包装了 HttpHandler 的 Netty 中的类,其余的代码非常简单直白。我们创建一个新的 Web 服务器,监听 localhost 地址的8080端口,并且添加我们的 HTTP handler,实际上这是我们的请求路由器的入口。

好了!整个应用程序已经差不多了,完整的代码如下:

file

最后一行只是用来保持 JVM 进程一直运行。 你可能会发现整个应用程序启动飞快,这是因为没有任何组件扫描或配置注入发生,就像以前你们使用 Spring 会遇到的。

同时整个程序可以作为一个简单的 Java 应用程序来运行,不需要任何容器。

为了将整个应用打包和部署,我们仍然可以利用 Spring Maven 插件,只需执行以下操作:

file

此命令将生成一个包含所有依赖关系的 fat jar,可以在仅安装了 JRE 的环境来部署和执行:

file

另外,如果我们想查看整个应用的内存使用情况,大概只有32MB左右,包括了22MB的 metaspace(你们知道用来存放加载的 classes)和大约10MB的 heap。就像前面提到的,整个框架和运行时环境只需要很少的资源。

支持JSON

在上面的示例中,我们返回一个字符串作为响应,但是想返回 JSON 对象也非常容易。

让我们创建一个新的可以返回 JSON 的 API endpoint 来扩展我们的应用。这个 data class 非常简单,只有一个名为 name 的字符串类型的字段。为了避免写那些冗长的 Java 样板代码(就像你们厌恶的 setter, getter),我们使用 Project Lombok 特性:使用 @Data 注解。通过在类上添加此注解,我们可以透明得获得 getter,setters,equals 和 hashCode 方法,而无须手动实现。

file

然后,我们需要扩展我们的请求路由器,以便为 "/json" 路径的 GET 请求提供新的响应。 这可以通过在现有路由上调用 andRoute(...) 方法来完成。

file

我们还优化了一点代码,将新的返回 JSON 的 handler 以内连的方式声明,同时将 ok() 静态导入,这使得代码变得更简洁。

重新启动后,应用程序将通过 "/json" 路径返回 {"name": "world"},同时将响应头部中的内容类型(content-type)设置为 application/json。

应用上下文

你可能已经注意到整个代码中并没有定义应用上下文(Application Context)。是的,我们不再需要它!Spring WebFlux 中支持 RouterFunction,这样一个简单且轻量的 JSON 服务不再需要应用上下文。

测试

为了测试 reactive web application,Spring 提供了新的名为 WebTestClient 的客户端(类似于 MockMvc)。 我们将它绑定到我们的请求路由器上:

file

WebTestClient 有一组针对返回结果的断言,以验证返回状态码,返回体,以及内容类型等等。

总结

Spring 5 引入了新的编程范式用来开发小型的、轻量级的、微服务式 Web应用程序。 我们显式得定义请求路由器和请求处理函数,在完全不需要应用上下文的情况下快速运行并部署。

file

本文由博客一文多发平台 OpenWrite 发布!

热门的13个Java微服务框架 曾经的服务器领域有许多不同的芯片架构和操作系统,经过长期发展,Java的“一次编译,到处运行”使得它在服务器领域找到一席之地,成为程序员们的最爱 本文,我们将和大家分享13个可靠的Java微服务架构 1、Spring Boot Java构建Spring应用程序已经有很长一段时间了,Spring Boot是Spring的一个特定版本,它通过对配置细节的处理,使微服务构建更加简便。创建Spring ... 阅读详情

相关推荐

【CMU-自主导航与规划】Autonomous Exploration Development Environment 实战:从环境搭建到多场景测试

本文详细介绍了CMU开源自主导航开发环境(Autonomous Exploration Development Environment)的实战部署与测试。内容涵盖从Ubuntu与ROS环境搭建、仿真场景配置,到核心导航模块(地形分析、局部避障、航点跟踪)的深度解析,并演示了如何集成TARE探索与FAR规划等上层算法,最终指导连接真实SLAM与实车部署,完成多场景性能评估。

weixin_29215391的博客 707

java- 微服务

RPC是Remote Procedure Call的缩写 翻译为:远程过程调用目标是为了实现两台(多台)计算机\服务器,相互调用方法\通信的解决方案RPC只是实现远程调用的一套标准该标准主要规定了两部分内容1.通信协议2.序列化协议通信协议通信协议指的就是远程调用的通信方式实际上这个通知的方式可以有多种例如:写信,飞鸽传书,发电报在程序中,通信方法实际上也是有多种的,每种通信方式会有不同的优缺点序列化协议序列化协议指通信内容的格式,双方都要理解这个格式。

m0_74746843的博客 2160

神经网络基础概念总结(小白入门自用)

神经网络人工神经网络多层感知机激活函数反向传播算法损失函数权值初始化正则化方法 人工神经网络 人工神经元:人工神经元是人工神经网络的基本单元。模拟生物神经元,人工神经元有1个或者多个输入(模拟多个树突或者多个神经元向该神经元传递神经冲动);对输入进行加权求和(模拟细胞体将神经信号进行积累和树突强度不同);对输入之和使用激活函数计算活性值(模拟细胞体产生兴奋或者抑制);输出活性值并传递到下一个人工神经元(模拟生物神经元通过轴突将神经冲动输入到下一个神经元)。 人工神经网络:大量的人工神经元以某种链接方式得来的

qq_42011158的博客 650

Java微服务

在这里插入图片描述 架构演进: 一、开发环境&生成环境 1. 开发环境 平时在写代码时,大多都在是win10/win7/Mac,这些系统都可以称呼开发环境,我们会为了更高效的开发应用程序,安装很多的软件,会导致操作系统不安全,稳定性降低。 2. 生成环境 在生产环境中,操作系统不会采用win10/Mac,这种操作系统相对不安全,生成环境要面向全体用户的,生产环境是要面向用户的,一般会采用专业操作系统。 大多市面上使用的都是基于Linux版本的服务器操作系统Windows 2003 service 二

weixin_43999182的博客 1万+

通过 Android Framework 调用高通 Perf HAL 实现 CPU/GPU 动态调频策略

本文详细介绍了如何通过Android Framework调用高通Perf HAL实现CPU/GPU动态调频策略。文章涵盖HAL交互原理、环境搭建、Power HAL接口实现、PerformanceHintManager应用及温度功耗平衡处理,帮助开发者安全高效地进行性能优化,避免直接操作底层硬件的风险。

keras9composer的博客 259

Win10蓝屏代码critical process died的解决方法

critical process died”蓝屏错误是Win10操作系统中较为常见的问题之一。当遇到这一问题时,可以尝试通过修复当前系统、检查硬盘槽位或重新安装系统等方法来解决。本文详细介绍了这三种方法的操作步骤和注意事项,希望能帮助大家摆脱这一困扰。同时,也建议大家在日常使用中注意系统的维护和更新,以减少类似问题的发生。

mmoo_python的博客 9537

JAVA微服务基本知识

Spring Cloud封装了Netflix公司开发的Eureka模块来实现服务治理再传统rpc远程调用框架中,管理每个服务于服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务与服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的服务节点调用来协同产生最后的请求结果,每一个请求都会形成一条复杂的分布式服务调用链路,链路中任一环出现高延迟或者错误都会引起整个请求最后失败。

2401_89097141的博客 2199

匈牙利算法解决指派问题清晰流程

匈牙利算法解决指派问题清晰流程 百度词条上,指派问题(Assignment problem)是这么定义的:在满足特定指派要求条件下,使指派方案总体效果最佳。如:有若干项工作需要分配给若干人(或部门)来完成;有若干项合同需要选择若干个投标者来承包:有若干班级需要安排在若干教室里上课等。   一、做减法(归约): 行归约:每行元素减去该行最小元素。 列归约:每行元素减去该行最小元素。

siss0siss的博客 6万+

一文带你了解Java微服务的相关知识,值得收藏!

本来分布式架构基本满足了现在互联网的发展,一切都这么安静的发生着,但是大厂的可是永远不那么安分,依然进行着创新,想要进一步提高效率,所以之前仅从业务单元进行拆分,还是满足不了大厂的需求,所以就对业务进行了更加细粒度的拆分,而且每一个服务都可以独立部署,这就就是我们现在所说的微服务。通过这么多核心的组件就可以轻松的搭建起一个个微服务系统架构,由于都是一个生态内的技术,所以很多技术都很兼容,极大的降低了开发的门开,所以现在基本是互联网公司的,都上微服务架构了,接下来我们就挨个来看下这几个组件吧。

IT技术分享社区 940

1. BES2700ZP概述

恒玄BES2700采用RTX5操作系统,配合mindmics算法或者自研算法。

雪飞_海 4476

【文献阅读】使用深度语音后验改进独立于说话者的构音障碍可懂度分类

原文名称:本文探讨了利用DeepSpeech后验概率改进说话人无关的构音障碍可理解性分类方法。作者提出了一个基于DeepSpeech(一种端到端的语音转文本引擎)输出的新特征集,用于评估构音障碍患者的语音可理解性。这些新特征在说话人无关的情况下表现良好,能够更好地处理不同说话人的变异性。背景介绍:数据集:特征提取:实验设置:结果:本文提出的新特征集在说话人无关的构音障碍可理解性分类任务中表现出色,特别是在低可理解性和高可理解性类别上。未来的工作将集中在减少低可理解性和中可理解性类别之间的混淆,以进一步提高系

帅小柏的博客 452

Java 微服务详解及示例

Java 微服务通过 Spring Boot 和 Spring Cloud 提供了一套完整的解决方案,适合需要快速迭代、高可扩展的大型应用。实际开发中需结合 Docker 容器化和 Kubernetes 编排,以实现高效部署和管理。

weixin_68945098的博客 2565

手把手教你学PCIE(2.1.23)--PCIe基本概念:链路速率协商

链路速率协商是一个多步骤的过程,确保发送端和接收端之间的链路速率设置一致。通过初始化链路速率寄存器、发送和接收 TS2 序列、检测链路对端的存在、交换链路速率信息、确定最大链路速率和配置链路速率,可以确保 PCIe 设备之间的数据传输速度最大化,从而提高数据传输效率。初始化链路速率寄存器:设置支持的最大链路速率。发送和接收 TS2 序列:检测链路对端的存在。交换链路速率信息:发送和支持的最大链路速率。确定最大链路速率:选择最小值作为最终链路速率。配置链路速率:更新链路速率寄存器。

MHD0815的博客 1817

java spring 微服务,Java 微服务框架新选择:Spring 5

原标题:Java 微服务框架新选择:Spring 5在这篇文章中,我们将讨论即将发布的第五代 Spring 框架中的新概念—— “Functional Web Framework”,来看看它如何帮助我们构建轻量级的微服务。你可能会对标题中出现的 “Spring” 和 “微服务框架”感到惊讶。但是确实如此,Spring 5非常适合成为你 Java Web 微服务框架的新选择。首先,为了避免混淆让我们...

weixin_39879651的博客 96

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

java iot框架_Java 微服务框架新选择:Spring 5

在这篇文章中,我们将讨论即将发布的第五代 Spring 框架中的新概念—— “Functional Web Framework”,来看看它如何帮助我们构建轻量级的微服务。你可能会对标题中出现的 “Spring” 和 “微服务框架”感到惊讶。但是确实如此,Spring 5非常适合成为你 Java Web 微服务框架的新选择。首先,为了避免混淆让我们来对“微服务”中的“微”达成共识:简洁 - 无需样板...

weixin_39873177的博客 269

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

java微框架_Java 微服务框架新选择:Spring 5

在这篇文章中,我们将讨论即将发布的第五代 Spring 框架中的新概念—— “Functional Web Framework”,来看看它如何帮助我们构建轻量级的微服务。你可能会对标题中出现的 “Spring” 和 “微服务框架”感到惊讶。但是确实如此,Spring 5非常适合成为你 Java Web 微服务框架的新选择。首先,为了避免混淆让我们来对“微服务”中的“微”达成共识:简洁 - 无需样板...

weixin_30011833的博客 159

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

java服务器框架_Java 微服务框架新选择:Spring 5

Java 微服务框架新选择:Spring 5在这篇文章中,我们将讨论即将发布的第五代 Spring 框架中的新概念—— “Functional Web Framework”,来看看它如何帮助我们构建轻量级的微服务。你可能会对标题中出现的 “Spring” 和 “微服务框架”感到惊讶。但是确实如此,Spring 5非常适合成为你 Java Web 微服务框架的新选择。首先,为了避免混淆让我们来对“微...

weixin_39639096的博客 169

5本书,通过Spring Boot和Spring Cloud学习Java中的微服务

大家好,目前微服务非常热门,因为微服务非常适合云部署,并且越来越多的公司正在转向微服务和云。 “微服务”描述了一种软件设计模式,其中 应用程序是松耦合服务的集合。 这些服务 粒度很细,可以单独维护和缩放。 的 微服务架构是公共云的理想选择,其重点是 通过按需资源进行弹性扩展。 如果您是Java开发人员,并且想进一步了解Spring Boot和 Spring Cloud框架,...

编程故事的地方 1078

Java vs Go vs Node.js:microservices-framework-benchmark揭示不同语言框架性能差异

microservices-framework-benchmark是一个专注于主流微服务框架性能测试的开源项目,通过对吞吐量、延迟和传输效率等关键指标的对比,帮助开发者选择最适合的技术栈。本文将深入分析Java、Go和Node.js三大语言生态下主流框架的性能表现,为你的微服务架构决策提供权威参考。 ## 🏆 三大语言框架性能全景对比 以下是基于microservices-framework

gitblog_01001的博客 712

浅谈5款Java微服务开发框架

浅谈5款Java微服务开发框架

蓝影铁哥的博客 1509

Spring Boot教程之二:选择 Spring Boot 进行微服务开发的 7 大理由

选择 Spring Boot 进行微服务开发的 7 大理由微服务是小型、松散耦合的分布式服务。微服务架构是为了解决它使我们能够将大型应用程序分解为具有某些指定职责的可高效管理的小组件。它被认为是现代应用程序的基石。微服务可以用多种编程语言和框架编写,但我们知道 Spring Boot 是建立在传统 Spring 框架之上的。因此,它提供了 Spring 的所有功能。Spring Boot 是一个基于微服务的框架,可以在很短的时间内创建可用于生产的应用程序。

潜洋的专栏 2800

微服务治理框架的选择:对比Spring Cloud和Istio

导读:目前主流的微服务治理框架主要是Spring Cloud。而Istio作为新一代微服务框架,越来越受到关注。在本文中,我们分享如何选择这两种微服务框架。作者:魏新宇 宋志麒 杨金锋来源...

大数据 2731

5款Java微服务开源框架

1.pig 开源地址: https://gitee.com/log4j/pig 基于Spring Cloud、OAuth2.0、Vue的前后端分离的系统。 通用RBAC权限设计及其数据权限和分库分表 支持服务限流、动态路由、灰度发布、 支持常见登录方式, 多系统SSO登录, 提供配套视频开发教程 功能列表: 完善登录:账号密码模式、短信验证码模式、社交账号模式均整合Spring security ...

weixin_44571427的博客 2万+
下一篇: Java 多态的实现机制
JavaAQA
博客等级 码龄7年 1粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值