【Spring Cloud 三】Eureka服务注册与服务发现

系列文章目录

【Spring Cloud一】微服务基本知识


Eureka服务注册与服务发现

  • 系列文章目录
  • 前言
  • 一、什么是Eureka?
  • 二、为什么要有服务注册发现中心?
  • 三、Eureka的特性
  • 四、搭建Eureka单机版
    • 4.1Eureka服务端
      • 项目代码
        • pom文件
        • 配置文件
        • 启动类
        • 启动项目查看效果
    • Eureka客户端B
      • 项目代码
        • pom文件
        • 配置文件
        • 启动类
        • 启动服务
    • Eureka客户端A
      • 项目代码
        • pom文件
        • 配置文件
        • 启动类
        • 服务A通过Eureka服务端发现服务B的注册信息
        • 启动服务
        • 调用test接口
        • 将服务B进行下线
  • Eureka 服务端的常用配置
  • 六、搭建Eureka集群
    • 代码示例
      • 三个Eureka服务端的配置文件配置
      • 运行之后的效果
    • Eureka客户端的配置文件配置
      • 服务运行之后的效果
  • 总结


前言

目前公司项目使用的注册中心主要是Spring Cloud Alibaba的Nacos做的注册中心和配置中心。之前也是对Nacos的基本原理通过手写代码的方式进行了实现。出于对于Eureka的好奇所以就对Spring Cloud Neflix的Eureka进行理论学习和实践。


一、什么是Eureka?

Eureka是一个注册发现中心,Eureka是Netflix公司开源的一个服务注册与发现的组件。
Eureka是Netflix贡献给Spring Cloud的一个框架,Eureka和其他Netflix公司的服务组件一起被Spring Cloud社区整合为Spring Cloud Netflix模块。
在这里插入图片描述

二、为什么要有服务注册发现中心?

在过去传统的架构中,两个服务之间进行跨服务调用的常用方式是直接调用。但是随着系统的规模和复杂性的增加。直接调用的方式存在一些局限性,所以就引入了服务注册发现中心来解决这些问题。

  1. 动态性和伸缩性:在传统的直接调用中,服务之间的连接通常是硬编码的方式。例如:在A服务里面需要编码上B服务提供URL,来发送调用请求。如果服务实例数量发生变化,那么就需要手动修改代码或者配置来适应新的实例。
    服务注册和服务发现允许服务动态注册和注销,从而使系统根据实际情况自动进行调整和适应变化。

  2. 高可用性和容错性:在直接调用方式中,如果某个服务实例不可用,调用方可能会面临连接失败或错误。**而服务注册和服务发现可以让调用方获取到多个可用的服务实例,**并后序结合Ribbon实现负载均衡,从而提高系统的可用性和容错性。

三、Eureka的特性

  1. 服务注册:服务实例启动时,会向Eureka服务器注册自己的信息,包括服务名称、IP地址、端口号等。这样,Eureka服务器就能知道所有可用的服务实例。
  2. 服务发现:其他服务可以向Eureka服务器查询需要调用的服务的信息。Eureka服务器会返回可用的服务实例列表,使得服务能够进行动态的负载均衡和故障转移。
  3. 健康检查:Eureka客户端定期向服务器发送心跳,用于确认服务是否正常运行。如果某个服务实例超过了指定时间未发送心跳或标记自己为不健康状态,Eureka服务器会将其从服务列表中剔除。
  4. 服务的下线(主动下线):当项目关闭时,会给Eureka服务端报告,说明自己要下机了。

四、搭建Eureka单机版

整个系统有一台Eureka服务端,有一台服务提供者B和一台服务消费者A(都集成了Eureka客户端)。

整体实现的效果是:
当服务提供者B和服务消费者A启动时,会将自己的注册信息注册到Eureka服务端中。
我们在服务消费者中根据服务提供者B的应用程序名,通过Eureka客户端向Eureka服务端发送获取服务提供者B的注册信息。

4.1Eureka服务端

项目代码

pom文件

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.12.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.wangwei</groupId>
	<artifactId>eureka-server01</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>erueka-server01</name>
	<description>eureka-server01</description>
	<properties>
		<java.version>8</java.version>
		<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

配置文件

#单机版配置

