【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.rhkb.cn/news/76841.html

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

相关文章

docker配置远程连接端口

配置docker 配置远程连接端口 vi /lib/systemd/system/docker.servicesystemctl daemon-reload && systemctl restart docker firewall-cmd --zonepublic --add-port2375/tcp --permanenthttp://node2:2375/version

Node.js之express框架学习心得

Node.js&#xff1a;颠覆传统的服务器端开发 Node.js是基于Chrome V8引擎构建的JavaScript运行时&#xff0c;它采用了完全不同的开发模型。Node.js使用事件驱动和非阻塞I/O的方式处理请求&#xff0c;通过单线程和异步机制&#xff0c;实现高效的并发处理。这意味着在Node.js中…

【每日易题】数据结构链表篇——单链表oj题(1),几道典型例题带你快速掌握单链表

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;今天来填一个埋了好久的坑&#xff0c;在暑假之前就预告过这个系列&#xff0c;但由于各种原因&#xff08;主要是有点懒&#xff09;今天才开坑。我们这个系列主要是…

1310. 数三角形

题目链接&#xff1a;https://www.acwing.com/problem/content/1312/ 首先不考虑三点共线的情况一共有 种&#xff0c;现在来计算三点共线的情况 1.三点在一条直线上 2.三点在一条竖线上 3.三点在一条斜线上&#xff0c;正反斜线对称&#xff0c;仅需考虑一边的情况 如果…

视频汇聚平台EasyCVR视频广场侧边栏支持拖拽

为了提升用户体验以及让平台的操作更加符合用户使用习惯&#xff0c;我们在EasyCVR v3.3版本中&#xff0c;支持面包屑侧边栏的广场视频、分组列表、收藏这三个模块拖拽排序&#xff0c;并且该操作在视频广场、视频调阅、电子地图、录像回放等页面均能支持。 TSINGSEE青犀视频…

服务器运行python程序的使用说明

服务器的使用与说明 文章目录 服务器的使用与说明1.登录2.Python的使用2.1 服务器已安装python32.2 往自己的用户目录安装python31.首先下载安装包2.解压缩3.编译与安装 2.3 新建环境变量2.4 测试 3 创建PBS作业并提交 1.登录 windowsr打开运行命令窗口&#xff0c;在运行框中…

【万字长文】SpringBoot整合Atomikos实现多数据源分布式事务(提供Gitee源码)

前言&#xff1a;在最近的实际开发的过程中&#xff0c;遇到了在多数据源的情况下要保证原子性的问题&#xff0c;这个问题当时遇到了也是思考了一段时间&#xff0c;后来通过搜集大量资料与学习&#xff0c;最后是采用了分布式事务来解决这个问题&#xff0c;在讲解之前&#…

puppeteer监听response并封装为express服务调用

const express require(express); const puppeteer require(puppeteer); const app express(); let browser; // 声明一个全局变量来存储浏览器实例app.get(/getInfo, async (req, res) > {try {const page_param req.query.page; // 获取名为"page"的查询参数…

接口测试之文件上传

在日常工作中&#xff0c;经常有上传文件功能的测试场景&#xff0c;因此&#xff0c;本文介绍两种主流编写上传文件接口测试脚本的方法。 首先&#xff0c;要知道文件上传的一般原理&#xff1a;客户端根据文件路径读取文件内容&#xff0c;将文件内容转换成二进制文件流的格式…

Gson:解析JSON为复杂对象:TypeToken

需求 通过Gson&#xff0c;将JSON字符串&#xff0c;解析为复杂类型。 比如&#xff0c;解析成如下类型&#xff1a; Map<String, List<Bean>> 依赖&#xff08;Gson&#xff09; <dependency><groupId>com.google.code.gson</groupId><art…

MyBatis查询数据库之一(概念+创建项目+基础交互)

目录 1.MyBatis是什么&#xff1f; 2.为什么学习MyBatis&#xff1f; 3. 怎么学 MyBatis 4.第⼀个MyBatis查询 4.1 添加MyBatis框架支持 4.1.1老项目添加MyBatis 4.1.2 新项目添加MyBatis 4.2 配置连接字符串和MyBatis 4.2.1 配置连接字符串 4.2.2 配置 MyBatis 中的…

eNSP:ospf和mgre的配置

实验要求&#xff1a; 第一步&#xff1a;路由、IP的配置 r1&#xff1a; <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sys r1 [r1]int loop0 [r1-LoopBack0]ip add 192.168.1.1 24 [r1-LoopBack0]int g0/0/0 [r1-GigabitEthernet0/0/0]ip a…

Golang之路---04 并发编程——信道/通道

信道/通道 如果说 goroutine 是 Go语言程序的并发体的话&#xff0c;那么 channel&#xff08;信道&#xff09; 就是 它们之间的通信机制。channel&#xff0c;是一个可以让一个 goroutine 与另一个 goroutine 传输信息的通道&#xff0c;我把他叫做信道&#xff0c;也有人将…

基于STM32CubeMX和keil采用通用定时器中断实现固定PWM可调PWM波输出分别实现LED闪烁与呼吸灯

文章目录 前言1. PWM波阐述2. 通用定时器2.1 为什么用TIM142.2 TIM14功能介绍2.3 一些配置参数解释2.4 PWM实现流程&中断2.4.1 非中断PWM输出(LED闪烁)2.4.2 中断PWM输出(LED呼吸灯) 3. STM32CubeMX配置3.1 GPIO配置3.2 时钟配置3.3 定时器相关参数配置3.4 Debug配置3.5 中…

C# Blazor 学习笔记(11):路由跳转和信息传值

文章目录 前言路由跳转测试用例路由传参/路由约束想法更新&#xff1a;2023年8月4日 前言 Blazor对路由跳转进行了封装。 ASP.NET Core Blazor 路由和导航 NavigationManager 类 本文的主要内容就是全局的跳转 路由跳转 路由跳转就要用到NavigationManager 类。 其实最常用…

【腾讯云Cloud Studio实战训练营】使用React快速构建点餐H5

文章目录 前言一、Cloud Studio是什么二、Cloud Studio特点三、Cloud Studio使用1.访问官网2.账号注册3.模板选择4.模板初始化5.H5开发安装 antd-mobile安装 Less安装 normalize&#xff1a;上传项目需要的素材&#xff1a;替换App.js主文件&#xff1a;项目启动、展示 6.发布仓…

K8s中的Secret

Secret作用&#xff1a;加密数据存在etcd里面&#xff0c;让pod容器以挂载Volume方式进行访问。场景&#xff1a;凭据

数据集相关网站(Open datasets and sources)

数据集相关网站(Open datasets and sources&#xff09; 数据集网站 Open datasets and sources政府数据网站 Government Data:金融数据网站 Financial Data Sources:犯罪数据网站 Crime Data:健康数据网站 Health Data:学术和商业数据网站 Academic and Business Data:其他数据…

用C语言构建一个数字识别卷积神经网络

卷积神经网络的具体原理和对应的python例子参见末尾的参考资料2.3. 这里仅叙述卷积神经网络的配置, 其余部分不做赘述&#xff0c;构建和训练神经网络的具体步骤请参见上一篇: 用C语言构建一个手写数字识别神经网路 卷积网络同样采用简单的三层结构&#xff0c;包括输入层con…