SpringCloud+SpringCloudAlibaba学习笔记
SpringCloud
服务注册中心
eureka
ap 高可用 分布式容错
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
eureka:instance:hostname: eureka7003.com #eureka服务端的实例名称instance-id: payment8001 prefer-ip-address: trueclient:register-with-eureka: false #false表示不向注册中心注册自己。fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务service-url:#集群指向其它eureka#defaultZone: http://eureka7002.com:7002/eureka/#单机就是7001自己defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/#server:#关闭自我保护机制,保证不可用服务被及时踢除#enable-self-preservation: false#eviction-interval-timer-in-ms: 2000
Ribbon 启用负载均衡
@EnableEurekaServer
@EnableDiscoveryClient@LoadBalanced
public RestTemplate getTemp() {return new RestTemplate();
}
zookepper
cp 强一致 分布式容错
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zookeeper-discovery</artifactId><exclusions><exclusion><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.6.1</version>
</dependency>
spring:application:name: cloud-zoo-consumer-ordercloud:zookeeper:connect-string: 192.168.10.58:2181
@SpringBootApplication
@EnableDiscoveryClient
consul
cp 强一致 分布式容错
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
spring:application:name: consul-payment-providercloud:consul:host: 192.168.10.58port: 8500discovery:service-name: ${spring.application.name}
@SpringBootApplication
@EnableDiscoveryClient
服务调用负载均衡
Ribbon
Ribbon 切换 负载规则
- 在springboot 包扫描外层建立 配置
@Configuration
public class Myrule {@Beanpublic IRule initRule() {return new RandomRule();}
}
- 启动类给指定服务加载随机方法
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = Myrule.class)
OpenFeign
- 添加maven依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 启动类启用Feign
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients
- 新建接口 并注册Feign信息
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE") //提供方服务名
public interface Service {@GetMapping(value = "/payment/get/{id}")Response<Payment> getPaymentById(@PathVariable("id") Long id);
}
- 提供方接口演示
@GetMapping(value = "/payment/get/{id}")
public Response<Payment> getPaymentById(@PathVariable("id") Long id) {Payment payment = paymentService.getPaymentById(id);if (payment != null) {return Result.success(200, "查询成功,serverPort: " + serverPort, payment);} else {return Result.success(444, "没有对应记录,查询ID: " + id, null);}
}
OpenFeign超时设置
ribbon:
#指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间ReadTimeout: 5000
#指的是建立连接后从服务器读取到可用资源所用的时间ConnectTimeout: 5000
OpenFeign 日志打印功能
- 配置Openfeign 日志级别
@Configuration
public class FeignLogConfig {@Beanpublic Logger.Level getLevel() {return Logger.Level.FULL;}
}
- yml 项目配置文件中,给指定Feign interface 配置日志级别
logging:level:ml.ytooo.feignservice.Service: debug
Hystrix 服务治理
- 服务降级 出险异常时,返回友好提示,防止程序异常或者阻塞
- 服务熔断 保险丝,当超出服务承载能力时,返回提示,拒绝请求
- 服务限流 闸门,配置服务承载能力
Hystrix
服务降级
当服务处理超时或者运行异常时,启动备选方案返回给调用者预期结果
主方法
@EnableCircuitBreaker
需要降级处理的程序
其中
- paymentInfo_TimeOut 为预计超时程序
- paymentInfo_TimeOut_Handler 为超时备选方案
@HystrixCommand(fallbackMethod = "paymentInfo_TimeOut_Handler", commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
})
public String paymentInfo_TimeOut(Integer id) {int time = 5;try { TimeUnit.MILLISECONDS.sleep(time * 1000); } catch (InterruptedException e) { e.printStackTrace(); }return "线程池: " + Thread.currentThread().getName() + " paymentInfo_TimeOut,id: " + id + "\t" + "O(∩_∩)O哈哈~" + " 耗时(秒): " + time;
}public String paymentInfo_TimeOut_Handler(Integer id) {return "线程池: " + Thread.currentThread().getName() + " paymentInfo_TimeOut_Handler,id: " + id + "\t" + "o(╥﹏╥)o";
}
全局降级处理
配置 defaultFallback 的走自己的降级方法,未配置的走 默认@DefaultProperties 指定的降级方法
@RestController
@Slf4j
@DefaultProperties(defaultFallback = "globle",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1500")
})
public class Controller {@HystrixCommand@GetMapping("/timeout/{id}")public String paymentInfo_TimeOut(@PathVariable("id") Integer id) {String result = feignService.paymentInfo_TimeOut(id);log.info("*****result: " + result);return result;}public String globle() {return "全局";}
}
通过OpenFeign 配置其提供方全局降级配置
- 新增feign调用接口的实现类 FeignServiceImpl,实现全部方法并做降级处理
@Service
public class FeignServiceImpl implements FeignService {@Overridepublic String paymentInfo_OK(Integer id) {return "降级 -- paymentInfo_OK";}@Overridepublic String paymentInfo_TimeOut(Integer id) {return "降级 -- paymentInfo_TimeOut";}
}
- feign调用接口添加注解
@FeignClient(value = "CLOUD-PROVIDER-HYSTYRIX-PAYMENT",fallback = FeignServiceImpl.class)
服务熔断
- 服务过载时,拒绝连接请求直接调用降级方法,返回异常
- 请求下降时,慢慢恢复该服务访问,直达完全恢复
配置服务的熔断:
一下配置在 10s 内 ,10次请求有60% 失败,则熔断
HystrixProperty 配置位于 HystrixCommandProperties.class 类中
//=====服务熔断
@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = { //@HystrixProperty(name = "circuitBreaker.enabled",value = "true"),// 是否开启断路器@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),// 请求次数@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), // 时间窗口期@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"),// 失败率达到多少百分百后跳闸
})
public String paymentCircuitBreaker(@PathVariable("id") Integer id)
{if(id < 0){throw new RuntimeException("******id 不能负数");}String serialNumber = IdUtil.simpleUUID();return Thread.currentThread().getName()+"\t"+"调用成功,流水号: " + serialNumber;
}
public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id) //熔断后降级方法
{return "id 不能负数,请稍后再试,/(ㄒoㄒ)/~~ id: " +id;
}
效果: 当连续使用 -100 请求时, 返回 "id 不能负数", 使用100请求也返回 "id 不能负数" ,继续连续使用 100请求, 服务慢慢恢复
服务限流
使用 springcloud 阿里巴巴 sentinel 替代
Gateway 网关
Gateway
Gateway 项目配置
- 添加maven依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
- 移除以下依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- yml 配置 (后续移步配置中心)
spring:application:name: cloud-gateaway-gateawaycloud:gateway:discovery:locator:enabled: trueroutes:- id: payment_get# uri: http://127.0.0.1:8001 #单一节点uri : lb://CLOUD-PAYMENT-SERVICE /#启用 注册中心集群predicates:- Path=/payment/get/**
- 注册进 Eureka 注册中心
Gateway 动态路由
- 开启 网关发现注册中心服务
spring:application:name: cloud-gateaway-gateawaycloud:gateway:discovery:locator:enabled: true
Gateway 断言
断言是判断转发请求的条件
predicates:- After=2020-02-21T15:51:37.485+08:00[Asia/Shanghai]
- After,Before,Between 配置转发生效时间
public static void main(String[] args) {ZonedDateTime now = ZonedDateTime.now();System.out.println(now);
}
// 2020-08-24T14:23:57.171+08:00[Asia/Shanghai]
- Cookie 请求需携带指定Cookie才可以访问
predicates:- Cookie=name,ytooo # key,value
- Header ≈ Cookie
predicates:- Header=name,ytooo # key,value
Gateway 过滤器
- (默认过滤器) 官方提供一系列过滤器,供我们 在请求转发之前,对请求进行加工处理
filters:- AddRequestParamter=rowid,1024
- 自定义过滤器
自定义全局过滤器
@Component
@Slf4j
public class GatewayLogFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("=====================进入全局过滤器=====================");String name = exchange.getRequest().getQueryParams().getFirst("name");if (null == name) {exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);return exchange.getResponse().setComplete();}return chain.filter(exchange);}@Overridepublic int getOrder() {return 0;}
}
SpringCloud Config 分布式配置中心, BUS 消息总线
分布式配置中心 SpringCloud Config
服务端配置
建立git仓库 https://github.com/youdmeng/cloud-config
引入 maven
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId>
</dependency>
3.启动类使配置生效
@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class ConfigMain3344 {public static void main(String[] args) {SpringApplication.run(ConfigMain3344.class, args);}
}
- 配置 配置文件
spring:application:name: cloud-config-centercloud:config:server:git:uri: https://github.com/youdmeng/cloud-configsearch-paths:- cloud-configlabel: master
- 请求访问 : http://127.0.0.1:3344/master/config-dev.yml
客户端配置
- 引入 maven
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-client</artifactId>
</dependency>
- 配置 配置文件
spring:application:name: cloud-condig-clientcloud:config:label: master # 分支name: config # 配置文件名称profile: dev # 版本uri: http://127.0.0.1:3344 # config服务端地址
手动刷新客户端配置
不建议使用
消息总线 Bus
设计逻辑
使用消息总线触发服务端的 bus/refresh 端点,刷新所有客户端config配置
初始条件
客户端,服务端都需要实现Springcloud Config功能
服务端配置
- 引入maven依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
- 配置文件中配置消息队列信息
# 配置消息队列
rabbitmq:host: 192.168.10.58port: 5672username: ytooopassword: ytooo
- 配置文件中配置BUS总线暴露信息
# 配置bus暴露端点
management:endpoints:web:exposure:include: "bus-refresh"
- 配置文件预览
server:port: 3344
spring:application:name: cloud-config-centercloud:config:server:git:uri: https://github.com/youdmeng/cloud-configsearch-paths:- cloud-configlabel: master# 配置消息队列rabbitmq:host: 192.168.10.58port: 5672username: ytooopassword: ytooo
eureka:instance:prefer-ip-address: trueinstance-id: cloud-config-center-3344client:fetch-registry: trueregister-with-eureka: trueservice-url:defaultZone: http://eureka7001.com:7001/eureka/ #,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
# 配置bus暴露端点
management:endpoints:web:exposure:include: "bus-refresh"
客户端配置
- 引入maven依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
- 配置文件中配置消息队列信息
# 配置消息队列
rabbitmq:host: 192.168.10.58port: 5672username: ytooopassword: ytooo
- 配置暴露端点
# 配置暴露端点
management:endpoints:web:exposure:include: "*"
- 调用配置类添加 @RefreshScope
@RestController
@RefreshScope
public class Controller {@Value("${config.info}")private String configInfo;@GetMapping(value = "/test")public String test() {return configInfo;}
}
刷新配置
POST 请求config服务端 http://127.0.0.1:3344/actuator/bus-refresh
刷新成功
定点通知
POST 请求config服务端 http://127.0.0.1:3344/actuator/bus-refresh/{destination}
destination: 注册中心服务名称:端口号
🌰: http://127.0.0.1:3344/actuator/bus-refresh/cloud-condig-client:3366
SpringCloud Stream 消息驱动
消息驱动,统一各种消息中间件中的差异,提供统一简单的调用方式,屏蔽消息中间件具体调用实现
SpringCloud Stream 消息提供者项目配置 (简单使用)
- 添加maven依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
- 配置文件添加Stream配置
spring:application:name: cloud-stream-providercloud:stream:binders: # 在此处配置要绑定的rabbitmq的服务信息;defaultRabbit: # 表示定义的名称,用于于binding整合type: rabbit # 消息组件类型environment: # 设置rabbitmq的相关的环境配置spring:rabbitmq:host: 192.168.10.58port: 5672username: ytooopassword: ytooobindings: # 服务的整合处理output: # 这个名字是一个通道的名称destination: studyExchange # 表示要使用的Exchange名称定义content-type: application/json # 设置消息类型,本次为json,文本则设置“text/plain”binder: defaultRabbit # 设置要绑定的消息服务的具体设置
- 定义消息推送管道
@EnableBinding(Source.class) //定义消息推送管道
public class MsgProviderImpl implements MsgProvider {
}
- 定义消息发送管道
@Autowired
private MessageChannel out; //定义消息发送管道
- build消息实体并发送
Message<String> message = MessageBuilder.withPayload(msg).build();
out.send(message);
- 消息接收方 yml 配置
spring:application:name: cloud-stream-rabbitmq-consumercloud:stream:binders: # 在此处配置要绑定的rabbitmq的服务信息;defaultRabbit: # 表示定义的名称,用于于binding整合type: rabbit # 消息组件类型environment: # 设置rabbitmq的相关的环境配置spring:rabbitmq:host: 192.168.10.58port: 5672username: ytooopassword: ytooobindings: # 服务的整合处理input: # 这个名字是一个通道的名称 destination: studyExchange # 表示要使用的Exchange名称定义 需与提供方相同content-type: application/json # 设置消息类型,本次为json,文本则设置“text/plain”binder: defaultRabbit # 设置要绑定的消息服务的具体设置
- 接收方监听接口配置
@EnableBinding(Sink.class)
public class ReceiveMsgImpl implements ReceiveMsg {
}
- 接收方注解
@StreamListener(Sink.INPUT)
public void receive(Message<String> message) {System.out.println("客服端8803收到消息: " + message.getPayload());
}
SpringCloud Stream 分组消费 & 持久化
- 对于不同的组中,消息是会被重复消费的(重复消费)
- 同一个组内,服务之间存在竞争关系,只被消费一次(集群环境,避免重复消费)
分组配置文件配置
bindings: # 服务的整合处理input: # 这个名字是一个通道的名称destination: studyExchange # 表示要使用的Exchange名称定义content-type: application/json # 设置消息类型,本次为json,文本则设置“text/plain”binder: defaultRabbit # 设置要绑定的消息服务的具体设置group: ytooo # 配置接收方所在组
group分组 持久化
当不配置分组时,重启服务,不会自动获取之前未消费的服务
反之,配置了分组,启动时,自动获取之前未消费的消息
Sleuth 分布式请求链路跟踪
我跳过了
SpringCloud Alibaba
Nacos 注册中心
添加依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
项目配置文件
spring:application:name: cloudalibaba-nacos-consumer-ordercloud:nacos:discovery:server-addr: 192.168.10.58:8848
主程序启动
@EnableDiscoveryClient
结合 Openfeign 调用 服务
Nacos config配置中心
- 添加maven 依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-nacos-config</artifactId>
</dependency>
- bootstrap.yml中添加 配置中心相关配置
spring:application:name: cloudalibaba-nacos-config-cclientcloud:nacos:discovery:server-addr: 192.168.10.58:8848config:server-addr: 192.168.10.58:8848file-extension: yamlprofiles:active: dev
- 业务类 添加 @RefreshScope 来自动刷新
@RestController
@RefreshScope
public class Controller {
- 配置文件中配置格式
在 Nacos Spring Cloud 中,dataId 的完整格式如下:
{spring.profiles.active}.${file-extension}
- prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
- spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 {file-extension}
- file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
本实例中文件名称应为: cloudalibaba-nacos-config-cclient-dev.yaml
Nacos config配置中心 分类配置
Nacos 使用3层来隔离服务
- NameSpace 命名空间,默认 public
- Group 组, 默认 DEFAULT_GROUP
- Service 微服务, 一个Service 可以包含多个Cluster集群,默认Cluster为 DEFAULT 可以用了区分地域,来做地域容灾
yml 中配置分组信息group ,和命名空间 namespace
spring:application:name: cloudalibaba-nacos-config-cclientcloud:nacos:discovery:server-addr: 192.168.10.58:8848config:server-addr: 192.168.10.58:8848file-extension: yamlgroup: devnamespace: a2438b02-01e1-4a3c-959c-600d93183d22 # 使用命名空间ID
Sentinel 服务熔断与降级
- 单独的组件
- 可以界面化,细粒度统一配置
Sentinel 服务被管方 配置
- maven 依赖
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId> <!-- Sentinel持久化 -->
</dependency>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
- yml 中配置 sentinel dashboard 监控
spring:application:name: cloudalibaba-sentinel-servicecloud:nacos:discovery:server-addr: 192.168.10.58:8848sentinel:transport:dashboard: 192.168.10.58:8888 # sentinel dashboard 地址
配置降级方法: 此方法只针对页面中配置的指定 降级限流热点等方法
@GetMapping(value = "/hot")
@SentinelResource(value = "hot", blockHandler = "deal_hot")
public String hot(String p1, String p2) {return "========================== 热点通过 ==========================";
}public String deal_hot(String p1, String p2, BlockException e) {return "========================== 热点降级 ==========================";
}
seata 分布式事务
全局事务id
TC 事务协调者 维护全局和分支事务状态,驱动全局事务的提交或回滚
TM 事务管理器 定义全局事务的范围,开始全局事务.提交或回滚全局事务
RM 资源管理器 管理分支事务处理的资源,与TC交谈来注册分支事务和报告分支事务的状态,并驱动分支事务的提交或回滚
喜欢的朋友记得点赞、收藏、关注哦!!!
相关文章:
SpringCloud+SpringCloudAlibaba学习笔记
SpringCloud 服务注册中心 eureka ap 高可用 分布式容错 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency><groupId…...
牛客小白月赛105(A~E)
文章目录 A lz的吃饭问题思路code B lz的数字问题思路code C lz的蛋挞问题思路code D lz的染色问题思路code E lz的括号问题思路code 总结 牛客小白月赛105 A lz的吃饭问题 思路 签到题,比较大小即可 code void solve(){int a,b,c,d;cin >> a >> b…...
OSPF协议整理
OSPF(Open Shortest Path First)即开放式最短路径优先协议,是一种广泛应用于大型网络中的链路状态路由协议。 OSPF 的基本概念 OSPF 是基于链路状态算法的内部网关协议(IGP),用于在一个自治系统ÿ…...
Java中的多线程
文章目录 Java中的多线程一、引言二、多线程的创建和启动1、继承Thread类2、实现Runnable接口 三、线程的常用方法1、currentThread()和getName()2、sleep()和yield()3、join() 四、线程优先级五、使用示例六、总结 Java中的多线程 一、引言 在Java中,多线程编程是…...
什么是聚簇索引、非聚簇索引、回表查询
其实聚集索引也叫聚簇索引,二级索引也叫非聚簇索引,大家不要认为这是不同的两个知识点。 定义 先看一下数据库的索引介绍。 聚簇索引 1. 如果存在主键(一般都存在),主键索引就是聚簇索引。 2. 如果不存在,…...
探索 Spring 框架核心组件:构建强大 Java 应用的基石
Spring框架作为Java企业级开发的首选框架之一,其强大的功能和灵活的架构深受开发者喜爱。Spring框架的核心组件共同构建了一个高效、可扩展的应用程序开发平台。本文将深入探讨Spring框架的核心组件,揭示它们如何在Spring框架中发挥关键作用。 一、Bean…...
Android 13 Aosp 默认允许应用动态权限
图库 frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java 修改 public void grantDefaultPermissions(int userId) {DelayingPackageManagerCache pm new DelayingPackageManagerCache();grantPermissionsToSysCompon…...
【C++知识总结1】c++第一篇,简单了解一下命名空间是什么
一、C的由来 C语言是一种结构化和模块化的编程语言,它对于处理较小规模的程序非常适用。然而,当面临需要高度抽象和建模的复杂问题,以及规模较大的程序时,C语言就显得不那么合适了。为了应对这种挑战,并在解决软件危机…...
从0开始深度学习(32)——循环神经网络的从零开始实现
本章将从零开始,基于循环神经网络实现字符级语言模型(不是单词级) 首先我们把从0开始深度学习(30)——语言模型和数据集中的load_corpus_time_machine()函数进行引用,用于导入数据: train_iter…...
GitLab使用操作v1.0
1.前置条件 Gitlab 项目地址:http://******/req Gitlab账户信息:例如 001/******自己的分支名称:例如 001-master(注:master只有项目创建者有权限更新,我们只能更新自己分支,然后创建合并请求&…...
cuda conda yolov11 环境搭建
优雅的 yolo v11 标注工具 AutoLabel Conda环境直接识别训练 nvidia-smi 检查CUDA版本 下载nvidia cudnn对应的版本 将cuDNN压缩包内对应的文件复制到本地bin、include、lib的文件夹中 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.6 miniConda快速开始-安装 执行…...
解决SpringBoot连接Websocket报:请求路径 404 No static resource websocket.
问题发现 最近在工作中用到了WebSocket进行前后端的消息通信,后端代码编写完后,测试一下是否连接成功,发现报No static resource websocket.,看这个错貌似将接口变成了静态资源来访问了,第一时间觉得是端点没有注册成…...
element-plus的组件数据配置化封装 - table
目录 一、封装的table、table-column组件以及相关ts类型的定义 1、ATable组件的封装 - index.ts 2、ATableColumn组件的封装 - ATableColumn.ts 3、ATable、ATableColumn类型 - interface.ts 二、ATable、ATableColumn组件的使用 三、相关属性、方法的使用以及相关说明 1. C…...
【二维动态规划:交错字符串】
介绍 编程语言:Java 本篇介绍一道比较经典的二维动态规划题。 交错字符串 主要说明几点: 为什么双指针解不了?为什么是二维动态规划?根据题意分析处转移方程。严格位置依赖和空间压缩优化。 题目介绍 题意有点抽象,…...
goframe开发一个企业网站 MongoDB 完整工具包18
1. MongoDB 工具包完整实现 (mongodb.go) package mongodbimport ("context""fmt""time""github.com/gogf/gf/v2/frame/g""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options" )va…...
在vue中,根据后端接口返回的文件流实现word文件弹窗预览
需求 弹窗预览word文件,因浏览器无法直接根据blob路径直接预览word文件,所以需要利用插件实现。 解决方案 利用docx-preview实现word文件弹窗预览,以node版本16.21.3和docx-preview版本0.1.8为例 具体实现步骤 1、安装docx-preview插件 …...
动态规划之背包问题
0/1背包问题 1.二维数组解法 题目描述:有一个容量为m的背包,还有n个物品,他们的重量分别为w1、w2、w3.....wn,他们的价值分别为v1、v2、v3......vn。每个物品只能使用一次,求可以放进背包物品的最大价值。 输入样例…...
【Python】 深入理解Python的单元测试:用unittest和pytest进行测试驱动开发
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 单元测试是现代软件开发中的重要组成部分,通过验证代码的功能性、准确性和稳定性,提升代码质量和开发效率。本文章深入介绍Python中两种主流单元测试框架:unittest和pytest,并结合测试驱动开发(TDD)…...
Java集合1.0
1.什么是集合? 集合就是一个存放数据的容器,准确的说是放数据对象引用的容器。 集合和数组的区别 数组是固定长度,集合是可变长度。数组可以存储基本数据类型,也可以存储引用数据类型,集合只能存储引用数据类型&…...
Leetcode 336 回文对
示例 1: 输入:words ["abcd","dcba","lls","s","sssll"] 输出:[[0,1],[1,0],[3,2],[2,4]] 解释:可拼接成的回文串为 ["dcbaabcd","abcddcba","sl…...
实现一个可配置的TCP设备模拟器,支持交互和解析配置
前言 诸位在做IOT开发的时候是否有遇到一个问题,那就是模拟一个设备来联调测试,虽然说现在的物联网通信主要是用mqtt通信,但还是有很多设备使用TCP这种协议交互,例如充电桩,还有一些工业设备,TCP这类报文交…...
算法的空间复杂度
空间复杂度 空间复杂度主要是衡量一个算法运行所需要的额外空间,在计算机发展早期,计算机的储存容量很小,所以空间复杂度是很重要的。但是经过计算机行业的迅速发展,计算机的容量已经不再是问题了,所以如今已经不再需…...
自定义协议
1. 问题引入 问题:TCP是面向字节流的(TCP不关心发送的数据是消息、文件还是其他任何类型的数据。它简单地将所有数据视为一个字节序列,即字节流。这意味着TCP不会对发送的数据进行任何特定的边界划分,它只是确保数据的顺序和完整…...
在 Taro 中实现系统主题适配:亮/暗模式
目录 背景实现方案方案一:CSS 变量 prefers-color-scheme 媒体查询什么是 prefers-color-scheme?代码示例 方案二:通过 JavaScript 监听系统主题切换 背景 用Taro开发的微信小程序,需求是页面的UI主题想要跟随手机系统的主题适配…...
autogen框架中使用chatglm4模型实现react
本文将介绍如何使用使用chatglm4实现react,利用环境变量、Tavily API和ReAct代理模式来回答用户提出的问题。 环境变量 首先,我们需要加载环境变量。这可以通过使用dotenv库来实现。 from dotenv import load_dotenv_ load_dotenv()注意.env文件处于…...
读《Effective Java》笔记 - 条目9
条目9:与try-finally 相比,首选 try -with -resource 什么是 try-finally? try-finally 是 Java 中传统的资源管理方式,通常用于确保资源(如文件流、数据库连接等)被正确关闭。 BufferedReader reader n…...
【软件入门】Git快速入门
Git快速入门 文章目录 Git快速入门0.前言1.安装和配置2.新建版本库2.1.本地创建2.2.云端下载 3.版本管理3.1.添加和提交文件3.2.回退版本3.2.1.soft模式3.2.2.mixed模式3.2.3.hard模式3.2.4.使用场景 3.3.查看版本差异3.4.忽略文件 4.云端配置4.1.Github4.1.1.SSH配置4.1.2.关联…...
nextjs window is not defined
问题产生的原因 在 Next.js 中,“window is not defined” 错误通常出现在服务器端渲染(Server - Side Rendering,SSR)的代码中。这是因为window对象是浏览器环境中的全局对象,在服务器端没有window这个概念。例如&am…...
C语言实现冒泡排序:从基础到优化全解析
一、什么是冒泡排序? 冒泡排序(Bubble Sort)是一种经典的排序算法,其工作原理非常直观:通过多次比较和交换相邻元素,将较大的元素“冒泡”到数组的末尾。经过多轮迭代,整个数组会变得有序。 二…...
windows11下git与 openssl要注意的问题
看了一下自己贴文的历史,有一条重要的忘了写了。 当时帮有位同事配置gitlab,众说周知gitlab是不太好操作。 但我还是自认自己git还是相当熟的。 解决了一系列问题,如配置代理,sshkey,私有库,等等࿰…...
南昌企业建站/seo课程培训
题面 \(Solution:\) 一开始想的是先跑一遍最短路,然后拆点之后再跑一遍,比较两次dis,然后发现拆点后会有负环(可能是我没想对拆点的方法),于是就放弃了拆点法。 我们考虑强制让每头牛选择走一条最短的,有草堆的路径&am…...
域名注册商网站/seo 优化 工具
1. 完成之前系列文章涉及内容后,继续在命名提示符下运行rendom /prepare,此步骤主要是校验DC是否全部准备完成,如下图所示;2. 如果上述步骤中出现失误,比如发现新域名书写错误等,可以运行rendom /end&#…...
怎么做网站互换链接/广州百度关键词推广
前几天看了springside4的mini-web代码发现确实有不少新的东东,咱这次单说说Spring Data JPA吧。 引用springside4的 wiki关于对Spring Data JPA的简介 Spring Data JPA在JPA上又做了一层封装,只要编写接口就够了,不用写一行实现代码ÿ…...
搜索引擎友好的网站有哪些特点/企业网站优化服务
您可以尝试p big 0pe,您要的功能是“加载虚拟软盘和CD映像,然后F5F6加载软盘驱动器,...这是我的计算机驱动程序,不包括超大声卡和图形卡根本不能使用64位,现在安装了32位WIN7,并建议使用驱动程序.我有安装包…...
hltm 做网站教程/专业郑州企业网站建设
大家,我已经提到了 material.needsUpdate & texture.needsUpdate ,但我还包括一个旋转的立方体,所以我知道动画例程在某种程度上起作用 .这是代码:if ( window.innerWidth 0 ) { window.innerWidth parent.innerWidt…...
自己做网站和凡科的区别/青岛seo建站
名字 strstr, strcasestr - 在字符串中定位一个子串概要 #include <string.h>char *strstr(const char *haystack, const char *needle);char *strcasestr(const char *haystack, const char *needle); // 是GNU的扩展描述 strstr()函数在haysta…...