springCloud-2021.0.9 之 服务调服务 示例
文章目录
- 前言
- springCloud-2021.0.9 之 服务调服务 示例
- 1. 主要用到的组件
- 2. 效果
- 3. 源码
- 3.1. 服务A
- 3.2. 服务B接受接口
前言
如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!
springCloud-2021.0.9 之 服务调服务 示例
这里我介绍一下,我用到的springCloud 是2021.0.9版本。
Maven 依赖管理配置引入 Spring Cloud 的 BOM(Bill of Materials)文件,主要作用如下:
-
版本统一:通过引入 BOM 文件,您可以统一管理项目中所有 Spring Cloud 相关依赖的版本,避免版本冲突和不一致。
-
简化依赖声明:在子模块中,您无需显式指定 Spring Cloud 相关依赖的版本号,Maven 会自动从 BOM 中获取版本信息。
与以前的引入方式相比,这种方法提供了更好的版本控制和依赖管理,特别是在处理多个子模块和复杂的依赖关系时,能够有效减少手动管理版本的复杂性。
1. 主要用到的组件
Spring Cloud OpenFeign:
这是一个声明式的 REST 客户端,使得调用其他服务的 REST API 变得非常简单。通过 @FeignClient 注解,可以方便地定义 HTTP 接口,自动实现与其他服务的调用。Fein 配合 Ribbon(负载均衡)使用时,可以轻松实现跨服务的调用。
Spring Cloud Eureka:
Eureka 是一个服务注册与发现组件。服务启动时会向 Eureka Server 注册自己,而需要访问其他服务时,可以通过 Eureka 来查找服务的实例。Eureka 可以帮助实现服务的动态发现和负载均衡。
Spring Cloud Circuit Breaker:
统一的熔断器框架,它允许你更方便地实现和管理服务调用中的容错机制。熔断器的核心功能是:当某个服务出现故障(例如超时、异常)时,熔断器会短时间内停止对该服务的调用,从而防止服务间的连锁故障,允许系统在一定程度上继续运行。
Spring Cloud LoadBalancer:
是 Spring Cloud 中的一个客户端负载均衡器,它提供了一种新的方式来替代 Ribbon,用于在服务间调用时实现负载均衡。它的目标是让负载均衡的实现更加简单,灵活并且易于与 Spring Cloud 的其他组件集成。
2. 效果

测试链路,从postmain 发起 调用到 GateWay 后调到 服务A 然后通过open-Feign 到服务B,下面是我准备的三个服务:

网关:SPRINGCLOUD-GATEWAY
服务A:SPRINGCLOUDSERVICEA
服务B:SPRINGCLOUDSERVICEB
发起请求:
http://127.0.0.1:8809/springCloudServiceA/api/test/weifuw/xxx

返回:
{"success": true,"code": "0","message": "操作成功!","data": "路径 xxx!"
}
查看zipkin:

调取网关的接口:

调取服务A的接口:

调取服务B的接口:

