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

Spring Cloud Eureka 服务注册与发现

Spring Cloud Eureka 服务注册与发现

  • 一、Eureka基础知识概述
    • 1.Eureka两个核心组件
    • 2.Eureka 服务注册与发现
  • 二、Eureka单机搭建
  • 三、Eureka集群搭建
  • 四、心跳续约
  • 五、Eureka自我保护机制


在这里插入图片描述

一、Eureka基础知识概述

1.Eureka两个核心组件

  • Eureka Server :服务注册中心,主要用于提供服务注册功能。
    当微服务启动时,会将自己的服务注册 到 Eureka Server。Eureka Server 维护了一个可用服务列表,存储了所有注册到 Eureka Server 的可用服务的信息,这些可用服务可以在 Eureka Server 的管理界面中直观看到
  • Eureka Client :客户端,通常指的是微服务系统中各个微服务,主要用于和 Eureka Server 进行交互。
    在微服务应用启动后,Eureka Client 会向 Eureka Server 发送心跳(默认周期为 30 秒)。若 Eureka Server 在多个心跳周期内没有接收到某个 Eureka Client 的心跳,Eureka Server 将它从可用服务列表中移除(默认 90 秒)

Eureka的心跳机制主要用于确保客户端(服务提供者)与服务器(服务注册中心)之间的连接活性。客户端启动后,会定期向服务器发送心跳数据,以告知服务器自己仍然处于活动状态


2.Eureka 服务注册与发现

在这里插入图片描述

  • 服务注册中心(Register Service): 它是一个 Eureka Server,用于提供服务注册和发现功能。
  • 服务提供者(Provider Service): 它是一个 Eureka Client,用于提供服务。它将自己提供的服务注册到服务注册中心,以供服务消费者发现。
  • 服务消费者(Consumer Service): 它是一个 Eureka Client,用于消费服务。它可以从服务注册中心获取服务列表,调用所需的服务。

Eureka 实现服务注册与发现的流程

  1. 搭建一个Eureka Server作为服务注册中心
  2. 服务提供者Eureka Client启动时,会把当前服务器的信息以服务名(spring.application.name)的方式注册到服务注册中心
  3. 服务消费者Eureka Client启动时,也会向服务注册中心注册
  4. 服务消费者还会获取一份可用路由服务列表,该列表中包含了所有注册到服务注册中心的服务信息(包括服务提供者和自身的信息)
  5. 在获得了可用服务列表后,服务消费者通过 HTTP 或消息中间件远程调用服务提供者提供的服务。
  6. 服务注册中心(Eureka Server)所扮演的角色十分重要,它是服务提供者和服务消费者之间的桥梁。服务提供者只有将自己的服务注册到服务注册中心才可能被服务消费者调用,而服务消费者也只有通过服务注册中心获取可用服务列表后,才能调用所需的服务。

二、Eureka单机搭建

1.构建父模块和三个子模块 分别为注册中心 eureka-service 仓储模块stock-service 订单模块 order-service
在这里插入图片描述


2.父模块pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>cloud-02-Eureka-parent</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><modules><module>cloud-eureka-service</module><module>cloud-stock-service</module><module>cloud-order-service</module></modules><!-- 统一管理jar包版本 --><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><junit.version>4.12</junit.version><log4j.version>1.2.17</log4j.version><lombok.version>1.18.22</lombok.version><mysql.version>8.0.24</mysql.version><druid.version>1.2.8</druid.version><mybatis-plus.version>3.0.7.1</mybatis-plus.version></properties><dependencies><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.8</version></dependency><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-jdbc --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus.version}</version><optional>true</optional><exclusions><exclusion><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId></exclusion></exclusions></dependency></dependencies><!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version  --><dependencyManagement><dependencies><!--spring boot 2.2.2--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.2.2.RELEASE</version><type>pom</type><scope>import</scope></dependency><!--spring cloud Hoxton.SR1--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR1</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><addResources>true</addResources></configuration></plugin></plugins></build>
</project>

