springCloud特色知识记录(基于黑马教程2024年)
目录
Nacos 简介
Nacos 的特点
Nacos 的使用步骤可以查看黑马教程文档:day03-微服务01 - 飞书云文档 (feishu.cn)
OpenFeign 的使用步骤
Feign Logger.Level 的选项
网关
自定义过滤器(拦截器)
网关到微服务的用户传递
META-INF是什么?
微服务之间的用户传递
配置管理
如何进行配置管理?
如果进行热部署更新?
更新路由
微服务保护和分布式管理
雪崩问题
sentinel是什么?
如何使用sentinel?
熔断的具体实现步骤
主要逻辑
如何解决雪崩问题
分布式事务(多个服务或数据库之间数据一致性的问题)
编辑
什么事seata?
XA模式
AT模式
Nacos 简介
Nacos 是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台。它在微服务架构中常被用作服务注册中心和配置中心。
Nacos 的特点
- 服务发现与注册:支持 DNS 和 HTTP 协议的服务发现。
- 动态配置管理:支持实时动态配置刷新。
Nacos 的使用步骤可以查看黑马教程文档:day03-微服务01 - 飞书云文档 (feishu.cn)
通常Nacos会和OpenFeign结合使用 更加方便
OpenFeign的产生就是为了让远程调用像本地方法调用一样简单。
使用步骤:
1.引入服务注册和服务发现的依赖
<!--nacos 服务注册发现-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--nacos 服务注册发现-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2. 配置Nacos地址
spring:cloud:nacos:server-addr: 自己的虚拟机Ip:8848
OpenFeign 的使用步骤
-
引入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
-
开启 Feign 功能 在主类上添加
@EnableFeignClients
注解。@SpringBootApplication @EnableFeignClients public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);} }
-
定义 Feign 客户端 使用
@FeignClient
注解标注接口,指定调用的服务名称。@FeignClient(name = "service-name") public interface MyFeignClient {@GetMapping("/api/endpoint")String getEndpoint(); }
-
调用 Feign 接口 注入定义的 Feign 接口并调用方法。
@RestController public class MyController {@Autowiredprivate MyFeignClient myFeignClient;@GetMapping("/call")public String callService() {return myFeignClient.getEndpoint();} }
如果将这个代理的专门使用一个包提取出来,那么我们需要在启动类上面添加扫描包的注解
package com.hmall.pay;import com.hmall.api.config.DefaultFeignConfig;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;@MapperScan("com.hmall.pay.mapper")
@SpringBootApplication
@EnableFeignClients(basePackages = "com.hmall.api.client" ,defaultConfiguration = DefaultFeignConfig.class)
public class PayApplication
{public static void main(String[] args) {SpringApplication.run(PayApplication.class, args);}
}
在 Spring Boot 的微服务项目中,上述代码配置了 defaultConfiguration
属性来指定一个默认的配置类 DefaultFeignConfig
,它用于 Feign 客户端的默认行为设置。具体来说,这是为了增强日志打印功能,方便开发者在调用微服务时追踪和调试。
以下是DefaultFeignConfig的内容:
package com.hmall.api.config;import feign.Logger;
import org.springframework.context.annotation.Bean;public class DefaultFeignConfig
{@Beanpublic Logger.Level feignLoggerLevel(){return Logger.Level.FULL;}
}
Feign Logger.Level 的选项
- NONE:不记录任何日志(默认值)。
- BASIC:记录请求方法、URL、响应状态码以及执行时间。
- HEADERS:在 BASIC 的基础上,记录请求和响应的头信息。
- FULL:记录请求和响应的所有信息,包括头、体、元数据。
网关
服务拆分之后面临两大问题:
1.服务地址过多,前端不知道如何请求谁
2. 每个服务都可以需要登录信息
自定义过滤器(拦截器)
NettyRoutingFilter
是 Spring Cloud Gateway 中的一个核心过滤器,它负责将请求真正路由到目标服务,并处理响应的回传。简单来说,这是网关在处理请求时,实际完成路由和转发的核心组件
网关到微服务的用户传递
网关层的请求拦截: 在微服务架构中,为了提高安全性和请求处理的一致性,需要在网关层对所有请求进行统一拦截。具体要求如下:
- 放行无需登录的请求:对于公共接口或资源,不进行Token校验,直接放行。
- 拦截需要登录的请求:对于需要登录的请求,检查
Request
中是否包含有效的Token。- 如果Token不存在或无效,返回HTTP状态码
401 (UNAUTHORIZED)
,表示用户未登录,并终止请求的后续处理(调用response.setComplete()
)。 - 如果Token有效,解析Token获取用户的唯一标识(如用户ID),将该用户ID通过
ServerWebExchange
注入到请求头中,然后继续放行请求。
- 如果Token不存在或无效,返回HTTP状态码
String id = userId.toString();ServerWebExchange swe = exchange.mutate().request(build -> build.header("user-info", id)).build();
微服务中如何获取用户ID: 通常情况下,微服务可以通过读取请求头中的user-info
字段获取用户ID。然而,如果每个微服务都单独实现一个拦截器,会导致代码重复、不便于维护。
为了解决这个问题,可以将通用的拦截器逻辑抽取到common
模块。所有微服务都引入common
模块,直接复用其中的拦截器。这种方式可以避免重复开发,提高代码的复用性和一致性。但是这个时候springBoot无法扫描到这个拦截器的包,因此拦截器不会失效。所以要配置spring.factories
文件
基于Spring Boot的拦截器配置: 微服务通常基于Spring Boot,而不是传统的Spring MVC。如果直接使用Spring MVC的拦截器,在Spring Boot环境下可能会报错。
总结:为了解决上述问题,可以通过在common
模块中为拦截器配置META-INF
文件,同时在拦截器类上添加@ConditionalOnClass(DispatcherServlet.class)
注解。这样可以确保拦截器仅在支持Spring MVC的环境中加载,从而避免不兼容问题。
META-INF是什么?
META-INF 是Java程序的一个特殊目录,用于存放配置文件和元数据信息。它通常位于JAR文件的根目录下,主要包含以下类型的内容:
-
MANIFEST.MF 文件:
- Java的清单文件,用于描述JAR包的信息。
- 包括主类、版本号、依赖项等。
-
Spring Boot相关配置:
- 例如,
spring.factories
文件,用于注册自动配置类。 - 格式为键值对,可以定义拦截器、过滤器等组件的自动加载逻辑。
- 例如,
-
服务注册文件:
- 用于SPI(服务提供接口)机制,例如
META-INF/services
目录下的文件定义了特定接口的实现类。
- 用于SPI(服务提供接口)机制,例如
示例:在common
模块中的spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.hmall.common.config.MyBatisConfig,\com.hmall.common.config.JsonConfig,\com.hmall.common.config.MvcConfig
微服务之间的用户传递
如果是微服务之间的用户Id传递的话,其实获取到的用户id的值是null,因为微服务之间的网络请求不是通过网关的,所以网关无法在请求头中设置userId,其他服务也不可以获取到userId的值了
微服务之间是通过openFeign进行网络请求转发的,在转发之前我们是可以获得用户Id的,所以我们可以在请求发送之前设置拦截器,如果我们在每一个微服务都加一个拦截器太麻烦了。所以我们选择加在专门写FeignClient的模块
中(hm-api)
那么我们应该如何改造转发的请求呢?在转发之前我们是可以获取到用户id的,所以我们可以借助Feign中提供的一个拦截器接口:feign.RequestInterceptor
public interface RequestInterceptor {/*** Called for every request. * Add data using methods on the supplied {@link RequestTemplate}.*/void apply(RequestTemplate template);
}
我们只需要实现这个接口,然后实现apply方法,利用RequestTemplate
类来添加请求头,将用户信息保存到请求头中。这样以来,每次OpenFeign发起请求的时候都会调用该方法,传递用户信息。
package com.hmall.api.config;import com.hmall.common.utils.UserContext;
import feign.Logger;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Bean;public class DefaultFeignConfig
{@Beanpublic Logger.Level feignLoggerLevel(){return Logger.Level.FULL;}@Beanpublic RequestInterceptor userInfoRequestInterceptor(){return new RequestInterceptor() {@Overridepublic void apply(RequestTemplate requestTemplate) {// 获取用户IdLong user = UserContext.getUser();if(user == null) {// 如果为空则直接跳过return;}// 存入请求头当中requestTemplate.header("user-info",user.toString());}};}}
- 网关部分:用户身份校验,并将用户信息存入请求头。
- 微服务部分:使用拦截器提取用户信息存入
ThreadLocal
,微服务间通过 OpenFeign 的 RequestInterceptor 传递用户信息。
配置管理
在微服务架构中,服务数量众多且配置管理复杂,常常导致重复代码和维护成本增加。通过 Nacos 的配置管理功能,我们能够实现配置的统一管理和动态更新,提升开发效率并减少运维压力。
在微服务架构中,每个服务都需要独立管理自己的配置文件,例如数据库连接(JDBC)、日志配置、Swagger 接口文档配置等。这些配置中往往存在大量重复内容,既增加了维护成本,也容易引发配置不一致问题。
Nacos 是一款集服务注册与配置管理于一体的工具,通过将公共配置提取到 Nacos 中并实现动态加载,可以有效减少代码冗余、降低维护难度并支持配置实时更新。
如何进行配置管理?
引入 Maven 依赖
在 Spring Boot 项目中,添加以下依赖:
<!--nacos配置管理--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!--读取bootstrap文件--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency>
2. 在Nacos网址上面添加配置,分别提取jdbc-mysql配置,swagger配置,日志的配置
jdbc共享配置:
spring:datasource:url: jdbc:mysql://${hm.db.host:192.168.88.130}:${hm.db.port:3306}/${hm.db.database}?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true&autoReconnect=true&failOverReadOnly=falsedriver-class-name: com.mysql.cj.jdbc.Driverusername: ${hm.db.un:root}password: ${hm.db.pw:123}
mybatis-plus:configuration:default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandlerglobal-config:db-config:update-strategy: not_nullid-type: auto
日志的共享配置:
logging:level:com.hmall: debugpattern:dateformat: HH:mm:ss:SSSfile:path: "logs/${spring.application.name}"
swagger的共享配置:
knife4j:enable: trueopenapi:title: ${hm.swagger.title:"黑马商城购物车接口文档"}description: ${hm.swagger.desc:"黑马商城购物车接口文档"}email: zhanghuyi@itcast.cnconcat: 虎哥url: https://www.itcast.cnversion: v1.0.0group:default:group-name: defaultapi-rule: packageapi-rule-resources:- com.hmall.cart.controller- ${hm.swagger.package}
3. 创建bootstrap.yaml 公共配置是动态的,所以我们需要在 bootstrap.yaml进行配置
必须配置其 spring: application: name,profiles: active: ,cloud:nacos:config:extension
spring:application:name: cart-service # 服务名称profiles:active: devcloud:nacos:server-addr: 192.168.88.130 # nacos地址config:file-extension: yaml # 文件后缀名shared-configs: # 共享配置- dataId: shared-jdbc.yml # 共享mybatis配置- dataId: shared-log.yml # 共享日志配置- dataId: shared-swagger.yml # 共享日志配置
注意这里的shared-configs的dataId的配置名一定要和Nacos里面的一模一样 ,如果 dataId
与 Nacos 中的配置名称不一致,服务将无法加载到对应的共享配置,从而导致启动失败或无法正确读取配置
4. 剩余部分就需要在application.yaml里面配置
server:port: 8082
feign:okhttp:enabled: true # 开启OKHttp连接池支持
hm:swagger:title: 购物车服务接口文档package: com.hmall.cart.controllerdb:host: 192.168.88.130 # 修改为你自己的虚拟机IP地址database: hm-cart
如果进行热部署更新?
进入Nacos网站http://192.168.88.130:8848/nacos 开始添加配置
使用默认的 应用名称.yaml
(例如,cart-service.yaml
),这样无需显式在 bootstrap.yaml
中指定 dataId
什么是默认的?
应用名称作为默认 Data ID
Spring Boot 项目的 spring.application.name
属性会作为 Nacos 配置的默认 Data ID
。
例如: 如果你的 bootstrap.yaml
配置如下:
spring:application:name: cart-servicecloud:nacos:server-addr: 192.168.88.130:8848
那么 Nacos 会自动尝试加载以下文件作为配置:
Data ID: cart-service.yaml
Group: DEFAULT_GROUP
-
优先加载的文件格式
默认情况下,Nacos 会加载和spring.cloud.nacos.config.file-extension
对应的文件格式(默认为yaml
)。 -
无需显式指定 Data ID
只要 Nacos 配置文件的Data ID
与spring.application.name
一致(并以.yaml
作为后缀),就会被自动加载,而无需手动在bootstrap.yaml
中声明shared-configs
或特定dataId
。
配置项前缀匹配:prefix
指定的值必须在配置文件中明确存在。例如,hm.cart
对应的配置项必须是以下形式之一:
- 在对应的
yml
中,配置如下,hm:cart:maxAmount: 10
此时对应的配置类的注解@ConfigurationProperties(prefix = "hm.cart")的prefix必须是hm.cart
package com.hmall.cart.config;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Data
@Component
@ConfigurationProperties(prefix = "hm.cart")
public class CartProperties {private Integer maxAmount;
}
更新路由
微服务保护和分布式管理
雪崩问题
sentinel是什么?
Sentinel 是阿里巴巴开源的一款用于分布式系统的流量控制和熔断降级的中间件。它主要用于保护微服务的稳定性,帮助应对高并发场景下的流量突增或服务调用异常。
Sentinel 提供了灵活的流量控制规则和强大的监控能力,是 Spring Cloud Alibaba 技术栈中的核心组件之一,用于服务治理和高可用保障。
如何使用sentinel?
1. 引入依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId><version>2021.0.3.0</version>
</dependency>
2. 连接sentinel-dashboard
控制台,需要配置控制台,修改application.yaml文件,添加下面内容:
spring:cloud: sentinel:transport:dashboard: localhost:8090
3. 由于我们的SpringMVC接口是按照Restful风格设计,因此购物车的查询、删除、修改等接口全部都是/carts
路径,所以我们需要在application.yaml里面添加 http-method-specify: true # 开启请求方式前缀
spring:cloud:sentinel:transport:dashboard: 127.0.0.1:8090http-method-specify: true # 开启请求方式前缀
详细请点击黑马教程:day05-服务保护和分布式事务 - 飞书云文档 (feishu.cn)
接下来详细介绍一下熔断的解决办法
熔断的具体实现步骤
步骤 1:配置 Sentinel 的熔断规则
在 Sentinel 可视化控制台 中配置熔断规则,基于:
- 异常比例(当调用失败率超过设定值时触发)。
- 异常数(当调用失败总数超过设定值时触发)。
- 响应时间(当接口响应时间超过设定值时触发)。
示例:
- 熔断条件:某接口失败率 >50% 且调用量 >10,在 1 分钟内触发熔断。
- 熔断恢复:在熔断 5 秒后恢复尝试。
步骤 2:编写 FallbackFactory
当服务触发熔断时,FallbackFactory
提供降级逻辑。正常会去调用ItemClient接口,但是当ItemClinet接口对应的Controller的处理出现异常或者请求被限流了,就会走这个fallback”备选方案“,它也会创建一个ItemClient,去返回一些提示信息。以 ItemClientFactoryFallback
为例:
主要逻辑
- 实现
FallbackFactory
接口。 - 在
create
方法中捕获异常信息Throwable
。 - 定义服务降级逻辑:
- 非关键业务返回默认值(如返回空集合)。
- 关键业务抛出业务异常,触发事务回滚,确保数据一致性。
代码解读
package com.hmall.api.fallback;import com.hmall.api.client.ItemClient;
import com.hmall.api.dto.ItemDTO;
import com.hmall.api.dto.OrderDetailDTO;
import com.hmall.common.exception.BizIllegalException;
import com.hmall.common.utils.CollUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;import java.util.Collection;
import java.util.List;@Slf4j
public class ItemClientFactoryFallback implements FallbackFactory<ItemClient> {@Overridepublic ItemClient create(Throwable cause) {return new ItemClient() {@Overridepublic List<ItemDTO> queryItemByIds(Collection<Long> ids) {log.error("远程调用ItemClient#queryItemByIds方法出现异常,参数:{}", ids, cause);// 查询购物车允许失败,查询失败,返回空集合return CollUtils.emptyList();}@Overridepublic void deductStock(List<OrderDetailDTO> items) {// 库存扣减业务需要触发事务回滚,查询失败,抛出异常throw new BizIllegalException(cause);}};}
}
步骤 3:在配置类中注册为 Bean
原因
- 默认情况下,Spring Boot 不会扫描非显式标注为
@Component
的类。 - 需要显式将
FallbackFactory
注册为 Bean,才能生效。
代码解读
在 DefaultFeignConfig
配置类中:
-
注册
ItemClientFactoryFallback
:
package com.hmall.api.config;import com.hmall.api.fallback.ItemClientFactoryFallback;
import com.hmall.common.utils.UserContext;
import feign.Logger;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Bean;
public class DefaultFeignConfig
{@Beanpublic Logger.Level feignLoggerLevel(){return Logger.Level.FULL;}@Beanpublic RequestInterceptor userInfoRequestInterceptor(){return new RequestInterceptor() {@Overridepublic void apply(RequestTemplate requestTemplate) {// 获取用户IdLong user = UserContext.getUser();if(user == null) {// 如果为空则直接跳过return;}// 存入请求头当中requestTemplate.header("user-info",user.toString());}};}// 注册为Bean@Beanpublic ItemClientFactoryFallback itemClientFallbackFactory(){return new ItemClientFactoryFallback();}}
步骤 4:在服务接口中绑定降级逻辑
使用 @FeignClient
注解绑定服务,并指定:
value
:目标微服务名称。fallbackFactory
:对应的FallbackFactory
类。configuration
:自定义的 Feign 配置类。
代码解读
@FeignClient(value = "item-service",fallbackFactory = ItemClientFactoryFallback.class,configuration = DefaultFeignConfig.class
)
public interface ItemClient {@GetMapping("/items")List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);@PostMapping("/stock/deduct")void deductStock(@RequestBody List<OrderDetailDTO> items);
}
如何解决雪崩问题
-
快速失败:
- 熔断器在触发后立即返回降级结果,避免资源被耗尽。
-
默认降级逻辑:
- 通过
FallbackFactory
提供兜底逻辑,为非关键业务返回默认值,降低错误扩散的影响。
- 通过
-
保护核心业务:
- 关键业务如库存扣减,触发异常并回滚,确保数据一致性。
-
监控与恢复:
- Sentinel 自动监控系统恢复状态,当异常比例降低时自动关闭熔断器,恢复正常调用。
分布式事务(多个服务或数据库之间数据一致性的问题)
day05-服务保护和分布式事务 - 飞书云文档 (feishu.cn)
什么事seata?
Seata(Simple Extensible Autonomous Transaction Architecture)是阿里巴巴开源的一款分布式事务解决方案。它为分布式系统中的事务一致性问题提供了简单、高效的解决方案,支持多种事务模型,帮助开发者轻松实现分布式事务。
在微服务架构中,各服务通常独立部署,拥有独立的数据库。这种设计虽然带来了高可用性和扩展性,但也引入了分布式事务问题(如跨服务的数据一致性)。Seata 专注于保证事务的一致性。
XA模式
首先我们可以在Nacos中的共享shared-seata.yaml配置文件中设置:
seata: data-source-proxy-mode: XA
然后我们要利用@GlobalTransactional
标记分布式事务的入口方法即可
AT模式
RabbitMQ
详细查看请查看RabbitMQ高级篇-CSDN博客
相关文章:

springCloud特色知识记录(基于黑马教程2024年)
目录 Nacos 简介 Nacos 的特点 Nacos 的使用步骤可以查看黑马教程文档:day03-微…...

Linux---shell脚本练习
要求: 1、shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容,不存在则创建一个文件将创建时间写入。 2、写一个 shel1 脚本,实现批量添加 20个用户,用户名为user01-20,密码为user 后面跟5个随机字符。 3、编写个shel 脚本将/usr/local 日录下…...

ClickHouse-CPU、内存参数设置
常见配置 1. CPU资源 1、clickhouse服务端的配置在config.xml文件中 config.xml文件是服务端的配置,在config.xml文件中指向users.xml文件,相关的配置信息实际是在users.xml文件中的。大部分的配置信息在users.xml文件中,如果在users.xml文…...

浅谈云计算02 | 云计算模式的演进
云计算计算模式的演进 一、云计算计算模式的起源追溯1.2 个人计算机与桌面计算 二、云计算计算模式的发展阶段2.1 效用计算的出现2.2 客户机/服务器模式2.3 集群计算2.4 服务计算2.5 分布式计算2.6 网格计算 三、云计算计算模式的成熟与多元化3.1 主流云计算服务模式的确立3.1.…...
设置模块一级菜单添加遥控器功能
文章目录 问题点问题分析资源和源码分析解决方案源码分析找到对应的Activitymenifest 分析SettingsHomepageActivity 分析 问题点 MTK Android12/13 系统设置一级界面,蓝牙遥控器无法上下滑动页面。 备注:自己对设置整个模块系统其实并不熟悉ÿ…...
Blazor中Syncfusion Word组件使用方法
Blazor中Syncfusion Word组件用于在Blazor应用程序中创建、编辑、查看和打印 Word(DOC、DOCX 和 RTF)文档。 主要功能: 从头开始创建文档。打开和编辑 Word(DOC、DOCX)、RTF 和 SFDT(Syncfusion 文档文本…...

HTB:Driver[WriteUP]
目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用smbclient尝…...

微信小程序-Docker+Nginx环境配置业务域名验证文件
在实际开发或运维工作中,我们时常需要在 Nginx 部署的服务器上提供一个特定的静态文件,用于域名验证或第三方平台验证。若此时使用 Docker 容器部署了 Nginx,就需要将该验证文件正确地映射(挂载)到容器中,并…...
55_OpenResty开发入门
Nginx编程需要用到Lua语言,因此我们必须先学习Lua的基本语法。Nginx本身也是C语言开发,因此也允许基于Lua做拓展。多级缓存的实现离不开Nginx编程,而Nginx编程又离不开OpenResty。 1.OpenResty概述 OpenResty是一款基于NGINX和LuaJIT的Web平台。通过Lua扩展NGINX实现的可伸…...

Windows安装Jenkins——及修改主目录、配置简体中文、修改插件源
一、简介 Jenkinshttps://www.jenkins.io/zh/ Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。 二、Windows安装配置Jenkins2.479 2.1、J...

大数据环境搭建进度
1.使用虚拟机的系统:centos7.xLinux 2.资源不足,使用云服务器: 1. 3.使用远程登录进行操作 用xshell 4.任务 1.虚拟机装好 2.设置IP地址 3.可以联网 4.设置远程登录访问 5.创建module和software目录,修改两…...
第27章 汇编语言--- 设备驱动开发基础
汇编语言是低级编程语言的一种,它与特定的计算机架构紧密相关。在设备驱动开发中,汇编语言有时用于编写性能关键的部分或直接操作硬件,因为它是接近机器语言的代码,可以提供对硬件寄存器和指令集的直接访问。 要展开源代码详细叙…...

Apache Hop从入门到精通 第二课 Apache Hop 核心概念/术语
1、apache hop核心概念思维导图 虽然apache hop是kettle的一个分支,但是它的概念和kettle还是有一些区别的,下图是我根据官方文档梳理的appache hop的核心概念思维导图。 2、Tools(工具) 1)Hop Conf Hop Conf 是一个…...

Vue2+OpenLayers使用Overlay实现点击获取当前经纬度信息(提供Gitee源码)
目录 一、案例截图 二、安装OpenLayers库 三、代码实现 关键参数: 实现思路: 核心代码: 完整代码: 四、Gitee源码 一、案例截图 二、安装OpenLayers库 npm install ol 三、代码实现 覆盖物(Overlay…...

英语互助小程序springboot+论文源码调试讲解
第2章 开发环境与技术 英语互助小程序的编码实现需要搭建一定的环境和使用相应的技术,接下来的内容就是对英语互助小程序用到的技术和工具进行介绍。 2.1 MYSQL数据库 本课题所开发的应用程序在数据操作方面是不可预知的,是经常变动的,没有…...
中等难度——python实现电子宠物和截图工具
import io # 文件处理 import nt # windows nt 库直接获取对应的磁盘空间 import time # 时间 import zlib # 加解密 import ctypes # 调用 import struct # 处理字节二进制 import base64 # 编解码 import threading # 线程 import tkinter as tk # tk from datetime…...

深入Android架构(从线程到AIDL)_22 IPC的Proxy-Stub设计模式04
目录 5、 谁来写Proxy及Stub类呢? 如何考虑人的分工 IA接口知识取得的难题 在编程上,有什么技术可以实现这个方法? 范例 5、 谁来写Proxy及Stub类呢? -- 强龙提供AIDL工具,给地头蛇产出Proxy和Stub类 如何考虑人的分工 由框架开发者…...

【MySQL数据库】基础总结
目录 前言 一、概述 二、 SQL 1. SQL通用语法 2. SQL分类 3. DDL 3.1 数据库操作 3.2 表操作 4. DML 5. DQL 5.1 基础查询 5.2 条件查询 5.3 聚合函数 5.4 分组查询 5.5 排序查询 5.6 分页查询 6. DCL 6.1 管理用户 6.2 权限控制 三、数据类型 1. 数值类…...
49_Lua调试
Lua提供了debug库用于创建自定义调试器,尽管Lua本身没有内置的调试器1。这个库允许开发者在程序运行时检查和控制执行流程,这对于开发过程中的错误查找和修复非常有用。 1.Debug库概述 debug库提供的函数可以分为两类:自省函数(introspection functions)和钩子函数(hoo…...
vue的KeepAlive应用(针对全部页面及单一页面进行缓存)
KeepAlive的作用是缓存包裹在其中的动态切换组件 当一个组件在 中被切换时,它的 activated 和 deactivated 生命周期钩子将被调用,用来替代 mounted 和 unmounted。这适用于 的直接子节点及其所有子孙节点。 缓存全部页面 将app.vue中的路由出口改为&am…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...

wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...