当前位置: 首页 > news >正文

Eureka介绍和使用

Eureka介绍和使用

  • 一、基本介绍
    • 1. Eureka是什么?
    • 2. Eureka的作用
    • 3. 常用使用场景
    • 4. Eureka的工作原理
    • 5. Eureka的优点
    • 6. 使用Eureka的注意事项
  • 二、eureka配置项解释
    • 1. eureka.instance.hostname
    • 2. eureka.instance.appname
    • 3. eureka.instance.instance-id
    • 4. eureka.client.serviceUrl.defaultZone
    • 5. eureka.server.enable-self-preservation
    • 6.eureka.client.registerWithEureka
    • 7.eureka.client.fetchRegistry
  • 三、Eureka使用详解及示例代码
    • 1. 环境准备
    • 2. 创建Eureka Server
      • 2.1. 创建Spring Boot项目
      • 2.2. 配置Eureka Server
      • 2.3. 启动Eureka Server
    • 3. 创建Eureka Client
      • 3.1. 添加Eureka Client依赖
      • 3.2. 配置Eureka Client
      • 3.3. 注册服务
    • 4. 使用Eureka进行服务发现
      • 4.1. 在另一个Eureka Client中发现服务
      • 4.2. 使用`@FeignClient`进行服务调用
    • 5. 总结

Eureka:Netflix的微服务注册中心

随着微服务的流行,服务的注册与发现成为了分布式系统中的关键组件。Netflix的Eureka是这一领域中的翘楚,为微服务架构提供了强大的服务治理功能。本文将详细介绍Eureka是什么,它的作用,常用的使用场景以及工作原理。

一、基本介绍

1. Eureka是什么?

Eureka是Netflix开发的一个开源的服务注册与发现框架。在微服务架构中,每个服务都需要知道其他服务的位置,而Eureka就提供了这样一个中心化的注册中心,让所有的服务都能够找到彼此。

2. Eureka的作用

  • 服务注册:每个微服务在启动时,都会在Eureka中进行注册,告诉Eureka自己的网络位置。
  • 服务发现:其他微服务需要调用某个服务时,会向Eureka询问该服务的位置,然后Eureka会返回该服务的网络地址。
  • 健康检查Eureka客户端会定时发送心跳到Eureka Server,以此证明自己的“健康”状态。如果Eureka Server在一段时间内没有收到某个服务的心跳,那么它会认为该服务已经宕机,将其从服务列表中移除。
  • 负载均衡:Eureka配合Ribbon或其他负载均衡工具,可以实现客户端的负载均衡。

3. 常用使用场景

  • 任何使用微服务架构的应用都可以使用Eureka作为服务注册与发现的解决方案。
  • 在云环境中,由于服务的IP地址经常变动,使用Eureka可以动态地获取服务地址。
  • 当系统中存在大量的微服务,并且需要频繁地互相调用时,Eureka能够提供高效的服务发现机制。

4. Eureka的工作原理

  • 服务注册:当微服务实例启动后,会向Eureka Server发送注册请求,携带自己的IP和端口等信息。Eureka Server接收到注册请求后,会将该服务的信息存储到注册表中。
  • 服务续约:为了避免因为网络分区导致的服务不可用问题,Eureka客户端会定时向Eureka Server发送心跳来续约自己的“租期”。
  • 服务获取:当其他服务需要调用某个服务时,会向Eureka Server请求获取该服务的网络地址。Eureka Server会从注册表中查找该服务的信息,并返回给请求者。
  • 服务下线:当微服务实例关闭或异常时,它会向Eureka Server发送下线请求。Eureka Server接收到请求后,会将该服务从注册表中移除。