3.对cloud-eureka-service注册中心操作
3.1 pom.xml文件

	<dependencies><!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies>

3.2 主启动类

// 添加数据库和 druid 却未配置
// 则添加 exclude = {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class}
// 则启动报错
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class})
@EnableEurekaServer//告诉服务器我是一个注册中心
public class EurekaServiceApplication {public static void main(String[] args) {SpringApplication.run(EurekaServiceApplication.class,args);}
}

3.3 application.yml

server:port: 8001
eureka:instance:hostname: 127.0.0.1  #eureka服务端的实例名字127.0.0.1 或 localhostclient:#表识不向注册中心注册自己register-with-eureka: false#表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务fetch-registry: falseservice-url:#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址#服务注册位置 http://127.0.0.1:8001/eureka/defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

4.对仓储模块cloud-stock-service操作
4.1 pom.xml

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

4.2 主启动类

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class})
@EnableEurekaClient//需要使用Eureka注册中心添加此注解
public class StockServiceApplication {public static void main(String[] args) {SpringApplication.run(StockServiceApplication.class,args);}
}

4.3 application.yml

server:port: 9001
spring:application:name: cloud-stock-service
eureka:client:# 向服务端注册register-with-eureka: true# 需要检索fetchRegistry: trueservice-url:defaultZone: http://localhost:8001/eureka

4.4 StockController

@RestController
@RequestMapping("/stock")
public class StockController {@GetMapping("/subStock")public String subStock(){System.out.println("库存减1");return "库存减1";}
}

5.对订单模块cloud-order-service操作
5.1 pom.xml文件

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

5.2 主启动类

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class})
@EnableEurekaClient
public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class,args);}
}

5.3 application.yml

server:port: 7001
spring:application:name: cloud-order-servce
eureka:client:# 向服务端注册register-with-eureka: true# 需要检索fetchRegistry: trueservice-url:defaultZone: http://localhost:8001/eureka/

5.4 OrderController

@RestController
@RequestMapping("/order")
public class OrderController {//这里特别提醒 `http://` 千万别忘加 本人因为这个错误找了很长时间 。。。。//CLOUD-STOCK-SERVICE 这里是eureka注册中心的名称private static final String HOST = "http://CLOUD-STOCK-SERVICE";@Autowiredprivate RestTemplate restTemplate;@GetMapping("/addOrder")public String addOrder(){System.out.println("订单已完成");return restTemplate.getForObject(HOST + "/stock/subStock",String.class);}
}

5.5 RestTemplate配置类

@Configuration
public class ApplicationConfig {@Bean@LoadBalanced//负载均衡器public RestTemplate restTemplate(){return new RestTemplate();}
}

6.启动设置

我用的是idea 2021 ,多应用启动设置在如下位置
在这里插入图片描述
7.启动
7.1 先启动服务注册中心cloud-eureka-service 访问localhost:8001

在这里插入图片描述

7.2 在以端口号为9001和 9002 分别启动 cloud-stock-service
在yml文件 server.port更改 启动完成9001 更改端口号为9002 在启动一次 再次访问localhost:8001

在这里插入图片描述
7.3 在以端口号为7001和 7002 分别启动 cloud-order-service ,和 7.2更改方式一样 访问 localhost:8001

在这里插入图片描述
8. **测试 **
8.1 访问 localhost:7001/order/addOrder
在这里插入图片描述
8.2 观察控制台,当我们多少刷新访问 localhost:7001/order/addOrder 则会出现9001和9002交替处理请求(轮循),缓解服务器压力,选择服务规则和 @LoadBalanced 负载均衡器有关
在这里插入图片描述

试着访问localhost:7002,结果相同


三、Eureka集群搭建

在微服务架构中,一个系统往往由十几甚至几十个服务组成,若将这些服务全部注册到同一个 Eureka Server 中,就极有可能导致 Eureka Server 因不堪重负而崩溃,最终导致整个系统瘫痪。解决这个问题最直接的办法就是部署 Eureka Server 集群。

1.新建cloud-eureka-server-2和cloud-eureka-server-3
在这里插入图片描述
2.修改映射配置

