Eureka(注册中心)

news2025/7/20 23:54:00

1.SpringCloud快速开发入门

1.1 搭建和配置一个服务提供者

我们知道,SpringCloud构建微服务是基于SpringBoot开发的。

1、 创建一个SpringBoot工程(SpringBoot的Web工程),并且添加SpringBoot的相关依赖;

2、 创建服务提供者的访问方法,也就是后续消费者如何访问提供者;

Spring Cloud是基于rest的访问,所以我们添加一个Controller,在该Controller中提供一个访问入口:

@RestController
public class HelloController {
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String hello() {
        return "Hello Spring Cloud";
    }
}

3、 启动运行该SpringBoot程序,访问该controller;

1.2 搭建和配置一个服务消费者

服务消费者也是一个SpringBoot项目,服务消费者主要用来消费服务提供者提供的服务;

1、 创建一个SpringBoot工程(SpringBoot的Web工程),并且添加SpringBoot的相关依赖;

2、 定义自定义类RestTemplateConfig类,也可以在启动类中添加RestTemplate实例

@Configuration
 public class RestTemplateConfig {
   @Bean
   public RestTemplate restTemplate(){
     return new RestTemplate();
   }
 }

3、开发一个消费者方法,去消费服务提供者提供的服务,这个消费者方法也是一个Controller

 \* SpringCloud的消费者端,消费者就是一个普通的SpringBoot的web工程 
 \* 使用Http协议访问服务提供者
  
@RestController
public class TestController {
    @Autowired
    private RestTemplate restTemplate;
    @RequestMapping("/test")
    public Object test(){
        //访问远程的SpringCloud的服务
        //参数1 为服务器的地址以及服务器的请求名
        //参数2 用于指定返回的数据类型是字符格式
        //.getBody()方法的作用是获取响应的主体内容(服务端返回的具体JSON数据)
        return restTemplate.getForEntity("http://localhost:8081/test",String.class).getBody()+"  -----SpringCloud的消费者";
    }
}

4、启动该SpringBoot程序,测试服务消费者调用服务提供者;

RestTemplate概述

RestTemplateSpring 提供的一个调用 Restful 服务的抽象层,它简化了 Restful 服务的通信方式,隐藏了不必要的一些细节,让我们更加优雅地在应用中调用 Restful 服务 。 我们在项目中经常要使用第三方的 Rest API 服务,比如短信、快递查询、天气预报等等。这些第三方只要提供了 Rest Api ,你都可以使用 RestTemplate 来调用它们。 只要你的项目使用了 Spring MVC 就已经集成了RestTemplate 。但是通常情况下该类不会自动被注入 Spring IoC容器 ,需要手动实例化。

2. 走进服务注册中心Eureka

在微服务架构中,服务注册与发现是核心组件之一,手动指定每个服务是很低效的,Spring Cloud提供了多种服务注册与发现的实现方式,例如:Eureka、Consul、Zookeeper

Spring Cloud支持得最好的是Eureka,其次是Consul,再次是Zookeeper。

2.1Eureka基本概念

什么是服务注册?

服务注册:将服务所在主机、端口、版本号、通信协议等信息登记到注册中心上;

什么是服务发现?

服务发现:服务消费者向注册中心请求已经登记的服务列表,然后得到某个服务的主机、端口、版本号、通信协议等信息,从而实现对具体服务的调用;

Eureka是什么?

Eureka来源于古希腊词汇,意为“发现了”。在软件领域, Eureka 是 Netflix 在线影片公司开源的一个服务注册与发现的组件,和其他Netflix 公司的服务组件(例如负载均衡、熔断器、网关等) 一起,被Spring Cloud 社区整合为Spring Cloud Netflix 模块。Eureka 是Netflix 贡献给Spring Cloud的一个框架!

Eureka 采用了C-S(客户端/服务端)的设计架构,也就是Eureka由两个组件组成:Eureka服务端和Eureka客户端。Eureka Server 作为服务注册的服务端,它是服务注册中心,而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server服务端,并维持心跳连接,Eureka客户端是一个Java客户端,用来简化与服务器的交互、负载均衡,服务的故障切换等;

有了Eureka注册中心,系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。

2.2 Eureka与Zookeeper的比较

著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)。

由于分区容错性在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡,在此Zookeeper保证的是CP, 而Eureka则是AP。