5. Eureka的优点

  • 高可用性Eureka Server设计为高可用性,每个实例都能平等地提供服务注册和发现功能。多个Eureka Server可以相互复制注册表信息,形成集群,进一步提高系统的可用性。
  • 自我保护模式:在网络分区故障发生(网络不稳定)期间,Eureka客户端和Eureka Server之间无法正常通信,Eureka Server将会切换到自我保护模式。在这种模式下,Eureka Server会保护服务注册表中的信息,不再删除服务注册表中的数据,等到网络故障恢复后,再自动退出自我保护模式。
  • 与Spring Cloud集成EurekaSpring Cloud集成良好,为Spring Cloud微服务架构提供了服务注册与发现的解决方案。通过简单的配置,就能将Spring Boot构建的微服务应用注册到Eureka Server。

6. 使用Eureka的注意事项

  • 合理设置服务续约间隔:服务续约间隔决定了服务向Eureka Server发送心跳的频率。这个值设置得过小会增加网络负担,设置得过大可能会导致服务在Eureka Server上过早被标记为不可用。
  • 确保Eureka Server的高可用:Eureka Server的高可用是保证整个系统稳定运行的关键。在生产环境中,通常建议部署多个Eureka Server实例,形成集群。
  • 注意网络分区问题:网络分区问题可能导致服务无法正常续约,进而被Eureka Server标记为不可用。在这种情况下,需要尽快解决网络问题,或者考虑使用Eureka的自我保护模式。

二、eureka配置项解释

Eureka的配置文件设置对于Eureka的服务注册与发现功能至关重要。下面是Eureka的一些关键配置项以及它们的解释和配置方法:

1. eureka.instance.hostname

此设置用于配置Eureka实例的主机名。您可以将其设置为本地主机名或指定的主机名。

配置示例:

eureka:instance:hostname: localhost

2. eureka.instance.appname

此设置用于配置在Eureka服务中注册的应用名称。

配置示例:

eureka:instance:appname: my-service

3. eureka.instance.instance-id

此设置用于配置Eureka实例的唯一ID。您可以根据需要使用默认设置或自定义唯一ID。

配置示例:

eureka:instance:instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}

4. eureka.client.serviceUrl.defaultZone

此设置用于配置Eureka Server的地址。您需要指定Eureka Server的主机名和端口。

配置示例:

eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/

5. eureka.server.enable-self-preservation

这个设置用于开启或关闭Eureka Server的自我保护模式。当设置为true时,即使Eureka Server在短时间内丢失过多客户端,也不会删除失去连接的客户端。这有助于提高系统的可用性。

配置示例:

eureka:server:enable-self-preservation: false

6.eureka.client.registerWithEureka

这个配置用来决定Eureka客户端是否向Eureka Server注册自己。如果设置为true,该客户端会向Eureka Server注册自己的信息,这样其他服务就可以通过Eureka Server找到它。如果设置为false,则该客户端不会注册到Eureka Server。

示例配置:

eureka:client:registerWithEureka: false

通常情况下,Eureka Server会将此值设置为false,因为Eureka Server不需要向自己注册。而一般的Eureka Client应将其设置为true以完成服务注册。

7.eureka.client.fetchRegistry

这个配置用来决定Eureka客户端是否从Eureka Server获取服务注册信息。如果设置为true,该客户端会从Eureka Server获取服务注册表的信息,这样它就可以知道其他可用的服务实例。如果设置为false,则该客户端不会从Eureka Server获取服务注册表信息。

示例配置:

eureka:client:fetchRegistry: false

对于Eureka Server,通常将此值设置为false,因为它不需要获取自己的服务注册表信息。而对于需要发现其他服务的Eureka Client,应将其设置为true

这两个配置项在Eureka的客户端和服务器角色中起着重要的作用,正确地配置它们可以确保服务的正确注册和发现。在配置时需要根据实例的角色(服务器或客户端)和需求来选择合适的值。

以上就是Eureka的一些重要配置项及其配置方法。请注意,这些配置项通常需要在您的Spring Boot应用的application.ymlapplication.properties文件中进行设置。具体的配置项可能会因您的实际需求和Eureka的版本而有所不同,所以请根据实际情况进行调整。

三、Eureka使用详解及示例代码

本文将指导您如何使用Eureka进行服务注册与发现。我们将通过示例代码,展示如何在Spring Boot应用中集成Eureka。