server:
    port: 8761   #eureka的默认端口
spring:
    application:
        name: eureka-server #应用名称 不要使用特殊字符

eureka: #eureka的配置分为三类 server client 实例的 eurka-server即是服务端又是客户端
    server:
        eviction-interval-timer-in-ms: 10000 #服务端间隔多少毫秒做定期删除操作
        renewal-percent-threshold: 0.85 #续约百分比 超过85%的应用没有和你续约 那么eureka会保护服务 不会剔除任何一个服务

    instance: #实例的配置
        instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
        hostname: localhost #主机名称或者服务ip
        prefer-ip-address: true #以ip的形式显示具体的服务信息
        lease-renewal-interval-in-seconds: 5 #服务实例的续约时间间隔

启动类

启动类上添加开启Eureka注册中心的功能

@SpringBootApplication
@EnableEurekaServer//开启eureka的注册中心的功能
public class EruekaServer01Application {

	public static void main(String[] args) {
		SpringApplication.run(EruekaServer01Application.class, args);
	}

}

启动项目查看效果

访问:http://localhost:8761/
可以看到已经将服务端进行了注册
在这里插入图片描述

Eureka客户端B

项目代码

pom文件

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.wangwei</groupId>
    <artifactId>eureka-client-b</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka-client-b</name>
    <description>eureka-client-b</description>
    <properties>
        <java.version>8</java.version>
        <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

配置文件

server:
  port: 8081

spring:
    application:
      name: eureka-client-b


eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
    register-with-eureka: true #设置为fasle 不往eureka-server注册
    fetch-registry: true #应用是否拉取服务列表到本地
    registry-fetch-interval-seconds: 10 #为了缓解服务列表的脏读问题,时间越短脏读越少 性能相应的消耗回答

  instance: #实例的配置
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
    hostname: localhost #主机名称或者服务ip
    prefer-ip-address: true #以ip的形式显示具体的服务信息
    lease-renewal-interval-in-seconds: 10 #服务实例的续约时间间隔

启动类

添加开启Eureka客户端的注解

@SpringBootApplication
@EnableEurekaClient
public class EurekaClientBApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientBApplication.class, args);
    }

}

启动服务

可以看到eureka-client-b已经注册到了Eureka服务端上。

在这里插入图片描述

Eureka客户端A

项目代码

pom文件

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.12.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.wangwei</groupId>
	<artifactId>eureka-client-a</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>eureka-client-a</name>
	<description>eureka-client-a</description>
	<properties>
		<java.version>8</java.version>
		<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

配置文件

eureka:
  client:
    service-url: 
      defaultZone: http://localhost:8761/eureka
    register-with-eureka: true #设置为fasle 不往eureka-server注册,默认为true
    fetch-registry: true #应用是否拉取服务列表到本地
    registry-fetch-interval-seconds: 10 #为了缓解服务列表的脏读问题,时间越短脏读越少 性能相应的消耗回答


  instance: #实例的配置
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
    hostname: localhost #主机名称或者服务ip
    prefer-ip-address: true #以ip的形式显示具体的服务信息
    lease-renewal-interval-in-seconds: 10 #服务实例的续约时间间隔

启动类

在启动类上添加开启Eureka客户端的注解

@SpringBootApplication
@EnableEurekaClient
public class EurekaClientAApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaClientAApplication.class, args);
	}

}

服务A通过Eureka服务端发现服务B的注册信息

@RestController
public class DiscoveryController {

    @Autowired
    private DiscoveryClient discoveryClient;


    @GetMapping("test/{serviceName}")
    public String Discovery(@PathVariable String serviceName){
        //这就是服务发现  通过服务应用名称 找到服务的具体信息
        List<ServiceInstance> instances = discoveryClient.getInstances(serviceName);
        ServiceInstance serviceInstance = instances.get(0);
        String ip=serviceInstance.getHost();
        int port=serviceInstance.getPort();

        System.out.println(ip+port);
        return ip+port;
    }
}

启动服务

可以看到客户端已经注册进去了。
在这里插入图片描述

调用test接口

通过调用test接口,我们可以看到通过服务应用名称,可以找到注册到Eureka上服务的具体信息。
在这里插入图片描述

将服务B进行下线