Zookeeper保证CP(不平等)

在ZooKeeper中,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举,但是问题在于,选举leader需要一定时间, 且选举期间整个ZooKeeper集群都是不可用的,这就导致在选举期间注册服务瘫痪。在云部署的环境下,因网络问题使得ZooKeeper集群失去master节点是大概率事件,虽然服务最终能够恢复,但是在选举时间内导致服务注册长期不可用是难以容忍的。

Eureka保证AP(平等 ,可用性)

Eureka优先保证可用性,Eureka各个节点是平等的,某几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册或时如果发现连接失败,则会自动切换至其它节点,只要有一台Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)

所以Eureka在网络故障导致部分节点失去联系的情况下,只要有一个节点可用,那么注册和查询服务就可以正常使用,而不会像zookeeper那样使整个注册服务瘫痪,Eureka优先保证了可用性

2.3 搭建与配置Eureka服务注册中心

Spring Cloud要使用Eureka注册中心非常简单和方便,Spring Cloud中的Eureka服务注册中心实际上也是一个Spring Boot工程,我们只需通过引入相关依赖和注解配置就能让Spring Boot构建的微服务应用轻松地与Eureka进行整合。

具体步骤如下:

1、 创建一个SpringBoot项目02-springcloud-eureka-server,并且添加SpringBoot的相关依赖;

2、 添加eureka的依赖:

<?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.6.8</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.powernode</groupId>
    <artifactId>springcloud-eureka-server</artifactId>
    <version>1.0.0</version>
    <name>002-springcloud-eureka-server</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2021.0.1</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-server</artifactId>
        </dependency>
    </dependencies>
    <!--必须添加Maven的依赖管理器,否则eureka无法被识别-->
    <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>

4.application.yml文件

server:
  port: 9100
spring:
  application:
    name: eureka-server
eureka:
  client:
    register-with-eureka: false #    不需要作为服务器注册自己
    fetch-registry: false  #    不去拉取其他

5.在Spring Boot的入口类上添加一个@EnableEurekaServer注解,用于开启Eureka注册中心服务端

2.6.启动与测试Eureka服务注册中心

1、启动SpringBoot程序;

2、启动成功之后,通过在浏览器地址栏访问我们的注册中心;浏览器输入

http://localhost:9100 来测试Eureka是否启动
在这里插入图片描述

2.7 向Eureka服务注册中心注册服务

创建服务提供者项目,并将该服务提供者注册到Eureke注册中心,步骤如下:

1、在该服务提供者中添加eureka的依赖,因为服务提供者向注册中心注册服务,需要连接eureka,所以需要eureka客户端的支持;

 <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2021.0.1</spring-cloud.version>
    </properties>
    <dependencies>
    
        <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>

2、设置服务提供者的application.properties文件,配置服务名称和注册中心地址

#指定服务名字 这个名称将在服务消费者时被调用
spring.application.name=002-provider
#指定eureka的访问地址
eureka.client.service-url.defaultZone=http://localhost:9100/eureka
#设置端口
server.port=8081

3、激活Eureka中的EnableEurekaClient功能:

在Spring Boot的入口函数处,通过添加@EnableEurekaClient注解来表明自己是一个eureka客户端,让我的服务消费者可以使用eureka注册中心

4、编写控制器提供服务

//自定义控制器类对外提供服务

@RestController
public class ProviderController {
    @GetMapping("/hello")
    public String hello(){
        return "hello,服务提供者向注册中心注册服务";
    }
}

5、启动服务提供者SpringBoot程序的main方法运行;

6、启动运行之后,通过在浏览器地址栏访问我们之前搭建好的eureka注册中心,就可以看到有一个服务已经注册成功了

2.8 从Eureka服务注册中心发现与消费服务

我们已经搭建一个服务注册中心,同时也向这个服务注册中心注册了服务,接下来我们就可以发现和消费服务了,这其中服务的发现由eureka客户端实现,而服务的消费由Ribbon实现,也就是说服务的调用需要eureka客户端Ribbon两者配合起来才能实现;

Eureka客户端是什么?

Eureka客户端是一个Java客户端,用来连接Eureka服务端,与服务端进行交互、负载均衡,服务的故障切换等;

Ribbon是什么?