1. 环境准备

首先,确保您已经安装了以下环境:

  • JDK 1.8 或更高版本
  • Maven 3.0 或更高版本
  • Spring Boot 2.x

2. 创建Eureka Server

首先,我们创建一个Eureka Server。这将作为服务的注册中心。

2.1. 创建Spring Boot项目

创建一个新的Spring Boot项目,并在pom.xml中添加Eureka Server的依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

2.2. 配置Eureka Server

application.yml中配置Eureka Server:

server:port: 8761 
eureka:instance:hostname: localhost   #此设置用于配置Eureka实例的主机名。您可以将其设置为本地主机名或指定的主机名。client:registerWithEureka: false   # 这个配置用来决定Eureka客户端是否向Eureka Server注册自己。如果设置为true,该客户端会向Eureka Server注册自己的信息,这样其他服务就可以通过Eureka Server找到它。如果设置为false,则该客户端不会注册到Eureka Server。通常情况下,Eureka Server会将此值设置为false,因为Eureka Server不需要向自己注册。而一般的Eureka Client应将其设置为true以完成服务注册。fetchRegistry: falseserviceUrl:   # 此设置用于配置Eureka Server的地址。需要指定Eureka Server的主机名和端口。defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

2.3. 启动Eureka Server

在主类上添加@EnableEurekaServer注解,并启动应用:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}
}

3. 创建Eureka Client

接下来,我们创建一个Eureka Client,这将是我们要注册的服务。

3.1. 添加Eureka Client依赖

在另一个Spring Boot项目的pom.xml中添加Eureka Client的依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

3.2. 配置Eureka Client

application.yml中配置Eureka Client:

server:port: 8080
spring:application:name: my-service   # 此设置用于配置在Eureka服务中注册的应用名称。
eureka:client:serviceUrl:   # 此设置用于配置Eureka Server的地址。需要指定Eureka Server的主机名和端口。defaultZone: http://localhost:8761/eureka/ 

3.3. 注册服务

在主类上添加@EnableEurekaClient注解,并启动应用:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@SpringBootApplication
@EnableEurekaClient
@RestController
public class EurekaClientApplication {public static void main(String[] args) {SpringApplication.run(EurekaClientApplication.class, args);}@GetMapping("/hello")public String hello() {return "Hello from Eureka Client!";}
}