我们将服务B进行下线处理之后,我们可以看到Eureka服务端已经将其剔除。
在这里插入图片描述

Eureka 服务端的常用配置

server:
    port: 8761   #eureka的默认端口
spring:
    application:
        name: eureka-server #应用名称 不要使用特殊字符

eureka:
    client:
        service-url: #eureka服务端和客户端的交互地址,不写的话默认是 8761,集群的话地址用,隔开。
            defaultZone: http://peer2:8762/eureka,http://peer3:8763/eureka
        fetch-registry: true #是否拉取服务列表
        register-with-eureka: true #是否注册自己(单击eureka一般关闭注册自己,集群需要开启)
    server:
        eviction-interval-timer-in-ms: 10000 #服务端间隔多少毫秒做定期删除操作,清楚无效阶段的频率
        renewal-percent-threshold: 0.85 #续约百分比 超过85%的应用没有和你续约 那么eureka会保护服务 不会剔除任何一个服务
        enable-self-preservation: true #server的自我保护机制,避免因为网络原因造成误剔除。

    instance: #实例的配置
        instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
        hostname: peer1 #主机名称或者服务ip
        prefer-ip-address: true #以ip的形式显示具体的服务信息
        lease-renewal-interval-in-seconds: 5 #服务实例的续约时间间隔
        lease-expiration-duration-in-seconds: #表示eureka server至上一次收到client的心跳之后,等待下一次心跳的超时时间

六、搭建Eureka集群

按照Eureka服务端再新建两个Eureka服务端,主要的区别在于配置文件中的配置。

通过下面图:我们可以看出Eureka集群中的Eureka服务是彼此相互服务注册和互相服务发现。这样做的好处是如果我其中一台Eureka服务宕机了。我的集群能够立即的提供服务,这是一种去中心化的思想。与常见的主从模式的集群不同,如果主从模式中的集群中的主服务宕机,那么是不能够立即提供完整的服务的,它需要一定的选举机制,再次选出一个主服务器之后才能提供完整的服务,这期间有一段的时间整个集群是无法提供完整服务的。
在这里插入图片描述

代码示例

三个Eureka服务端的配置文件配置

#集群版

server:
    port: 8761   #eureka的默认端口
spring:
    application:
        name: eureka-server #应用名称 不要使用特殊字符

eureka:
    client:
        service-url: #eureka服务端和客户端的交互地址,不写的话默认是 8761,集群的话地址用,隔开。
            defaultZone: http://peer2:8762/eureka,http://peer3:8763/eureka
        fetch-registry: true #是否拉取服务列表
        register-with-eureka: true #是否注册自己(单击eureka一般关闭注册自己,集群需要开启)
        registry-fetch-interval-seconds: 10 #定期拉取注册信息 为了缓解服务列表的脏读问题,时间越短脏读越少 性能相应的消耗越大
    server:
        eviction-interval-timer-in-ms: 10000 #服务端间隔多少毫秒做定期删除操作,清楚无效阶段的频率
        renewal-percent-threshold: 0.85 #续约百分比 超过85%的应用没有和你续约 那么eureka会保护服务 不会剔除任何一个服务
        enable-self-preservation: true #server的自我保护机制,避免因为网络原因造成误剔除。

    instance: #实例的配置
        instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
        hostname: peer1 #主机名称或者服务ip
        prefer-ip-address: true #以ip的形式显示具体的服务信息
        lease-renewal-interval-in-seconds: 5 #服务实例的续约时间间隔
        lease-expiration-duration-in-seconds: #表示eureka server至上一次收到client的心跳之后,等待下一次心跳
#集群版

server:
  port: 8762
spring:
  application:
    name: eureka-server #应用名称 不要使用特殊字符