打开 C:\Windows\System32\drivers\etc 目录下的hosts文件 修改映射配置添加进hosts文件
在这里插入图片描述
3.更改yml文件
3.1 cloud-eureka-service-2的yml文件

server:port: 8002
eureka:instance:hostname: eureka8002.com  #eureka服务端的实例名字client:#表识不向注册中心注册自己register-with-eureka: false#表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务fetch-registry: falseservice-url:#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址defaultZone: http://eureka8003.com:8003/eureka/

3.2 cloud-eureka-service-2的yml文件

server:port: 8003
eureka:instance:hostname: eureka8003.com  #eureka服务端的实例名字client:#表识不向注册中心注册自己register-with-eureka: false#表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务fetch-registry: falseservice-url:#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址defaultZone: http://eureka8002.com:8002/eureka/

3.3 cloud-order-service的yml文件

server:port: 7001
spring:application:name: cloud-order-servce
eureka:client:# 向服务端注册register-with-eureka: true# 需要检索fetchRegistry: trueservice-url:defaultZone: http://localhost:8002/eureka,http://localhost:8003/eureka

3.3 cloud-stock-service的yml文件

server:port: 9001
spring:application:name: cloud-stock-service
eureka:client:# 向服务端注册register-with-eureka: true# 需要检索fetchRegistry: trueservice-url:defaultZone: http://localhost:8002/eureka,http://localhost:8003/eureka

4.分别为cloud-eureka-service-2和cloud-eureka-service-3添加启动类

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class})
@EnableEurekaServer//告诉服务器我是一个注册中心
public class EurekaServiceApplication2 {public static void main(String[] args) {SpringApplication.run(EurekaServiceApplication2.class,args);}
}
-----------------------------------------------------------------------------------------------------------------@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class})
@EnableEurekaServer//告诉服务器我是一个注册中心
public class EurekaServiceApplication3 {public static void main(String[] args) {SpringApplication.run(EurekaServiceApplication3.class,args);}
}

5.启动
5.1 启动cloud-eureka-service-2和cloud-eureka-service-3
5.1.1 访问localhost:8002
在这里插入图片描述
5.1.2 访问localhost:8003
在这里插入图片描述


5.2 启动cloud-order-service和 端口号为9001和9002的cloud-stock-service集群服

5.2.1 访问localhost:8002
在这里插入图片描述

5.2.2 访问localhost:8003
在这里插入图片描述


6.测试 多次访问localhost:7001 观察控制台
在这里插入图片描述


以上方式可以形成一组互相注册的 Eureka Server 集群,当服务提供者发送注册请求到 Eureka Server 时,Eureka Server 会将请求转发给集群中所有与之相连的 Eureka Server 上,以实现 Eureka Server 之间的服务同步。

在这里插入图片描述

通过服务同步,服务消费者可以在集群中的任意一台 Eureka Server 上获取服务提供者提供的服务。这样,即使集群中的某个服务注册中心发生故障,服务消费者仍然可以从集群中的其他 Eureka Server 中获取服务信息并调用,而不会导致系统的整体瘫痪,这就是 Eureka Server 集群的高可用性。


四、心跳续约

“心跳”指的是一段定时发送的自定义信息,让对方知道自己“存活”,以确保连接的有效性。大部分 CS 架构的应用程序都采用了心跳机制,服务端和客户端都可以发心跳。通常情况下是客户端向服务器端发送心跳包,服务端用于判断客户端是否在线

心跳续约是指服务实例(Eureka客户端)定期向Eureka服务器发送心跳包,以证明其仍然在线并愿意继续提供服务。Eureka服务器会根据这些心跳包来更新服务实例的活跃状态,并维护一个可用的服务实例列表。

在这里插入图片描述
功能介绍

Spring Cloud A 和 Spring Cloud B可以看作两个服务的提供者
Spring Cloud C 相当于 服务的消费者 定时(默认30秒)获取服务列表
registry服务注册列表 里面存储的是 各个注册服务的 名称 ip 端口号
readWriteCacheMap 会实时同步registry注册列表中的数据
readOnlyCacheMap 默认每30秒去同步一次readWriterCacheMap对象中的数据