现在,您已经成功创建了一个Eureka Server和一个Eureka Client。启动Eureka Server,然后启动Eureka Client,您将看到Client成功注册到Server上。通过访问Eureka Server的管理界面(默认地址:http://localhost:8761/),您将看到已注册的服务列表。同时,其他服务也可以通过Eureka Server发现这个Client服务,并进行调用。

4. 使用Eureka进行服务发现

在微服务架构中,服务之间的调用经常是动态的,我们不知道具体要调用哪个实例,这时候就需要Eureka的服务发现功能。

4.1. 在另一个Eureka Client中发现服务

假设我们有一个名为my-service-consumer的另一个Eureka Client,它需要调用上面创建的my-service

首先,确保my-service-consumer也添加了Eureka Client的依赖,并进行了相应的配置。

4.2. 使用@FeignClient进行服务调用

Spring Cloud提供了Feign作为HTTP客户端进行服务间的调用,它基于Ribbon和Hystrix,并整合了Eureka,简化了服务调用的过程。

my-service-consumer中,创建一个接口并使用@FeignClient注解:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;@FeignClient(value = "my-service")
public interface MyServiceClient {@GetMapping("/hello")String hello();
}

这里,value = "my-service"表示要调用的服务的名称,它应该与在Eureka中注册的服务名称相匹配。

接着,你可以在my-service-consumer的任何类中注入并使用这个接口:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ConsumerController {private final MyServiceClient myServiceClient;@Autowiredpublic ConsumerController(MyServiceClient myServiceClient) {this.myServiceClient = myServiceClient;}@GetMapping("/call-my-service")public String callMyService() {return myServiceClient.hello(); // 这里将调用my-service的/hello接口}
}

5. 总结

通过上面的示例,我们展示了如何在Spring Boot应用中集成Eureka,并进行服务注册与发现。在实际应用中,您可能会有多个Eureka Server实例和多个Eureka Client实例。确保在生产环境中适当配置这些实例以保证高可用性。同时,使用Feign可以简化服务间的调用过程。

请注意,本文提供的示例代码仅用于演示目的。在生产环境中使用时,请根据实际需求进行适当的调整和优化。

相关文章:

Eureka介绍和使用

Eureka介绍和使用 一、基本介绍1. Eureka是什么?2. Eureka的作用3. 常用使用场景4. Eureka的工作原理5. Eureka的优点6. 使用Eureka的注意事项 二、eureka配置项解释1. eureka.instance.hostname2. eureka.instance.appname3. eureka.instance.instance-id4. eureka.client.se…...

Incremental Object Detection via Meta-Learning【论文解析】

Incremental Object Detection via Meta-Learning 摘要1 介绍2 相关工作3 方法3.1 问题描述3.2元学习梯度预处理3.3增量式目标检测器摘要 摘要:在真实世界的情境中,目标检测器可能会不断遇到来自新类别的物体实例。当现有的目标检测器应用于这种情景时,它们对旧类别的性能会…...

AI大模型时代网络安全攻防对抗升级,瑞数信息变革“下一代应用与数据安全”

AI与大模型技术加速普及&#xff0c;安全领域也在以创新视角聚焦下一代应用安全WAAP变革&#xff0c;拓展新一代数据安全领域。近日瑞数信息重磅发布了瑞数全新API扫描器、API安全审计、数据安全检测与应急响应系统及分布式数据库备份系统四大新品。此次发布在延续瑞数信息Bot自…...

后端接口接收对象和文件集合,formdata传递数组对象

0 问题 后端接口需要接收前端传递过来的对象和文件集合&#xff1b;对象中存在数组对象 1 前端和后端 前端只能使用formdata来传递参数&#xff0c;后端不使用RequestBody注解 2 formdata传递数组对象 2.1 多个参数对象数组 addForm: {contactInfo: [{contactPerson: ,…...

python json包

当前大语言模型比较火热&#xff0c;很多数据是以json格式进行数据传递的。python包中的json包就是一个处理Json格式数专业包。 本文主要介绍这个包中的四个函数&#xff0c;dump,dumps,load,loads 序列化为Json dump&#xff1a;将Python对象序列化为Json文件 案例 我们有如…...

基于 NGram 分词,优化 Es 搜索逻辑,并深入理解了 matchPhraseQuery 与 termQuery

基于 NGram 分词&#xff0c;优化 Es 搜索逻辑&#xff0c;并深入理解了 matchPhraseQuery 与 termQuery 前言问题描述排查索引库分词&#xff08;发现问题&#xff09;如何去解决这个问题&#xff1f;IK 分词器NGram 分词器使用替换 NGram 分词器后进行测试matchPhraseQuery 查…...

PivotNet:Vectorized Pivot Learning for End-to-end HD Map Construction

参考代码&#xff1a;BeMapNet。PS&#xff1a;代码暂未放出&#xff0c;关注该仓库动态 动机和主要贡献 在MapTR系列的算法中将单个车道线建模为固定数量的有序点集&#xff08;对应下图Evenly-based&#xff09;&#xff0c;这样的方式对于普通道路场景具备一定适应性。但是…...

阿里云安全恶意程序检测

阿里云安全恶意程序检测 赛题理解赛题介绍赛题说明数据说明评测指标 赛题分析数据特征解题思路 数据探索数据特征类型数据分布箱型图 变量取值分布缺失值异常值分析训练集的tid特征标签分布测试集数据探索同上 数据集联合分析file_id分析API分析 特征工程与基线模型构造特征与特…...

Xcode中如何操作Git

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是全栈工…...

浅述边缘计算场景下的云边端协同融合架构的应用场景示例

云计算正在向一种更加全局化的分布式节点组合形态进阶&#xff0c;而边缘计算是云计算能力向边缘侧分布式拓展的新触角。随着城市建设进程加快&#xff0c;海量设备产生的数据&#xff0c;若上传到云端进行处理&#xff0c;会对云端造成巨大压力。如果利用边缘计算来让云端的能…...

C++中禁止在栈中实例化的类

C中禁止在栈中实例化的类 栈空间通常有限。如果您要编写一个数据库类&#xff0c;其内部结构包含数 TB 数据&#xff0c;可能应该禁止在栈上实例化它&#xff0c;而只允许在自由存储区中创建其实例。为此&#xff0c;关键在于将析构函数声明为私有的&#xff1a; class Monst…...

MsgPack和Protobuf

MsgPack可以在C下序列化类&#xff0c;Protobuf只能在C#下序列化类 Cocos Creator安装msgpack-lite 项目文件夹执行 rpm -i msgpack-lite...

自定义类型联合体

目录 联合体联合体类型的声明联合体的特点相同成员的结构体和联合体对比联合体大小的计算联合体的应用联合的一个练习 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x1f978;&#x1f978;&#x1f…...

【Shell 系列教程】Shell printf 命令( 六)

文章目录 往期回顾Shell printf 命令printf 的转义序列 往期回顾 【Shell 系列教程】shell介绍&#xff08;一&#xff09;【Shell 系列教程】shell变量&#xff08;二&#xff09;【Shell 系列教程】shell数组&#xff08;三&#xff09;【Shell 系列教程】shell基本运算符&a…...

2022年电工杯数学建模B题5G网络环境下应急物资配送问题求解全过程论文及程序

2022年电工杯数学建模 B题 5G网络环境下应急物资配送问题 原题再现&#xff1a; 一些重特大突发事件往往会造成道路阻断、损坏、封闭等意想不到的情况&#xff0c;对人们的日常生活会造成一定的影响。为了保证人们的正常生活&#xff0c;将应急物资及时准确地配送到位尤为重要…...

git reflog 恢复git reset --hard 回退的内容

首先使用 git reflog 查看处理的历史&#xff0c;历史是由新到旧排列的&#xff0c;找到回退前的commit的id&#xff0c;找的过程可以只关注HEAD的部分&#xff0c;HEAD括号中的值越大越旧&#xff0c;越小越新。 找到后执行以下命令 git reset --hard 你的commit_id 然后…...

kali Linux中更换为阿里镜像源

准备&#xff1a; kali Linux 阿里源链接 deb kali安装包下载_开源镜像站-阿里云 kali-rolling main non-free contrib deb-src kali安装包下载_开源镜像站-阿里云 kali-rolling main non-free contrib 配置&#xff1a; 打开kali 终端输入&#xff1a;sudo nano /etc/apt…...

【每日一题】移除链表元素(C语言)

移除链表元素&#xff0c;链接奉上 目录 思路&#xff1a;代码实现&#xff1a;链表题目小技巧&#xff1a; 思路&#xff1a; 在正常情况&#xff1a; 下我们移除链表元素时&#xff0c;需要该位置的前结点与后节点&#xff0c; 在特别情况时&#xff1a; 例如 我们发现&…...

stm32 ADC

目录 简介 stm32的adc 框图 ①电压输入范围 ②输入通道 ​编辑③ADC通道 ④ADC触发 ⑤ADC中断 ⑥ADC数据 ⑦ADC时钟 ADC的四种转换模式 hal库代码 标准库代码 简介 自然界的信号几乎都是模拟信号&#xff0c;比如光亮、温度、压力、声音&#xff0c;而为了方便存储、…...

linux网络服务综合项目

前期环境配置 #主要写了192.168.146.130的代码&#xff0c;131的配置代码和其一样 [rootserver ~]# nmtui #通过图形化界面修改ens160的ip 192.168.146.130 [rootserver ~]# hostnamectl set-hostname Server-Web #修改130主机名…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...