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类和对象进阶:运算符重载 前言引入运算符重载定义语法注意事项重载为全局函数重载为成员函数运算符重载的本质 默认赋值运算符重载(默认成员函数)编译器自己生成的赋值运算符重载函数需要自己实现的场景总结默认赋值运算符重载 拷贝构造函数和赋值重载的区分验证 总…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...
