【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 #主机名称或者服务ipprefer-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: 8081spring:application:name: eureka-client-beureka:client:service-url:defaultZone: http://localhost:8761/eurekaregister-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 #主机名称或者服务ipprefer-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/eurekaregister-with-eureka: true #设置为fasle 不往eureka-server注册,默认为truefetch-registry: true #应用是否拉取服务列表到本地registry-fetch-interval-seconds: 10 #为了缓解服务列表的脏读问题,时间越短脏读越少 性能相应的消耗回答instance: #实例的配置instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}hostname: localhost #主机名称或者服务ipprefer-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 {@Autowiredprivate 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/eurekafetch-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 #主机名称或者服务ipprefer-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/eurekafetch-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 #主机名称或者服务ipprefer-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/eurekafetch-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 #主机名称或者服务ipprefer-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/eurekafetch-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 #主机名称或者服务ipprefer-ip-address: true #以ip的形式显示具体的服务信息lease-renewal-interval-in-seconds: 5 #服务实例的续约时间间隔lease-expiration-duration-in-seconds: 5 #表示eureka server至上一次收到client的心跳之后,等待下一次心跳

运行之后的效果

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

Eureka客户端的配置文件配置

#集群版server:port: 8080spring:application:name: eureka-client-aeureka: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 #主机名称或者服务ipprefer-ip-address: true #以ip的形式显示具体的服务信息lease-renewal-interval-in-seconds: 10 #服务实例的续约时间间隔lease-expiration-duration-in-seconds: 5 #表示eureka server至上一次收到client的心跳之后,等待下一次心跳
##集群版
server:port: 8081spring:application:name: eureka-client-beureka: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 #主机名称或者服务ipprefer-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这三个类中去进行了解。

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

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

相关文章

海量小文件传输慢的原因以及对应的优化方案

在日常工作中&#xff0c;我们经常遇到需要传输一些小文件的情况&#xff0c;但是当小文件的数量很多的时候&#xff0c;为什么小文件传输的速度就会变得很慢呢&#xff1f;为什么复制许多较小的文件时&#xff0c;小文件传输效率就会降低呢&#xff1f;针对这些问题&#xff0…

Mybatis插件

文章目录 1. 如何自定义插件1.1 创建接口Interceptor的实现类1.2 配置拦截器1.3 运行程序 2. 插件原理2.1 解析过程2.2 创建代理对象2.2.1 Executor2.2.2 StatementHandler2.2. 3ParameterHandler2.2.4 ResultSetHandler 2.3 执行流程2.4 多拦截器的执行顺序 3. PageHelper3.1 …

聊天系统登录后端实现

定义返回的数据格式 # Restful API from flask import jsonifyclass HttpCode(object):# 响应正常ok 200# 没有登陆错误unloginerror 401# 没有权限错误permissionerror 403# 客户端参数错误paramserror 400# 服务器错误servererror 500def _restful_result(code, messa…

Matlab Optimization Toolbox中的遗传算法工具包(GA)

matlab optimization 中使用了GA求解器 默认的是小于等于 找到GA 工具包 找到 APP选择 Optimization Tool 选择Solver ga - Genetic Algorithm 应用GA solver 定义适应度函数(Fitness function)与问题约束(Constraints) example one 优化函数 sin(x) 2 * cos(x)极其重要的…

windows10 设置代理

场景&#xff1a;同一个办公室&#xff0c;只有A的电脑有权限访问网站 http://10.129.129.129:5601&#xff0c; 那办公室其他B,C同学想访问 http://10.129.129.129:5601&#xff0c;需要怎么处理&#xff1f; A 同学电脑安装代理软件&#xff1a; 1. 下载wproxy IMFirewall, …

iMX6ULL驱动开发 | 让imx6ull开发板支持usb接口FC游戏手柄

手边有一闲置的linux开发板iMX6ULL一直在吃灰&#xff0c;不用来搞点事情&#xff0c;总觉得对不住它。业余打发时间就玩起来吧&#xff0c;总比刷某音强。从某多多上8块儿大洋买来一个usb接口的游戏手柄&#xff0c;让开发板支持以下它&#xff0c;后续就可以接着在上面玩童年…

信息学奥赛一本通——1258:【例9.2】数字金字塔

文章目录 题目【题目描述】【输入】【输出】【输入样例】【输出样例】 AC代码 题目 【题目描述】 观察下面的数字金字塔。写一个程序查找从最高点到底部任意处结束的路径&#xff0c;使路径经过数字的和最大。每一步可以从当前点走到左下方的点也可以到达右下方的点。 在上面…

Java-很深我只知其一-泛型