Ribbon是一个基于HTTP 和 TCP 的客户端负载均衡器,当使用Ribbon对服务进行访问的时候,它会扩展Eureka客户端的服务发现功能,实现从Eureka注册中心中获取服务端列表,并通过Eureka客户端来确定服务端是否己经启动。Ribbon在Eureka客户端服务发现的基础上,实现了对服务实例的选择策略,从而实现对服务的负载均衡消费。

接下来我们来让服务消费者去消费服务:

我们前面搭建了服务消费者项目,接下来我们就可以使用该服务消费者通过注册中心去调用服务提供者,步骤如下:

1、在该消费者项目中添加eureka的依赖,因为服务消费者从注册中心获取服务,需要连接eureka,所以需要eureka客户端的支持;

 <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR3</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>

2.配置服务的名称和注册中心的地址:

#指定服务的名称 即使是服务的消费者也会将自己注册到注册中心
server:
  port: 9002
spring:
  application:
    name: consumer
eureka:
  client:
    service-url:
      defaultZone: http://localhost:9100/eureka

3、激活Eureka中的EnableEurekaClient功能:

在Spring Boot的入口函数处,通过添加@EnableEurekaClient注解来表明自己是一个eureka客户端,让我的服务消费者可以使用eureka注册中心;

4、服务的发现由eureka客户端实现,而服务的真正调用由ribbon实现,所以我们需要在调用服务提供者时使用ribbon来调用,需要在RestTemplate上添加注解@LoadBalanced

  @Bean
  @LoadBalanced //如果不加该注解,运行时报位置主机异常java.net.UnknownHostException
  public RestTemplate restTemplate(){
        return  new RestTemplate();
  }

5、调用服务

加入了ribbon的支持,那么在调用时,即可改为使用服务名称来访问:

   @Autowired
    private RestTemplate restTemplate;
    @GetMapping("/test")
    public String test(){
        //提供者服务的名称
        String serviceName="http://02-provider/hello";
        String result=restTemplate.getForEntity(serviceName,String.class).getBody();
        return "消费者通过Eureka调用远程服务--"+result;
    }

7、完成上面的步骤后,我们就可以启动消费者的SpringBoot程序,main方法运行;

8、启动成功之后,通过在浏览器地址栏访问我们的消费者,看是否可以正常调用远程服务提供者提供的服务;

2.9服务端常用配置

server:
    port: 8761
spring:
    application:
        name: eureka-server
eureka:
    client:
        service-url:    #eureka服务端和客户端的交互地址,集群用,隔开
            defaultZone: http://localhost:8761/eureka
        fetch-registry: true   #是否拉取服务列表
        register-with-eureka: true     #是否注册自己(单机eureka一般关闭注册自己,集群注意打开)
    server:
        eviction-interval-timer-in-ms: 30000    #清除无效节点的频率(毫秒)--定期删除
        enable-self-preservation: true      #server的自我保护机制,避免因为网络原因造成误剔除,生产环境建议打开
        renewal-percent-threshold: 0.85     #85%,如果在一个机房的client端,15分钟内有85%的client没有续约,那么则可能是网络原因,认为服务实例没有问题,不会剔除他们,宁可放过一万,不可错杀一个,确保高可用
    instance:
        hostname: localhost # 服务主机名称
        instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}  # 实例id
        prefer-ip-address: true  # 服务列表以ip的形式展示
        lease-renewal-interval-in-seconds: 10  # 表示eureka client发送心跳给server端的频率
        lease-expiration-duration-in-seconds: 20  #表示eureka server至上一次收到client的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该实例


2.10客户端常用配置

server:
    port: 8080
spring:
    application:
        name: eureka-client
eureka:
    client:
        service-url:    #eureka服务端和客户端的交互地址,集群用,隔开
            defaultZone: http://localhost:8761/eureka
        register-with-eureka: true  #注册自己
        fetch-registry: true    #拉取服务列表
        registry-fetch-interval-seconds: 5 # 表示eureka-client间隔多久去拉取服务注册信息
    instance:
        hostname: localhost # 服务主机名称
        instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}  # 实例id
        prefer-ip-address: true  # 服务列表以ip的形式展示
        lease-renewal-interval-in-seconds: 10  # 表示eureka client发送心跳给server端的频率
        lease-expiration-duration-in-seconds: 20  #表示eureka server至上一次收到client的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该实例


3Eureka集群

3.1. Eureka注册中心高可用集群概述