eureka:
  client:
    service-url: #eureka服务端和客户端的交互地址,不写的话默认是 8761,集群的话地址用,隔开。
      defaultZone: http://peer1:8761/eureka,http://peer3:8763/eureka
    fetch-registry: true #是否拉取服务列表
    register-with-eureka: true #是否注册自己(单击eureka一般关闭注册自己,集群需要开启)
    registry-fetch-interval-seconds: 10 #定期拉取注册信息 为了缓解服务列表的脏读问题,时间越短脏读越少 性能相应的消
  server:
    eviction-interval-timer-in-ms: 10000 #服务端间隔多少毫秒做定期删除操作,清楚无效阶段的频率
    renewal-percent-threshold: 0.85 #续约百分比 超过85%的应用没有和你续约 那么eureka会保护服务 不会剔除任何一个服务
    enable-self-preservation: true #server的自我保护机制,避免因为网络原因造成误剔除。

  instance: #实例的配置
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
    hostname: peer2 #主机名称或者服务ip
    prefer-ip-address: true #以ip的形式显示具体的服务信息
    lease-renewal-interval-in-seconds: 5 #服务实例的续约时间间隔
    lease-expiration-duration-in-seconds: 5 #表示eureka server至上一次收到client的心跳之后,等待下一次心跳
#集群版

server:
  port: 8763
spring:
  application:
    name: eureka-server #应用名称 不要使用特殊字符

eureka:
  client:
    service-url: #eureka服务端和客户端的交互地址,不写的话默认是 8761,集群的话地址用,隔开。
      defaultZone: http://peer1:8761/eureka,http://peer2:8762/eureka
    fetch-registry: true #是否拉取服务列表
    register-with-eureka: true #是否注册自己(单击eureka一般关闭注册自己,集群需要开启)
    registry-fetch-interval-seconds: 10 #定期拉取注册信息 为了缓解服务列表的脏读问题,时间越短脏读越少 性能相应的消
  server:
    eviction-interval-timer-in-ms: 10000 #服务端间隔多少毫秒做定期删除操作,清楚无效阶段的频率
    renewal-percent-threshold: 0.85 #续约百分比 超过85%的应用没有和你续约 那么eureka会保护服务 不会剔除任何一个服务
    enable-self-preservation: true #server的自我保护机制,避免因为网络原因造成误剔除。

  instance: #实例的配置
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
    hostname: peer3 #主机名称或者服务ip
    prefer-ip-address: true #以ip的形式显示具体的服务信息
    lease-renewal-interval-in-seconds: 5 #服务实例的续约时间间隔
    lease-expiration-duration-in-seconds: 5 #表示eureka server至上一次收到client的心跳之后,等待下一次心跳

运行之后的效果

访问不同的Eureka服务地址,可以看到都彼此进行注册
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Eureka客户端的配置文件配置

#集群版

server:
  port: 8080

spring:
  application:
    name: eureka-client-a


eureka:
  client:
    service-url:
      defaultZone: http://peer1:8761/eureka,http://peer2:8762/eureka,http://peer3:8763/eureka #集群中的所有服务地址,这样可以保证如果有一个服务宕机,还可以使用其他服务
    register-with-eureka: true #设置为fasle 不往eureka-server注册
    fetch-registry: true #应用是否拉取服务列表到本地
    registry-fetch-interval-seconds: 10 #定期拉取注册信息 为了缓解服务列表的脏读问题,时间越短脏读越少 性能相应的消耗回答


  instance: #实例的配置
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
    hostname: localhost #主机名称或者服务ip
    prefer-ip-address: true #以ip的形式显示具体的服务信息
    lease-renewal-interval-in-seconds: 10 #服务实例的续约时间间隔
    lease-expiration-duration-in-seconds: 5 #表示eureka server至上一次收到client的心跳之后,等待下一次心跳
##集群版
server:
  port: 8081

spring:
  application:
    name: eureka-client-b


eureka:
  client:
    service-url:
      defaultZone: http://peer1:8761/eureka,http://peer2:8762/eureka,http://peer3:8763/eureka #集群中的所有服务地址,这样可以保证如果有一个服务宕机,还可以使用其他服务
    register-with-eureka: true #设置为fasle 不往eureka-server注册
    fetch-registry: true #应用是否拉取服务列表到本地
    registry-fetch-interval-seconds: 10 #定期拉取注册信息 为了缓解服务列表的脏读问题,时间越短脏读越少 性能相应的消耗回答


  instance: #实例的配置
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
    hostname: localhost #主机名称或者服务ip
    prefer-ip-address: true #以ip的形式显示具体的服务信息
    lease-renewal-interval-in-seconds: 10 #服务实例的续约时间间隔
    lease-expiration-duration-in-seconds: 5 #表示eureka server至上一次收到client的心跳之后,等待下一次心跳