3. 源码
3.1. 服务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 http://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.15</version></parent><groupId>org.example</groupId><artifactId>springCloud-service-A</artifactId><version>1.0-SNAPSHOT</version><name>springCloud-service-A</name><properties><java.version>1.8</java.version><spring-cloud.version>2021.0.9</spring-cloud.version><mybatis.version>2.1.3</mybatis.version></properties><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><!-- 添加 Spring Cloud Resilience4j BOM --><dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-bom</artifactId><version>1.7.0</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><!--健康检查--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- 热部署模块 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional> <!-- 这个需要为 true 热部署才有效 --></dependency><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--多数据源--><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.1</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.22</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><!--aop--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!--feign 远程调用--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--注册中心客户端--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!--日志追踪--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-sleuth-zipkin</artifactId></dependency><!-- Spring Cloud Circuit Breaker 和 Spring Cloud LoadBalancer 来替代 Hystrix 和 Ribbon start --><!-- Spring Cloud LoadBalancer --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency><!-- Spring Cloud Circuit Breaker with Resilience4j --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId></dependency><dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-spring-boot2</artifactId></dependency><dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-spring</artifactId></dependency><!-- Spring Cloud Circuit Breaker 和 Spring Cloud LoadBalancer 来替代 Hystrix 和 Ribbon end --><!-- 整合 mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.2.0</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.version}</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.14</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>5.3.4.Final</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--springfox start --><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-ui</artifactId><version>1.7.0</version></dependency><!--springfox end --><!-- 密码加密 --><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.4</version></dependency><!-- flyway -->
<!-- <dependency>-->
<!-- <groupId>org.flywaydb</groupId>-->
<!-- <artifactId>flyway-core</artifactId>-->
<!-- <version>5.2.3</version>-->
<!-- </dependency>--></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.6.15</version><executions><execution><goals><goal>repackage</goal></goals><phase>package</phase></execution></executions><configuration><excludeDevtools>true</excludeDevtools></configuration></plugin></plugins></build></project>
AppConfig:
package org.example.config;import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;/**
* @description: TODO
* @author 杨镇宇
* @date 2024/7/29 11:32
* @version 1.0
*/@Configuration
public class AppConfig {/*** 直接使用@LoadBalanced注解创建一个负载均衡的RestTemplate实例:*/@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}
Resilience4JConfig:
package org.example.config;
import io.github.resilience4j.timelimiter.TimeLimiterConfig;
import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JCircuitBreakerFactory;
import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JConfigBuilder;
import org.springframework.cloud.client.circuitbreaker.Customizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;import java.time.Duration;/**
* @description: Resilience4J Circuit Breakers 断路器提供默认配置
* @author 杨镇宇
* @date 2024/7/29 18:22
* @version 1.0
*/
@Configuration
public class Resilience4JConfig {@Beanpublic Customizer<Resilience4JCircuitBreakerFactory> defaultCustomizer() {return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id).timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(4)).build()).circuitBreakerConfig(CircuitBreakerConfig.ofDefaults()).build());}
}
controller:
package org.example.controller;import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.example.exception.model.ResponseResult;
import org.example.service.TestOneService;
import org.example.vo.ScanVo;
import org.springframework.cloud.client.circuitbreaker.CircuitBreaker;
import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;/*** @author yangzhenyu* */
@OpenAPIDefinition(info = @io.swagger.v3.oas.annotations.info.Info(title = "示例 API",version = "1.0",description = "这是一个示例 API 文档"),tags = {@Tag(name = "Example", description = "示例 API")}
)
@Validated
@RestController
@Slf4j
@RequestMapping(value="api/test")
public class TestController {@Resourceprivate TestOneService service;@Operation(summary = "测试微服务调用接口",description = "测试微服务调用接口",responses = {@ApiResponse(responseCode = "200",description = "成功",content = @Content(mediaType = "application/json",schema = @Schema(implementation = ResponseResult.class))),@ApiResponse(responseCode = "400", description = "请求错误")})@CrossOrigin(origins = "*") //处理跨域请求的注解@RequestMapping(value = "/weifuw/{path}", method = RequestMethod.GET)public ResponseResult weifuw(@PathVariable(value = "path") String path){log.info("=========调用服务B============参数:{}",path);return service.scan(path);}}
service:
/**
* @description: TODO
* @author 杨镇宇
* @date 2024/7/29 15:00
* @version 1.0
*/public interface TestOneService {ResponseResult scan(String path);}
package org.example.service.impl;import org.apache.commons.lang3.StringUtils;
import org.example.client.SpringCloudServiceBClient;
import org.example.exception.model.ResponseResult;
import org.example.service.TestOneService;
import org.example.vo.ScanVo;
import org.springframework.stereotype.Service;import javax.annotation.Resource;/**
* @description: TODO
* @author 杨镇宇
* @date 2024/7/29 15:02
* @version 1.0
*/
@Service
public class TestOneServiceImpl implements TestOneService {@Resourceprivate SpringCloudServiceBClient client;@Overridepublic ResponseResult scan(String path) {ScanVo v1 = ScanVo.builder().path(path).build();String scan = client.scan(v1);if (StringUtils.isNotBlank(scan)){return ResponseResult.ok(scan);}return null;}
}
Client:
package org.example.client;import org.example.vo.ScanVo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;/**
* @description: TODO
* @author 杨镇宇
* @date 2024/7/29 15:04
* @version 1.0
*/
@FeignClient(name = "springCloudServiceB", fallback = SpringCloudServiceBClientFallback.class)
public interface SpringCloudServiceBClient {@RequestMapping(value = "/api/test/scan", method = RequestMethod.POST)String scan(@RequestBody ScanVo scanVo);
}
package org.example.client;import org.example.exception.ExceptionEnum;
import org.example.exception.ResultCode;
import org.example.exception.throwtype.RunException;
import org.example.vo.ScanVo;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;/**
* @description: TODO
* @author 杨镇宇
* @date 2024/7/29 15:13
* @version 1.0
*/
@Component
public class SpringCloudServiceBClientFallback implements SpringCloudServiceBClient{//自定义的降级处理逻辑@Overridepublic String scan(ScanVo scanVo) {ResultCode r = ExceptionEnum.FALLBACK_RESPONSE_ERROR;r.setDesc("---springCloudServiceB----" + HttpStatus.SERVICE_UNAVAILABLE.getReasonPhrase());throw new RunException(r);}
}
yml:
server:port: 9008zipkin:base-url: http://127.0.0.1:9411/#让nacos把它当成一个URL,而不要当做服务名discovery-client-enabled: false
eureka:instance:prefer-ip-address: true # 优先ip注册client:service-url:defaultZone: http://127.0.0.1:8761/eureka # 注册中心地址down:url: http://127.0.0.1:8761/actuator/service-registry?status=DOWN
feign:client:config:default:connectTimeout: 60000 # 连接超时时间,单位毫秒readTimeout: 60000 # 读取超时时间,单位毫秒circuitbreaker:enabled: true
resilience4j.circuitbreaker: # 保护服务不被外部不稳定的服务影响,避免连锁故障。configs:default:slidingWindowSize: 50 # 滑动窗口的大小为 100。permittedNumberOfCallsInHalfOpenState: 10 # 在半开状态下,允许10次调用以测试服务是否恢复正常。waitDurationInOpenState: 50s # 断路器在打开状态下等待50秒后,尝试进入半开状态。failureRateThreshold: 60 # 如果失败率超过 60%,则断路器会切换到打开状态。eventConsumerBufferSize: 10 # 用于事件消费的缓冲区大小,设置为 10registerHealthIndicator: true # 是否注册健康指示器,允许通过 /actuator/health 端点监控断路器状态。someShared: # 共享的配置模板slidingWindowSize: 50 # 滑动窗口的大小为 50,即窗口内包含最近 50 次调用的数据。permittedNumberOfCallsInHalfOpenState: 10 # 在半开状态下,允许 10 次调用来测试服务是否恢复正常。instances:springCloudServiceB:registerHealthIndicator: true # 注册健康指示器,可以通过/actuator/health监控断路器状态。slidingWindowSize: 50 # 滑动窗口的大小为 100。minimumNumberOfCalls: 20 # 至少20次调用后开始计算失败率。permittedNumberOfCallsInHalfOpenState: 10 # 在半开状态下,允许10次调用以测试服务是否恢复正常。waitDurationInOpenState: 50s # 断路器在打开状态下等待50秒后,尝试进入半开状态。slidingWindowType: TIME_BASED #滑动窗口类型为时间基础型(TIME_BASED),即基于时间的窗口。
resilience4j.timelimiter: # 限制外部服务的响应时间,防止服务被长时间挂起。configs:default:timeoutDuration: 2s # 设置操作的超时时间为 2 秒。如果操作在 2 秒内没有完成,将会被取消。cancelRunningFuture: true # 是否在超时后取消正在运行的操作。instances:springCloudServiceB:timeoutDuration: 2s # 设置操作的超时时间为 2 秒。如果操作在 2 秒内没有完成,将会被取消。cancelRunningFuture: true # 是否在超时后取消正在运行的操作。
spring:sleuth:zipkin:http:connect-timeout: 5000 # 连接超时设置为5秒read-timeout: 10000 # 读取超时设置为10秒application:name: springCloudServiceAcloud:loadbalancer:retry:enabled: true # 启用重试maxAttempts: 3 # 设置最大重试次数backoff:initialInterval: 1000 # 初始重试间隔时间(毫秒)maxInterval: 3000 # 最大重试间隔时间(毫秒)multiplier: 1.5 # 间隔时间增量因子service-instance-selector: random # 全局使用随机负载均衡策略datasource:dynamic: # druid连接池配置primary: master #默认数据源datasource:master: #主库配置username: TESTDB #TESTDBpassword: ENC(xuBgV6ZA7A6LSZ8PbaAFWg==) #TESTDBdriver-class-name: ${datasource_driver_class_name:com.mysql.cj.jdbc.Driver}url: ${datasource_url:jdbc:mysql://127.0.0.1:3306/TESTDB?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC}druid:initial-size: 5 #启动程序时,在连接池中初始化多少个连接max-active: 20 #连接池中最多支持多少个活动会话min-idle: 5 #回收空闲连接时,将保证至少有minIdle个连接max-wait: 60000 #程序向连接池中请求连接时,超过maxWait的值后,认为本次请求失败,即连接池filters: stat,wall,slf4jslave: #从库配置username: TESTDB #TESTDBpassword: ENC(xuBgV6ZA7A6LSZ8PbaAFWg==) #TESTDBdriver-class-name: ${datasource_driver_class_name:com.mysql.cj.jdbc.Driver}url: ${datasource_url:jdbc:mysql://127.0.0.1:3306/TESTDB?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC}druid:initial-size: 5 #启动程序时,在连接池中初始化多少个连接max-active: 20 #连接池中最多支持多少个活动会话min-idle: 5 #回收空闲连接时,将保证至少有minIdle个连接max-wait: 60000 #程序向连接池中请求连接时,超过maxWait的值后,认为本次请求失败,即连接池filters: stat,wall,slf4jspringdoc:api-docs:path: /v3/api-docsswagger-ui:path: /swagger-ui.html
management:endpoints:web:exposure:include: health, metrics, info, httptrace#jasypt:
# encryptor:
# property: resolver # 使用自定义的 EncryptablePropertyResolver
# bean: encryptionPropertyResolver
#logging:
# level:
# org.springframework: DEBUGjasypt:encryptor:#password 本地环境将密钥放入yml文件中,生产需要jvm携带 -Djasypt.encryptor.password=xxxxxpassword: yzy_@user!1Uxalgorithm: PBEWithMD5AndDESiv-generator-classname: org.jasypt.iv.NoIvGenerator
3.2. 服务B接受接口
/*** @author yangzhenyu* */
@Validated
@RestController
@Slf4j
@RequestMapping(value="api/test")
public class TestController {@Operation(summary = "测试接口",description = "通过微服务调触发此测试接口",requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "调用测试接口的对象",required = true,content = @Content(mediaType = "application/json",schema = @Schema(implementation = ScanVo.class))),responses = {@ApiResponse(responseCode = "201", description = "测试成功"),@ApiResponse(responseCode = "400", description = "请求错误")})@CrossOrigin(origins = "*") //处理跨域请求的注解@RequestMapping(value = "/scan", method = RequestMethod.POST)public String scan(@Validated @RequestBody ScanVo scanVo) {String format = String.format("路径 %s!", scanVo.getPath());log.info(format);return format;}}相关文章:
springCloud-2021.0.9 之 服务调服务 示例
文章目录 前言springCloud-2021.0.9 之 服务调服务 示例1. 主要用到的组件2. 效果3. 源码3.1. 服务A3.2. 服务B接受接口 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。 而且听说点赞的人每…...
如何使用DHTMLX Scheduler的拖放功能,在 JS 日程安排日历中创建一组相同的事件
DHTMLX Scheduler 是一个全面的调度解决方案,涵盖了与规划事件相关的广泛需求。假设您在我们的 Scheduler 文档中找不到任何功能,并且希望在我们的 Scheduler 文档中看到您的项目。在这种情况下,很可能可以使用自定义解决方案来实现此类功能。…...
QxOrm生成json
下载Qxorm-1.5版本 使用vs打开项目,直接生成即可: lib目录中会生成dll和lib文件 新建Qt项目使用Qxorm: 将QxOrm中上面三个目录拷贝到新建的Qt项目中 pro文件添加使用QxOrm第三方库 INCLUDEPATH $$PWD/include/ LIBS -L"$$PWD/lib" LIBS…...
XS9922B(CHIPUP) 模拟高清 寄存器手册 XS9922B 四通道 多合一模拟高清解码芯片
XS9922B 是一款 4 通道模拟复合视频解码芯片,支持 HDCCTV 高清协议和 CVBS 标 清协议,视频制式支持 720P/1080P 高清制式和 960H/D1 标清制式。芯片将接收到的高清 模拟复合视频信号经过模数转化,视频解码以及 2D 图像处理之后…...
Django创建超管用户
在 Django 中创建超级用户(superuser)可以通过命令行工具 createsuperuser 完成。以下是具体步骤: 1. 确保已进行数据库迁移 在创建超级用户前,确保已执行数据库迁移: python manage.py migrate 2. 创建超级用户 …...
基于Kotlin中Flow扩展重试方法
最近项目中统一采用Kotlin的Flow来重构了网络请求相关代码。 目前的场景是,接口在请求的时候需要一个accessToken值,因为此值会过期或者不存在,需要刷新,因此最终方案是在使用Flow请求的时候先获取accessToken值然后再进行接口请求…...
好好说话:深度学习扫盲
大创项目是和目标检测算法YOLO相关的,浅浅了解了一些有关深度学习的知识。在这里根据本人的理解做一些梳理。 深度学习是什么? 之前经常听到AI,机器学习,深度学习这三个概念,但是对于三者的区别一直很模糊。 AI&…...
【状态空间方程】对于状态空间方程矩阵D≠0时的状态反馈与滑模控制
又到新的一年啦,2025新年快乐~。前几个月都没更新,主要还是因为不能把项目上的私密工作写进去,所以暂时没啥可写的。最近在山里实习,突然想起年前遗留了个问题一直没解决,没想到这两天在deepseek的加持下很快解决了&am…...
腾讯大数据基于 StarRocks 的向量检索探索
作者:赵裕隆,腾讯大数据研发工程师 本文整理自腾讯大数据工程师在 StarRocks 年度峰会上的分享,深入探讨了向量检索技术的原理与应用。此功能已应用到腾讯内部多个场景,引入 StarRocks 后,业务不仅不需要维护多套数据库…...
Linux系统调用
文章目录 系统调用和POSIX标准系统调用表程序直接访问系统调用新增系统调用 在linux中,内核空间和用户空间之间增加了一个中间层——系统调用层,如下图: 系统内调用层主要作用: 为用户空间程序提供一层硬件抽象接口。保证系统稳定…...
如何在Servlet容器中使用HttpServletResponse?
HttpServletResponse 是 Java Servlet API 中的一个接口,它代表了服务器对客户端的响应。通过 HttpServletResponse 对象,可以设置响应的状态码、发送数据到客户端(如 HTML 页面、文件等)、添加响应头信息等。下面是如何在 Servle…...
SpringCloud - Seata 分布式事务
前言 该博客为Sentinel学习笔记,主要目的是为了帮助后期快速复习使用 学习视频:7小快速通关SpringCloud 辅助文档:SpringCloud快速通关 源码地址:cloud-demo 一、简介 官网:https://seata.apache.org/zh-cn/ Seata …...
Ansible批量配置服务器免密登录步骤详解
一、准备工作 192.168.85.138 安装ansible,计划配置到139的免密 192.168.85.139 待配置免密 1. 生成SSH密钥对 在Ansible控制节点生成密钥对,用于后续免密认证: ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa 全部回车默认,无…...
互联网大厂中面试的高频计算机网络问题及详解
前言 哈喽各位小伙伴们,本期小梁给大家带来了互联网大厂中计算机网络部分的高频面试题,本文会以通俗易懂的语言以及图解形式描述,希望能给大家的面试带来一点帮助,祝大家offer拿到手软!!! 话不多说,我们立刻进入本期正题! 一、计算机网络基础部分 1 …...
人工智能时代下ai智能语音机器人如何以假乱真?
智能语音机器人若要达到以假乱真的效果,需要在以下几个关键方面不断提升: 一、语音合成技术 音色模拟 多维度采样 对大量真人语音样本进行多维度采样,包括不同年龄、性别、地域的人的语音。例如,采集不同年龄段男性从低沉到清亮…...
【橘子ES】Aggregations 聚合准备
一、聚合的概念 聚合文档 聚合区别于检索,检索是使用一系列条件把文档从es中搜索回来。但是聚合则是在搜索回来的文档的基础上进一步进行处理。 简单来说聚合就是将数据汇总为指标、统计数据或其他分析。聚合可以解决以下几类问题: 我的网站的平均加载…...
vue3读取webrtc-stream 视频流
一.首先下载webrtc-stream,方便自己本地搭建视频流服务 https://download.csdn.net/download/cyw8998/90373521 解压后,启动命令 webrtc-streamer.exe -H 127.0.0.1:8020 二.vue3代码如下 <template><h1>video</h1><video id&…...
springcloud集成gateway
本篇文章只介绍gateway模块的搭建步骤,并无gateway详细介绍 gateway详解请查看:SpringCloudGateway官方文档详解 前置处理 父模块中已指定版本 不知道如何选择版本看这篇: 手把手教你梳理springcloud与springboot与springcloudalibaba的版本…...
2025常用的SEO工具有哪些?
在互联网时代,如何让自己的网站或内容脱颖而出,成为许多企业和个人站长们最关注的问题。而在这个过程中,SEO(搜索引擎优化)作为一种有效的提升网站曝光度和吸引流量的手段,已经成为了网站运营的核心之一。对…...
C++类和对象进阶:运算符重载深度详解
C类和对象进阶:运算符重载 前言引入运算符重载定义语法注意事项重载为全局函数重载为成员函数运算符重载的本质 默认赋值运算符重载(默认成员函数)编译器自己生成的赋值运算符重载函数需要自己实现的场景总结默认赋值运算符重载 拷贝构造函数和赋值重载的区分验证 总…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