在微服务架构的这种分布式系统中,我们要充分考虑各个微服务组件的高可用性问题,不能有单点故障,由于注册中心eureka本身也是一个服务,如果它只有一个节点,那么它有可能发生故障,这样我们就不能注册与查询服务了,所以我们需要一个高可用的服务注册中心,这就需要通过注册中心集群来解决。

在这里插入图片描述

eureka服务注册中心它本身也是一个服务,它也可以看做是一个提供者,又可以看做是一个消费者,我们之前通过配置:

eureka.client.register-with-eureka=false 让注册中心不注册自己,但是我们可以向其他注册中心注册自己;

Eureka Server的高可用实际上就是将自己作为服务向其他服务注册中心注册自己,这样就会形成一组互相注册的服务注册中心,进而实现服务清单的互相同步,往注册中心A上注册的服务,可以被复制同步到注册中心B上,所以从任何一台注册中心上都能查询到已经注册的服务,从而达到高可用的效果。

3.2 Eureka注册中心高可用集群搭建

Eureka注册中心高可用集群就是各个注册中心相互注册

1.创建2个SpringBoot 的Eureka的服务端项目:

03-eureka-cluster-9100

03-eureka-cluster-9200

2.设置9100,9200服务器的配置内容

server:
  port: 9001
spring:
  application:
    name: provider
eureka:
  client:
    service-url:
      defaultZone: http://eureka9100:9100/eureka, http://eureka9200:9200/eureka
server:
  port: 9200
spring:
  application:
    name: eureka9200
eureka:
  client:
    service-url:
      defaultZone: http://eureka9100:9100/eureka   #9200作为9100的客户端
    register-with-eureka: false
    fetch-registry: false
  instance:
    hostname: eureka9200   #机器名

3.在本地hosts文件配置

C:\Windows\System32\drivers\etc\hosts,添加如下映射

127.0.0.1 eureka9100

127.0.0.1 eureka9200

4.分别启动9100和9200,观察服务注册信息

3.3 Eureka注册中心高可用集群测试

1.创建生产者项目003-provider

2.设置提供者配置信息

spring.application.name=03-provider
#将服务同时注册到多个注册中心,其实当Eureka注册中心实现集群以后,那么将服务注册到任意一个Eureka的注册中心后,数据服务都会
#同步到其他的Eureka注册中心,但是实际应用时还是建议将服务分别注册到全部的Eureka集群的所有服务中,这个防止某个Eureka出现故障后服务仍然可以注册成功
eureka.client.service-url.defaultZone=http://eureka9100:9100/eureka/,http://eureka9200:9200/eureka/
#指定Tomcat的端口号
server.port=8081

3.创建消费者项目003-consumer

4.设置消费者配置信息

spring.application.name= 03-consumer
#将服务同时注册到多个注册中心,其实当Eureka注册中心实现集群以后,那么将服务注册到任意一个Eureka的注册中心后,数据服务都会#同步到其他的Eureka注册中心,但是实际应用时还是建议将服务分别注册到全部的Eureka集群的所有服务中,这个防止某个Eureka出现故障后服务仍然可以注册成功
eureka.client.service-url.defaultZone=http://eureka9100:9100/eureka/,http://eureka9200:9200/eureka/
#指定Tomcat的端口号
server.port=8080

启动服务提供者服务,然后观察注册中心页面,可以看到服务会在两个注册中心上都注册成功;

4. Eureka概念的理解

4.1 服务的注册

当项目启动时(eureka的客户端),就会向eureka-server发送自己的元数据(原始数据)(运行的ip,端口port,健康的状态监控等,因为使用的是http/ResuFul请求风格),eureka-server会在自己内部保留这些元数据(内存中)。(有一个服务列表)(restful风格,以http动词的请求方式,完成对url资源的操作)

4.2 服务的续约

项目启动成功了,除了向eureka-server注册自己成功,还会定时的向eureka-server汇报自己心跳,表示自己还活着。(修改一个时间)

4.3 服务的下线(主动下线)

当项目关闭时,会给eureka-server报告,说明自己要下机了。

4.4 服务的剔除(被动下线,主动剔除)

当项目超过了指定时间没有向eureka-server汇报自己,那么eureka-server就会认为此节点死掉了,会把它剔除掉,也不会放流量和请求到此节点了。