服务运行之后的效果

在这里插入图片描述
这里我们同样调用test接口进行测试。可以看到是可以获取服务B的注册信息的。
在这里插入图片描述

如果我们这是我们将集群中的Eureka服务下线一台依旧是可以提供服务的,不会有任何影响


总结

以上就是Eureka的基本内容了,Eureka提供的服务主要是服务注册和服务发现。分别介绍了单机版、集群版、以及Eureka的常用配置。
对于Eureka的配置其实大部分都是有默认配置的。我们可以在EurekaClientConfigBean、EurekaServerConfigBean、EurekaInstanceConfigBean这三个类中去进行了解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/57560.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uni-app选择器( uni-data-picker)选择任意级别

背景说明 uni-app 官方的插件市场有数据驱动选择器&#xff0c;可以用作多级分类的场景。引入插件后&#xff0c;发现做不到只选择年级&#xff0c;不选择班级&#xff08;似乎&#xff0c;只能到最后子节点了&#xff09;。 需求中&#xff0c;有可能选择的不是叶子。比如&a…

力扣 C++|一题多解之动态规划专题(1)

动态规划 Dynamic Programming 简写为 DP&#xff0c;是运筹学的一个分支&#xff0c;是求解决策过程最优化的过程。20世纪50年代初&#xff0c;美国数学家贝尔曼&#xff08;R.Bellman&#xff09;等人在研究多阶段决策过程的优化问题时&#xff0c;提出了著名的最优化原理&…

django使用ztree实现树状结构效果,子节点实现动态加载(l懒加载)

一、实现的效果 由于最近项目中需要实现树状结构的效果,考虑到ztree这个组件大家用的比较多,因此打算在django项目中集成ztree来实现树状的效果。最终实现的示例效果如下: 点击父节点,如果有子节点,则从后台动态请求数据,然后显示出子节点的数据。 二、实现思路 …

openCV C++环境配置

文章目录 一、openCV 安装二、新建项目三、配置环境变量四、测试使用 编译器:vs2017 OpenCV:4.5.4 一、openCV 安装 将openCV安装到一个路径下&#xff0c;我安装到了D盘根目录下 二、新建项目 在vs2017新建控制台空项目&#xff0c;打开项目属性 在VC目录 -> 包含目录下…

基于ARM+FPGA (STM32+ Cyclone 4)的滚动轴承状态监测系统

状态监测系统能够在故障早期及时发现机械设备的异常状态&#xff0c;避免故障的 进一步恶化造成不必要的损失&#xff0c;滚动轴承是机械设备的易损部件&#xff0c;本文对以滚动 轴承为研究对象的状态监测系统展开研究。现有的监测技术多采用定时上传监 测数据&#xff0c;…

Docker-Compose编排与部署

目录 Docker Compose Compose的优点 编排和部署 Compose原理 Compose应用案例 安装docker-ce 阿里云镜像加速器 安装docker-compose docker-compose用法 Yaml简介 验证LNMP环境 Docker Compose Docker Compose 的前身是 Fig&#xff0c;它是一个定义及运行多个 Dock…

【ARM Coresight 系列文章 2.4 - Coresight 寄存器:DEVARCH,DEVID, DEVTYPE】

文章目录 1.1 DEVARCH(device architecture register)1.2 DEVID(Device configuration Register)1.3 DEVTYPE(Device Type Identifier Register) 1.1 DEVARCH(device architecture register) DEVARCH 寄存器标识了coresight 组件的架构信息。 bits[31:21] 定义了组件架构&…

使用 github 同步谷歌浏览器书签

想必使用谷歌浏览器Chrome的用户一定非常头疼的一件事就是&#xff1a;账户不能登录&#xff0c;书签收藏夹不能同步&#xff0c;换一台电脑书签收藏夹没有了&#xff01; 下面教大家一招亲测有效适用的方法解决书签同步问题&#xff0c;在任何电脑都可以同步了 1、去下载谷歌…

数据分析基础-Excel图表的美化操作(按照教程一步步操作)

