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类和对象进阶:运算符重载 前言引入运算符重载定义语法注意事项重载为全局函数重载为成员函数运算符重载的本质 默认赋值运算符重载(默认成员函数)编译器自己生成的赋值运算符重载函数需要自己实现的场景总结默认赋值运算符重载 拷贝构造函数和赋值重载的区分验证 总…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...