详细流程

  • A和B 服务 向Eureka Service 服务注册列表中注册服务 将自己的服务名称 ip + 端口号注册到 registry服务注册列表。
  • A和B每隔30秒 (默认30秒) 发送 一次心跳任务告诉Eureka 我还活着, registry服务注册列表 同步数据到readWriteCacheMap
  • C 服务 通过readOnlyCacheMap 每30秒拉去一次注册表数据,这个数据不是同步的而是30秒(默认30秒)更新一次,这也是有时我们会在UI界面上看到服务注册成功,调用时却出现错误的原因。同理,服务下线也存在同样的问题,服务已经下线了,但是还是有客户端在调用已经下线的服务,这时就会出现连接拒绝的错误。
  • 我们在Eureka UI页面上看到的注册信息,实际上并没有走readOnlyCacheMap,而是直接通过registry服务注册列表获取,所以我们能够在Eureka UI页面实时的看到注册的新服务。
  • 服务续约默认是30秒 ,定时请理60秒清理一次超过90秒未续约的服务,也就是说在连续3次丢失心跳后会被Eureka Server的evict线程清理,最极端的情况,服务下线后,可能需要延迟180s之后,Eureka Server中的registry对象才会被更新。

综上分析,在非手动清除的情况下,缓存需要180秒才能感知下线的服务,这种情况在生产环境中非常严重。


上述问题中,我们可以更改默认值,来解决感知下线服务时间过长问题

Eureka注册中心

eureka:server:#清理无效服务间隔 (默认60秒)eviction-interval-timer-in-ms: 1000#同步readWrite到readOnly间隔(默认30秒)response-cache-update-interval-ms: 10000#Client直接从readWriteCacheMap更新服#use-read-only-response-cache: false

服务提供者

eureka:instance:# Eureka注册中心(服务端)在收到客户端心跳之后,#等待下一次心跳的超时时间,如果在这个时间内没有收到下次心跳,则移除该客户端。(默认90秒)lease-expiration-duration-in-seconds: 5# 客户端向注册中心发送心跳的时间间隔(默认30秒)lease-renewal-interval-in-seconds: 2

五、Eureka自我保护机制

Eureka的自我保护机制是一种应对网络异常的安全保护措施,宁可同时保留所有微服务(健康的服务和不健康的服务都会保留)也不盲目移除任何健康的服务。

当我们在本地调试基于 Eureka 的程序时,Eureka 服务注册中心很有可能会出现红色警告。
在这里插入图片描述

  • 实际上,这个警告是触发了 Eureka 的自我保护机制而出现的。默认情况下,如果 Eureka Server 在一段时间内没有接收到某个服务提供者的心跳,就会将这个服务提供者提供的服务从服务注册表中移除。 这样服务消费者就再也无法从服务注册中心中获取到这个服务了,更无法调用该服务。

  • 但在实际的分布式微服务系统中,健康的服务也有可能会由于网络故障(例如网络延迟、卡顿等原因)而无法与 Eureka Server正常通讯。若此时 Eureka Server因为没有接收心跳而误将健康的服务从服务列表中移除,这显然是不合理的。而 Eureka 的自我保护机制就是来解决此问题的。

  • 所谓 “Eureka 的自我保护机制”,其中心思想就是“好死不如赖活着”。如果 Eureka Server 在一段时间内没有接收到 Eureka Client 的心跳,那么 Eureka Server 就会开启自我保护模式,将所有的 Eureka Client 的注册信息保护起来,而不是直接从服务注册表中移除。一旦网络恢复,这些 Eureka Client 提供的服务还可以继续被服务消费者消费。


默认情况下,Eureka 的自我保护机制是开启的,如果想要关闭,则需要在配置文件中添加以下配置

eureka:server:# false 关闭 Eureka 的自我保护机制,默认是开启enable-self-preservation: false 

需要注意的是:

Eureka 的自我保护机制也存在弊端。如果在 Eureka 自我保护机制触发期间,服务提供者提供的服务出现问题,那么服务消费者就很容易获取到已经不存在的服务进而出现调用失败的情况。此时,我们可以通过客户端的容错机制来解决此问题

相关文章:

Spring Cloud Eureka 服务注册与发现

Spring Cloud Eureka 服务注册与发现 一、Eureka基础知识概述1.Eureka两个核心组件2.Eureka 服务注册与发现 二、Eureka单机搭建三、Eureka集群搭建四、心跳续约五、Eureka自我保护机制 一、Eureka基础知识概述 1.Eureka两个核心组件 Eureka Server &#xff1a;服务注册中心…...

【WPF】Prism学习(三)

Prism Commands 1.复合命令&#xff08;Composite Commanding&#xff09; 这段内容主要介绍了在应用程序中如何使用复合命令&#xff08;Composite Commands&#xff09;来实现多个视图模型&#xff08;ViewModels&#xff09;上的命令。以下是对这段内容的解释&#xff1a; …...

1+X应急响应(网络)系统加固:

系统加固&#xff1a; 数据库的重要性&#xff1a; 数据库面临的风险&#xff1a; 数据库加固&#xff1a; 业务系统加固&#xff1a; 安全设备加固&#xff1a; 网络设备加固&#xff1a;...

使用 Grafana api 查询 Datasource 数据

一、使用grafana 的api 接口 官方API 二、生成Api key 点击 Administration -》Users and accss -》Service accounts 进入页面 点击Add service account 创建 service account 点击Add service account token 点击 Generate token , 就可以生成 api key 了 三、进入grafana…...

【电子设计】按键LED控制与FreeRTOS

1. 安装Keilv5 打开野火资料,寻找软件包 解压后得到的信息 百度网盘 请输入提取码 提取码:gfpp 安装526或者533版本都可以 下载需要的 F1、F4、F7、H7 名字的 DFP pack 芯片包 安装完 keil 后直接双击安装 注册操作,解压注册文件夹后根据里面的图示步骤操作 打开说明 STM…...

JMeter中添加请求头

在JMeter中添加请求头的步骤如下&#xff1a; 1.打开HTTP信息头管理器 &#xff1a; 首先&#xff0c;你需要进入JMeter的HTTP请求组件。这可以通过在HTTP请求测试元素上右键点击&#xff0c;然后选择“添加 > 配置元件 > HTTP信息头管理器”来完成。 2.添加新的请求头…...

VMD + CEEMDAN 二次分解,CNN-LSTM预测模型

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较 全是干货 | 数据集、学习资料、建模资源分享&#xff01; EMD变体分解效果最好算法——CEEMDAN&#xff08;五&#xff09;-CSDN博客 拒绝信息泄露&#xff01;VMD滚动分…...

【Linux系统编程】第四十六弹---线程同步与生产消费模型深度解析

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、Linux线程同步 1.1、同步概念与竞态条件 1.2、条件变量 1.2.1、认识条件变量接口 1.2.2、举例子认识条件变量 1.2.3、…...

VoIP是什么?

IP 语音 (VoIP)&#xff08;Voice over Internet Protocol&#xff09; 是一种通过互联网拨打电话的方法。与旧的固定电话系统不同&#xff0c;互联网并非设计用于在连接的人之间实时传输音频信号。必须构建专门的技术和协议才能使之成为可能&#xff0c;这些技术和协议构成了 …...

MySQL 中的集群部署方案

文章目录 MySQL 中的集群部署方案MySQL ReplicationMySQL Group ReplicationInnoDB ClusterInnoDB ClusterSetInnoDB ReplicaSetMMMMHAGalera ClusterMySQL ClusterMySQL Fabric 总结参考 MySQL 中的集群部署方案 MySQL Replication MySQL Replication 是官方提供的主从同步方…...

《设计模式》创建型模式总结