一、原始数据 包含月份和对应的销量和产量。 时间销量产量1月60722月38673月28344月58685月67596月72357月61428月24319月556710月243511月122112月2645 二、原始的图表设计-采用Excel自带模板 三、优化思路 1、删除多余元素 2、弱化次要元素 对于可以弱化的元素&#xff0c…

Excel如何把两列互换

第一步&#xff1a;选择一列 打开excel&#xff0c;选中一列后将鼠标放在列后&#xff0c;让箭头变成十字方向。 第二步&#xff1a;选择Shift键 按住键盘上的Shift键&#xff0c;将列往后移动变成图示样。 第三步&#xff1a;选择互换 完成上述操作后&#xff0c;松开鼠标两…

Ajax快速入门

文章目录 Ajax原生ajaxaxios案例 Ajax Ajax就是前端访问服务器端数据的一个技术 还有主要就是异步交互 就是在不刷新整页面的情况下&#xff0c;和服务器交换部分我也数据 比如搜索的联想技术 同步和异步的概念 一个是客户端需要等待服务器完成处理&#xff0c;才能进行别的事…

使用爬虫代理IP速度慢是什么原因?

你们有没有遇到过使用爬虫代理IP速度慢的问题呢&#xff1f;相信很多使用爬虫抓取的人都曾经陷入过这个烦恼&#xff0c;今天我们就来聊聊这个话题。 首先&#xff0c;我们得明白为什么爬虫代理IP速度会变得慢。其实&#xff0c;原因有很多&#xff0c;比如代理服务器过多的连接…

pytorch-gpu 极简安装

1、进入pytoch官网&#xff1a;PyTorch 找到pytorch-gpu版本&#xff0c;看到CUDA11.8、11.7、CPU&#xff0c;这里我选择安装CUDA11.8 2、下载CUDA Toolkit&#xff1a;CUDA Toolkit 11.8 Downloads | NVIDIA Developer 3、下载CUDANN&#xff1a;cuDNN Download | NVIDIA D…

QT充当客户端模拟浏览器等第三方客户端对https进行双向验证

在 ssl单向证书和双向证书校验测试及搭建流程 文章中&#xff0c;已经做了基于https的单向认证和双向认证&#xff0c;&#xff0c;&#xff0c; 在进行双向认证时&#xff0c;采用的是curl工具或浏览器充当客户端去验证。 此次采用QT提供的接口去开发客户端向服务器发送请求&a…

element-ui - $prompt非空验证

//点击删除按钮 delStoreFun(data) { let than this; this.$prompt(删除门店请填写备注, 提示, { confirmButtonText: 确定, cancelButtonText: 取消, inputValidator: (value) > { //非空验证 if (!value) { return 输入不能为空 } }, }).then(({ value }) > { delS…

从Spring的角度看Memcached和Redis及操作

目录 Memcached和Redis的区别 适用场景 Memcached配置使用 Redis配置使用 在SpringBoot的框架里&#xff0c;有直连Redis的SDK却没有Memcached的&#xff0c;可见相比地位。不过各有各的适应场景&#xff0c;Redis这个单线程模型确实非常强。 Memcached和Redis的区别 共同…

RF手机天线仿真介绍(一):金属边框天线和LDS天线

目录 简介LDS天线LDS天线仿真 金属边框天线金属边框天线仿真 简介 最早的手机是外置式天线&#xff0c;从NOKIA开始采用内置式天线&#xff0c;开始采用内置金属片&#xff08;一般是0.1MM厚的不锈钢片冲压而成&#xff09;&#xff0c;随后为降低成本&#xff0c;后来改用FPC…

(树) 剑指 Offer 33. 二叉搜索树的后序遍历序列 ——【Leetcode每日一题】

❓剑指 Offer 33. 二叉搜索树的后序遍历序列 难度&#xff1a;中等 输入一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true&#xff0c;否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树&#xff1…

领域驱动设计(六) - 架构设计浅谈

单用一篇文章很难把这个主题描述的清楚&#xff0c;但为了系列的完整性&#xff0c;笔者会围绕DDD中所介绍的内容做下初步总结&#xff0c;使读者有一个连续性。 一、概述 现在不是局部解决问题的时代了要运用新的技术创造新的效率提升&#xff0c;需要整个商业链条一起前进。…

网络安全(黑客技术)自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…