启动服务提供者服务,然后观察注册中心页面,可以看到服务会在两个注册中心上都注册成功;

# 4. Eureka概念的理解

## 4.1 服务的注册

当项目启动时(eureka的客户端),就会向eureka-server发送自己的**元数据(原始数据)**(运行的ip,端口port,健康的状态监控等,因为使用的是http/ResuFul请求风格),eureka-server会在自己内部保留这些元数据(内存中)。(有一个服务列表)(restful风格,以http动词的请求方式,完成对url资源的操作)

## 4.2 服务的续约

项目启动成功了,除了向eureka-server注册自己成功,还会**定时**的向eureka-server汇报自己心跳,表示自己还活着。(修改一个时间)

## 4.3 服务的下线(主动下线)

当项目关闭时,会给eureka-server报告,说明自己要下机了。

## 4.4 服务的剔除(被动下线,主动剔除)

当项目超过了指定时间没有向eureka-server汇报自己,那么eureka-server就会认为此节点死掉了,会把它剔除掉,也不会放流量和请求到此节点了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linus 文件处理(二)

目录 一、前言 二、标准 I/O 库 1、fopen 2、fread 3、fwrite 4、fclose 5、 fflush 6、fseek 7、fgetc, getc, and getchar 8、fputc, putc, and putchar 9、fgets and gets 三、文件和目录维护 1、chmod 2、chown 3、unlink, link, and symlink 4、mkdir and…

Anaconda3安装与配置教程(2022.11)

&#xff08;1&#xff09;首先前往 Anaconda 官网&#xff1a;Anaconda&#xff0c;下载安装文件&#xff1a; &#xff08;2&#xff09;安装时只需要注意设置好安装路径即可&#xff0c;本文安装路径为&#xff1a;D:\Anaconda3&#xff0c;安装好后打开开始菜单能看到如下启…

Java集合框架详解(四)Map接口、HashMap类、LinkedHashMap类

一、Map接口 Map接口的特点&#xff1a; &#xff08;1&#xff09;映射键值对的形式&#xff08;key和value&#xff09;&#xff1b; &#xff08;2&#xff09;Map集合中&#xff0c;key是不能重复的&#xff0c;value是可以重复的&#xff1b; &#xff08;3&#xff09;…

电脑视频压缩软件哪个好?分享:一款支持上千种视频格式压缩神器

为了追求高清画质&#xff0c;现在的视频文件越来越大了。超大的文件虽然可以给人们带来更好的视觉效果&#xff0c;也给传输和发送带来了很大的麻烦。那有没有一款电脑视频压缩软件解决视频无损压缩问题呢&#xff1f;答案是肯定的&#xff01; 当前&#xff0c; 视频压缩已经…

自动控制系统实验总结

目录 自动控制系统实验总结 稳定性 稳态精准 动态过程 自动控制系统实验总结 自动控制系统是否能很好地工作,是否能精确地保持被控量按照预定的要求规律变化这取决于被控对象和控制器及各功能元器件的特性参数是否设计得当。 在理想情况下,控制系统的输出量…

DM-微皮恩

DM_VPN 动态多站点&#xff0c;Hub-spoken 总分站点的VPN架构&#xff0c;常用于总分之间的结构。 一、DMVPN的四个组件 1. MGRE 2. NHRP(下一跳地址解析协议) 3. Dynamic Routing Protocl 4. IPsec VPN 二、MGRE 1.配置(多点GRE隧道) interface tunnel 0 #进入隧道接口…

FPGA时序约束(一)基本概念入门及简单语法

文章目录一、建立时间和保持时间是什么&#xff1f;二、时序分析分类三、时钟约束方法3.1 时钟约束3.2 输入延时约束3.3输出延时约束3.4时序例外四、时序约束语法补充文章目前大部分参考明德扬时序约束&#xff0c;只是一个学习总结&#xff0c;侵权删 原文链接&#xff1a;FPG…

【跨境电商】如何创建吸引人的免费送货电子邮件营销

关键词&#xff1a;跨境电商、电子邮件营销、免费送货 除了用于接触新受众的新策略外&#xff0c;电子邮件营销仍然是推动更多电子商务网站转化的最有效选择之一。在大多数情况下&#xff0c;电子邮件用于推销新产品&#xff0c;通知客户有关销售、交易和季节性活动的信息&…

