最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录
- 前言
- 一、服务规划
- 二、架构核心
- 1.cloud的pom
- 2.gateway的异常handler
- 3.gateway的filter
- 4、admin的pom
- 5、admin的登录核心
- 三、code-helper分享
- 总结
前言
最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要是确实时间紧,倒排的,其实个人一直不认可倒排估工时法,但是现在发现不管是大公司、小故事都喜欢这样搞。无语!工时不应该是一个纯粹的根据经验 + 个人能力做了可行性的一个耗时预估值吗?怎么就爱打骨折哦,不应该考虑堆人么?
跑远了,今天主要是简单分享最新版本springBoot3.5.0 + SpringCloud2025.0.0 + nacos2.5.1的架构规划与搭建分享。
一、服务规划
这里也只是简单规划下,不是按照最小粒度规划的,应该说就是简单按照业务线 + 基础组件的思路规划的。毕竟是个小公司,任务时间紧急,又没有专业运维,所以就简单规划下,后期服务器都不知道能不能配置全。
- commom:通用jar包,这里将一些常用的集成、工具类、异常处理、子服务拦截器放这里
- gateway:网关就不解释了,这里唯一要说的就是它是一个使用webflux响应式 Web 框架,完全非阻塞,支持响应式流背压。就是因为无关用这个,子服务用mvc,所以网关里的gateway接入redis是单独的,整个就不引入common,因为common里的统一异常处理是基于web的,与webflux不兼容,引入会报错。
- device:业务线的子服务,涉密,就不多说了
- admin:业务线的子服务,主要是后端管理的接口
- third:业务线的子服务,用于处理第三方服务
- exchange:业务线的子服务,涉密
- code-helper:代码生成助手,我这里是mybatisplus基于自定义的模版生成基础代码,为了后面CRUD快,花不少时间集成、写自定义模版。
其实,按道理应该还细化下common,分util、exception、mysqlplus、redis等等,但是看看兄弟们,就这么点人力,有这个基础微服务就行了。
二、架构核心
1.cloud的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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.rs.gov</groupId><artifactId>gov-cloud</artifactId><version>0.0.1-SNAPSHOT</version><packaging>pom</packaging><name>gov-cloud</name><description>gov-cloud</description><modules><module>gov-common</module><module>gov-gateway</module><module>gov-device</module><module>gov-admin</module><module>gov-third</module><module>gov-exchange</module><module>gov-code-helper</module></modules><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.5.0</version></parent><properties><java.version>17</java.version><maven.compiler.source>${java.version}</maven.compiler.source><maven.compiler.target>${java.version}</maven.compiler.target><spring-boot.version>3.5.0</spring-boot.version><spring-cloud.version>2025.0.0</spring-cloud.version><spring-cloud-alibaba.version>2023.0.1.2</spring-cloud-alibaba.version><gov.common.version>0.0.1</gov.common.version><mybatisPlus.version>3.5.7</mybatisPlus.version><hutool.version>5.8.32</hutool.version><redisson.version>3.36.0</redisson.version><commons-io.version>2.19.0</commons-io.version><netty.macSupport.version>4.1.121.Final</netty.macSupport.version><skipTests>true</skipTests></properties><dependencyManagement><dependencies><!-- Spring Boot --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!-- Spring Cloud --><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 Alibaba --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><pluginManagement><plugins><!-- Maven Compiler --><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.14.0</version><configuration><source>${java.version}</source><target>${java.version}</target></configuration></plugin><!-- Spring Boot Plugin --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version></plugin></plugins></pluginManagement></build></project>
2.gateway的异常handler
import com.fasterxml.jackson.databind.ObjectMapper;
import com.rs.gov.govgateway.entity.RestResponse;
import lombok.SneakyThrows;
import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;/*** @author zwmac*/
@Component
public class GatewayExceptionHandler implements ErrorWebExceptionHandler {private final ObjectMapper objectMapper = new ObjectMapper();@SneakyThrows@Overridepublic Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {ServerHttpResponse response = exchange.getResponse();response.setStatusCode(HttpStatus.OK);response.getHeaders().setContentType(MediaType.APPLICATION_JSON);RestResponse<?> restResponse = RestResponse.build(500, ex.getMessage());DataBuffer buffer = response.bufferFactory().wrap(objectMapper.writeValueAsBytes(restResponse));return response.writeWith(Mono.just(buffer));}
}
3.gateway的filter
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.nacos.common.utils.CollectionUtils;
import com.rs.gov.govgateway.constant.CommonConstant;
import com.rs.gov.govgateway.constant.HeaderConstant;
import com.rs.gov.govgateway.entity.RestResponse;
import com.rs.gov.govgateway.entity.Tenant;
import com.rs.gov.govgateway.entity.UserAccount;
import com.rs.gov.govgateway.entity.UserInfo;
import com.rs.gov.govgateway.props.WhiteListProp;
import com.rs.gov.govgateway.service.redis.RedisService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpCookie;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;/*** 网关拦截** @author zwmac*/
@Component
@Slf4j
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class GatewayFilter implements GlobalFilter, Ordered {@Value("${server.servlet.context-path:/gov-gateway}")private String contextPath;private final RedisService redisService;private final WhiteListProp whiteListProp;@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();ServerHttpResponse response = exchange.getResponse();String url = request.getURI().getPath();log.info("接收到请求:{}", url);// 跨域放行if (request.getMethod() == HttpMethod.OPTIONS) {response.setStatusCode(HttpStatus.OK);return Mono.empty();}// 授权ServerHttpRequest mutatedRequest = this.auth(exchange);if (mutatedRequest == null) {return this.responseBody(exchange, 401, "请先登录");}// 用新的 request 构造新的 exchange 再放行ServerWebExchange mutatedExchange = exchange.mutate().request(mutatedRequest).build();return chain.filter(mutatedExchange);}/*** 认证*/private ServerHttpRequest auth(ServerWebExchange exchange) {ServerHttpRequest request = exchange.getRequest();AntPathMatcher antPathMatcher = new AntPathMatcher();String path = request.getURI().getPath();if (whiteListProp.getEnable() && CollectionUtils.isNotEmpty(whiteListProp.getUrls())) {boolean whiteMatch = whiteListProp.getUrls().stream().anyMatch(url -> antPathMatcher.match(url.replace(contextPath, ""), path.replace(contextPath, "")));if (whiteMatch) {return request;}}String token = this.getToken(request);if (StringUtils.isEmpty(token)) {return null;}Object userObj = redisService.get(CommonConstant.PREFIX_USER_TOKEN + token);if (userObj == null) {return null;}UserInfo userInfo = JSONUtil.toBean(userObj.toString(), UserInfo.class);UserAccount accountInfo = userInfo.getAccountInfo();Tenant currentTenant = userInfo.getCurrentTenant();if (currentTenant != null && currentTenant.getId() != null) {accountInfo.setCurrentTenantId(currentTenant.getId());}return request.mutate().header(HeaderConstant.USERID, accountInfo.getUserId()).header(HeaderConstant.USERNAME, URLEncoder.encode(accountInfo.getSysUserName(), StandardCharsets.UTF_8)).header(HeaderConstant.USER_ACCOUNT, URLEncoder.encode(accountInfo.getLoginName(), StandardCharsets.UTF_8)).header(HeaderConstant.TENANT_ID, accountInfo.getCurrentTenantId()).build();}/*** 获取token*/public String getToken(ServerHttpRequest request) {HttpCookie tokenCookie = request.getCookies().getFirst(CommonConstant.X_ACCESS_TOKEN);if (tokenCookie == null) {String token = request.getHeaders().getFirst(CommonConstant.X_ACCESS_TOKEN);if (StrUtil.isNotEmpty(token)) {return token;}return request.getQueryParams().getFirst("token");}return tokenCookie.getValue();}/*** 设置响应体**/public Mono<Void> responseBody(ServerWebExchange exchange, Integer code, String msg) {String message = JSONUtil.parse(RestResponse.build(code, msg)).toString();byte[] bytes = message.getBytes(StandardCharsets.UTF_8);return this.responseHeader(exchange).getResponse().writeWith(Flux.just(exchange.getResponse().bufferFactory().wrap(bytes)));}/*** 设置响应体的请求头*/public ServerWebExchange responseHeader(ServerWebExchange exchange) {ServerHttpResponse response = exchange.getResponse();response.getHeaders().add(HttpHeaders.CONTENT_TYPE, "application/json");return exchange.mutate().response(response).build();}@Overridepublic int getOrder() {return -100;}}
4、admin的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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.rs.gov</groupId><artifactId>gov-cloud</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>gov-admin</artifactId><name>gov-admin</name><description>gov-admin</description><dependencies><!-- 通用jar --><dependency><groupId>com.rs.gov</groupId><artifactId>gov-common</artifactId><version>${gov.common.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- Spring Boot Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 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-config</artifactId></dependency><!-- Feign 依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!-- Spring Boot Actuator(可选) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><annotationProcessorPaths><path><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></path></annotationProcessorPaths></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>
5、admin的登录核心
//生存token,直接用户名+token的secret生成String token = DigestUtil.md5Hex(userName + tokenSecret).toLowerCase();UserInfo userInfo = new UserInfo();UserAccount userAccount = new UserAccount();BeanUtil.copyProperties(sysUser, userAccount);userAccount.setLoginName(userName);userInfo.setAccountInfo(userAccount);userInfo.setToken(token);String userInfoJsonStr = JSONUtil.toJsonStr(userInfo);redisService.save(CommonConstant.PREFIX_USER_TOKEN + token, userInfoJsonStr, tokenExpire);return RestResponse.success(userInfoJsonStr);
登录前面的校验密码、查库就不说了,这里的核心是要在redis缓存,返回token给前端,前端所有接口请求都在在请求头里放token。
三、code-helper分享
这个是代码生成的,基于最新的mybatis-plus-generator3.5.12,这个倒是可以完全分享,是不是应该单写一篇?请允许我这么坏,有需要的请移步到下一篇。
总结
好了,就写到这里,希望能帮到大家。现在虽然部门人少,但是团队的技术氛围不错,人少归人少,但是我们语种可全乎了,有.net、C++、QT、WPF、前端、java后端。公司个人都可承接软、硬、软硬组合项目哦,我们就是这么自信,请允许我小小的骄傲,因为我有一个好平台的依靠!
行业前景也挺好,如果现在从事的能打开市场,按照老板的愿景,3年后我们就年产过亿,可以上市了。加油!!!!
相关文章:

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

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

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...