Java-很深我只知其一-泛型 目录 泛型历史 泛型类/泛型接口 泛型方法 泛型属性 泛型约束 泛型历史 JAVA 泛型&#xff08;generics&#xff09;是 JDK 5 中引入的一个新特性, 允许程序员在编程时指定类型参数&#xff0c;使编译器可以在编译代码时检测到非法的类型。泛型的…

小研究 - 主动式微服务细粒度弹性缩放算法研究(四)

微服务架构已成为云数据中心的基本服务架构。但目前关于微服务系统弹性缩放的研究大多是基于服务或实例级别的水平缩放&#xff0c;忽略了能够充分利用单台服务器资源的细粒度垂直缩放&#xff0c;从而导致资源浪费。为此&#xff0c;本文设计了主动式微服务细粒度弹性缩放算法…

Java 版 spring cloud + spring boot 工程系统管理 工程项目管理系统源码 工程项目各模块及其功能点清单

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…

基于以太坊+IPFS的去中心化数据交易方法及平台

自己的论文&#xff0c;哎费事 目录 基于以太坊IPFS的去中心化数据交易方法及平台 基于以太坊IPFS的去中心化数据交易方法及平台 摘要&#xff1a; 数据交易过程中存在数据权属不明和数据安全问题。本文开发了一种基于以太坊IPFS的去中心化数据交易方法及平台。方法包括&am…

IPv4网络用户访问IPv6网络服务器

NAT64静态映射为一对一的对应关系&#xff0c;通常应用在IPv4网络主动访问IPv6网络的场景中。 要求位于IPv4网络中的PC通过IPv4地址1.1.1.10能够直接访问位于IPv6网络中Server。 操作步骤 配置FW。 # 配置接口GigabitEthernet 0/0/1的IPv4地址。 <FW> system-view [F…

IP 工具

什么是IP 工具 IP 工具是用于轻松扫描和排除网络 IP 地址空间故障的网络工程工具。IP 工具使网络管理员能够审核、跟踪和监视 IP 地址、子网以及使用 IP 的设备和主机的性能。这个全面的网络工程工具集包括高级 IP 工具&#xff0c;如 Ping、系统资源管理器、MAC 地址解析器和…

设计模式行为型——解释器模式

目录 什么是解释器模式 解释器模式的实现 解释器模式角色 解释器模式类图 解释器模式举例 解释器模式代码实现 解释器模式的特点 优点 缺点 使用场景 注意事项 实际应用 什么是解释器模式 解释器模式&#xff08;Interpreter Pattern&#xff09;属于行为型模式&…

《零基础入门学习Python》第075讲:GUI的终极选择:Tkinter12

Tkinter 的基本组件我们已经介绍得七七八八了&#xff0c;剩下的一些我们在这节课全部都会讲解完毕。 &#xff08;一&#xff09;Message组件 Message&#xff08;消息&#xff09;组件是 Label 组件的变体&#xff0c;用于显示多行文本消息。众所周知&#xff0c;我们的Lab…

【腾讯云 Cloud Studio 实战训练营】Redisgo_task 分布式锁实现

文章目录 前言问题场景腾讯云 Cloud Studio Redisgo_task长短类型分布式场景介绍Redisgo_task实现原理SetNx(valueexpire)原子性子协程Done()时间点子协程中的Ticker Redisgo_task唯一外部依赖Redisgo_task Lock结构Redisgo_task架构健壮性设计Redisgo_task可扩展性Redisgo_tas…

MyBatis-Plus 和达梦数据库实现高效数据持久化

一、添加依赖 首先&#xff0c;我们需要在项目的 pom.xml 文件中添加 MyBatis-Plus 和达梦数据库的依赖&#xff1a; <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifac…

微信小程序使用 canvas 2d 实现签字板组件

本文是在微信小程序中使用 canvas 2d 来实现签字板功能&#xff1b; 效果图&#xff1a; 代码&#xff1a; 1、wxml <view><canvas id"canvas"type"2d"bindtouchstart"start"bindtouchmove"move"bindtouchend"end&qu…

Scratch Blocks自定义组件之「下拉图标」

一、背景 由于自带的下拉图标是给水平布局的block使用&#xff0c;放在垂直布局下显得别扭&#xff0c;而且下拉选择后回修改image字段的图片&#xff0c;这让我很不爽&#xff0c;所以在原来的基础上稍作修改&#xff0c;效果如下&#xff1a; 二、使用说明 &#xff08;1&am…

【图论】差分约束

一.情景导入 x1-x0<9 ; x2-x0<14 ; x3-x0<15 ; x2-x1<10 ; x3-x2<9; 求x3-x0的最大值&#xff1b; 二.数学解法 联立式子2和5&#xff0c;可得x3-x0<23;但式子3可得x3-x0<15。所以最大值为15&#xff1b; 三.图论 但式子多了我们就不好解了&#xff0…