域名服务:域名迁移

摘要&#xff1a;这里记录一下西部数据域名的迁移步骤&#xff0c;迁移的域名为从西部数据一个账号迁移至另一个西数数据账号。域名的实体认证为同一主体&#xff0c;迁移后无需重新备案。此处为一家公立医院。 相关文章 域名服务&#xff1a;西部数据域名迁移阿里云Symantec免…

leetcode337打家劫舍3刷题打卡

337. 打家劫舍 III - 力扣&#xff08;Leetcode&#xff09; 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root 。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察之后&#xff0c;聪明的小偷意识到“这个…

索引生命周期管理ILM看完不懂你找我

阅读完本文你可以学到什么是索引生命周期管理&#xff0c;各个阶段可以做的操作以及如何使用索引模版使用索引生命周期策略&#xff0c;下面就跟我一起来吧 基础理论篇 索引生命周期管理&#xff08;ILM&#xff09;是一种可以让我们随着时间推移自动化的管理索引的一种方式。我…

常见APP攻击方法 以及防御方法介绍(移动安全)

一、常见APP攻击风险以及防御方法介绍 二、APP攻击以及防御方法 案例讲解 1、基于组件攻击 - 应用劫持 用户打开安卓手机上的某一应用&#xff0c;这时&#xff0c;恶意软件侦测到用户的这一动作&#xff0c;如果立即弹出一个与该应用类似的界面&#xff0c;拦截了合法的应用…

logcat日志文件分析

3:显示时间戳日志 adb logcat -v time > d:\文件\log.txt 日志文件分析 输出的日志格式由5部分组成 1:写下日志的时间 2:优先级&#xff0c;日志优先级从低到高分以下几种 v -verbose 最低级别&#xff0c;开发调试中的一些详细信息&#xff0c;仅在开发中使用&#…

动静分离LNMP

目录 安装LNMP 搭建wordpress 搭建WeCenter 根据需求实现动静分离&#xff0c;当客户端访问nginx网站服务时&#xff0c;静态网页nginx本机反馈&#xff0c;动态网页访问PHP&#xff0c;所以需要在nginx服务器中部署论坛后需要拷贝到PHP服务器中。但是如果有NFS或GFS服务器时可…

【数据结构】堆的实现(简单易懂,超级详细!!!)

目录 1、堆的概念及结构 概念 规律 2、堆的实现 2.1结构设计 2.2接口实现 2.3 初始化 2.4堆的向下调整算法 主要思想 涉及问题 代码实现 2.5建堆 思想 代码实现 建堆的时间复杂度 2.6 堆的向上调整算法 主要思想 ​涉及问题 代码实现 2.7 插入 2.8删除…

【HDU No. 2586】 树上距离 How far away ?

【HDU No. 2586】 树上距离 How far away &#xff1f; 杭电 OJ 题目地址 【题意】 有n 栋房屋&#xff0c;由一些双向道路连接起来。 每两栋房屋之间都有一条独特的简单道路&#xff08;“简单”意味着不可以通过两条道路去一个地方&#xff09;。人们每天总是喜欢这样问&a…

CUDA——向量化内存

许多 CUDA 内核受带宽限制&#xff0c;新硬件中触发器与带宽的比率增加导致更多带宽受限内核。 这使得采取措施缓解代码中的带宽瓶颈变得非常重要。 在本文中&#xff0c;我将向您展示如何在 CUDA C/C 中使用矢量加载和存储来帮助提高带宽利用率&#xff0c;同时减少执行指令的…

【附源码】计算机毕业设计JAVA疫情社区志愿者组织的资源管理平台

【附源码】计算机毕业设计JAVA疫情社区志愿者组织的资源管理平台 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#…

Rust权威指南配套手把手笔记

Rust权威指南配套手把手笔记 持续更新ing 共20章&#xff0c;110小节 P1 1.1 - 简介 06:46 P2 1.2 - 安装 Rust 03:18 P3 1.3 - Hello World 04:11 P4 1.4 - Hello Cargo 07:49 P5 2.1 - 猜数游戏&#xff1a;一次猜测 11:47 P6 2.2 - 猜数游戏&#xff1a;生成神秘数字 …

【强化学习论文合集】ICLR-2021 强化学习论文

强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题。 本专栏整理了近几年国际顶级会议中,涉及强化学习(Rein…