目录 创建型模式概述 Factory Method: 唯一的类创建型模式 Abstract Factory Builder模式 Prototype模式 Singleton模式 最近在参与一个量化交易系统的项目&#xff0c;里面涉及到用java来重构部分vnpy的开源框架&#xff0c;因为是框架的搭建&#xff0c;所以会涉及到像…...

Conda安装与使用中的若干问题记录

Conda安装与使用中的若干问题记录 1.Anaconda 安装失败1.1.问题复述1.2.问题解决&#xff08;安装建议&#xff09; 2.虚拟环境pip install未安装至本虚拟环境2.1.问题复述2.2.问题解决 3.待补充 最近由于工作上的原因&#xff0c;要使用到Conda进行虚拟环境的管理&#xff0c;…...

人力资源招聘系统的革新之路:从传统到智能的转变

在全球化与数字化交织的今天&#xff0c;企业间的竞争日益激烈&#xff0c;而人才作为企业发展的核心驱动力&#xff0c;其重要性不言而喻。传统的人力资源招聘方式&#xff0c;如依赖纸质简历、人工筛选、面对面面试等&#xff0c;不仅效率低下&#xff0c;且难以精准匹配企业…...

Python网络爬虫与数据采集实战——网络协议与HTTP

目录 1. HTTP协议简介 2. 常见的请求方法 3. 状态码含义 实际应用中的HTTP协议 1. 如何在爬虫中使用HTTP协议 2. 模拟浏览器请求与爬虫反爬虫技术 3. 高级HTTP请求 实现爬虫时HTTP协议的优化与常见问题 总结 1. HTTP协议简介 HTTP的定义与作用 HTTP&#xff08;超文本…...

从零开始的c++之旅——二叉搜索树

1、二叉搜索树概念 1. ⼆叉搜索树的概念 ⼆叉搜索树⼜称⼆叉排序树&#xff0c;它或者是⼀棵空树&#xff0c;或者是具有以下性质的⼆叉树: • 若它的左⼦树不为空&#xff0c;则左⼦树上所有结点的值都⼩于等于根结点的值 • 若它的右⼦树不为空&#xff0c;则右⼦树上所有结…...

CSS回顾-基础知识详解

一、引言 在前端开发领域&#xff0c;CSS 曾是构建网页视觉效果的关键&#xff0c;与 HTML、JavaScript 一起打造精彩的网络世界。但随着组件库的大量涌现&#xff0c;我们亲手书写 CSS 样式的情况越来越少&#xff0c;CSS 基础知识也逐渐被我们遗忘。 现在&#xff0c;这种遗…...

Elasticsearch 查询时 term、match、match_phrase、match_phrase_prefix 的区别

Elasticsearch 查询时 term、match、match_phrase、match_phrase_prefix 的区别 keyword 与 text 区别term 查询match 查询match_phrase 查询match_phrase_prefix 查询写在最后 在讲述 es 查询时 term、match、match_phrase、match_phrase_prefix 的区别之前&#xff0c;先来了…...

低代码平台:跨数据库处理的重要性与实现方式

一、低代码平台概述 低代码平台作为一种创新的软件开发工具&#xff0c;为开发者带来了极大的便利。它具备可视化编程工具和大量预构建组件&#xff0c;这使得开发者无需编写大量代码就能创建应用程序&#xff0c;显著降低了软件开发的技术门槛。无论是专业开发人员还是业务人员…...

【jvm】如何破坏双亲委派机制

目录 1.说明2.重写ClassLoader的loadClass方法2.1 原理2.2 实现步骤2.3 注意事项 3.使用线程上下文类加载器3.1 原理3.2 实现步骤3.3 应用场景 4.利用SPI机制4.1 原理4.2 实现步骤4.3 应用场景 5.Tomcat等容器的自定义类加载器5.1 原理5.2 实现方式5.3 应用场景 1.说明 1.双亲委…...

ReactPress与WordPress:一场内容管理系统的较量

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress WordPress官网&#xff1a;https://wordpress.org/ ReactPress与WordPress&#xff1a;一场内容管理系统的较量 在当今数字化时代&#xff0c;内容管理系统&#xff08;CMS&#xff09;已成为…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...