2025前端微服务 - 无界 的实战应用
遇饮酒时须饮酒,得高歌处且高歌
文章目录
- 什么是前端微服务
- 主流框架概述
- 无界 - 腾讯
- 乾坤 - 阿里
- Micro-app
- Vue3项目引用
- ⑴. 项目依赖安装
- ⑵. main.ts 文件配置
- ⑶. 路由配置
- ⑷. 页面设置
- 隐藏子应用菜单及顶部信息栏
- 子应用样式冲突问题
- 虚拟路由
- ⑴. 路由
- ⑵. 页面
- 跨域问题解决方案
- 开发环境
- 主应用
- 子应用
- 生产环境
- 主应用:
- 子应用:
- Nginx转发(未实现)
- 主应用
- 页面
什么是前端微服务
一个主应用(基座),内部嵌套了多个子应用
前端微服务是一种创新的技术手段与方法策略,其核心在于通过多个团队独立发布功能,共同构建现代化 Web 应用。通俗来说,就是一个 Web 应用中独立运行另一个 Web 应用的效果,极大地提升了应用开发的灵活性与可维护性。
主流框架概述
无界 - 腾讯
腾讯在维护的,后起之秀,非常轻量,4k star,无痛接入 vite。
官网: https://wujie-micro.github.io/doc/
- 优势:
- 低成本: 主应用和子应用的适配成本都极低。
- 高速度: 支持静态资源预加载和子应用预执行,提升首屏打开速度和运行速度。
- 原生隔离: 通过Web Components + Shadow DOM实现css原生隔离,通过iframe实现js原生隔离。
- 强大功能: 支持子应用保活、多应用激活、去中心化通信、vite框架支持、应用共享等。
- 劣势:
- 相对较新: 相较于 Qiankun.js 和 MicroApp,Wujie 较为新颖,社区和生态系统尚在发展中。
- 文档和支持: 由于其新颖性,文档和支持可能不如 Qiankun.js 完善。
乾坤 - 阿里
该框架是蚂蚁在维护的,15.7k star,目前官方使用的是 webpack 作为构建工具,没有明确表示支持 vite,社区有 vite-plugin-qiankun 插件支持。
官网: https://qiankun.umijs.org/zh/
- 优势:
- 成熟度高: Qiankun.js 基于 Single-SPA,并针对中国开发者进行了优化和本地化,已经得到了广泛的应用和验证。
- 生态系统完善: 提供了丰富的插件和工具链,支持快速集成和上手。
- 灵活性强: 可以自由选择是否使用沙箱隔离、应用加载策略等,满足不同场景需求。
- 社区活跃: 有较多的社区资源和支持,问题解决较快。
- 劣势:
- 复杂度高: 由于其功能强大,配置和使用相对复杂,对开发者的技术要求较高。
- 性能开销: 在某些场景下,沙箱隔离机制会带来一定的性能开销。
- 侵入性: 对子应用改造成本较大,从 webpack、代码、路由等等都要做一系列的适配。
Micro-app
由京东开发,star 5.5k, 是一个基于WebComponents的前端微服务框架,支持多种前端框架。
官网: https://jd-opensource.github.io/micro-app/
- 优势:
- 轻量级: MicroApp 体积小,性能较好,适合对性能要求较高的项目。
- 简单易用: 上手简单,API 设计清晰,开发成本低。
- 灵活性强: 提供灵活的加载和卸载机制,支持动态应用加载。
- 劣势:
- 功能较少: 功能相对较少,不支持某些高级特性。
- 兼容性差: 对于不支持WebComponents的浏览器没有做降级处理。
Vue3项目引用
⑴. 项目依赖安装
# 安装依赖
npm i wujie-vue3 -S
⑵. main.ts 文件配置
修改 main.ts
文件:
// 引入wujie
import WujieVue from 'wujie-vue3'...app.use(WujieVue)
...
⑶. 路由配置
修改 router.ts
文件:
# 略
⑷. 页面设置
修改 index.vue
文件,嵌入子应用:
<template><WujieVuewidth="100%"height="100%"name="subApp":url="subAppUrl":props="{ proxy: true }":preload="true"/>
</template>
<script lang="tsx" setup>
import WujieVue from 'wujie-vue3'const subAppUrl= ref('http://localhost:3001')
</script>
隐藏子应用菜单及顶部信息栏
在代码中添加如下判断逻辑,可隐藏主应用不需要的子应用模块
if ((window as any).__POWERED_BY_WUJIE__) {// 处理子应用 - 可以隐藏主应用不需要的模块...}
子应用样式冲突问题
通过组合使用 Shadow DOM 隔离、CSS 作用域重写和命名约束,可系统性规避样式冲突
<template><WujieVuewidth="100%"height="100%"name="biShengApp":url="biShengUrl":props="{ proxy: true, sandbox: { strictStyleIsolation: true, // 启用严格样式隔离scopedCSS: true, // 启用CSS作用域experimentalStyleIsolation: true, // 实验性样式隔离shadowDOM: false, // 是否使用Shadow DOM隔离(可能有兼容性问题)} }":preload="true"/>
</template>
- strictStyleIsolation: 确保基本的样式隔离机制仍然有效。
- scopedCSS : 将子应用的样式限制在其容器内,防止样式泄漏到主应用或影响其他子应用。
- experimentalStyleIsolation: 实验性的样式隔离功能,提供额外的样式隔离保障。
- shadowDOM: 一种更强大的隔离方式,但可能会有兼容性问题,默认关闭。如果其他隔离方式不起作用,可以尝试将其设为 true。
虚拟路由
⑴. 路由
修改 router.ts
文件:
# 略
⑵. 页面
添加路由监听逻辑,根据路由变化动态设置子应用地址
<template><WujieVuewidth="100%"height="100%"name="subApp":url="subAppUrl":props="{ proxy: true }":preload="true"/>
</template>
<script lang="tsx" setup>
import WujieVue from 'wujie-vue3'const route = useRoute()
const subAppUrl= ref('http://localhost:3001')onBeforeMount(() => {// 监听路由变化if (route.path == '/subApp(router配置的url前缀)/') {subAppUrl.value = `http://localhost:3001`} else {// 将router中配置的路由拼接成子应用的路由地址subAppUrl.value = `http://localhost:3001/${route.path.replace('/subApp(router配置的url前缀)/', '')}`}
})
</script>
跨域问题解决方案
开发环境
主应用
修改 vite.config.ts
文件:
...return {base: env.VITE_BASE_PATH,root: root,// 服务端渲染server: {port: env.VITE_PORT, // 端口号host: "0.0.0.0",open: env.VITE_OPEN === 'true',// 本地跨域代理. 目前注释的原因:暂时没有用途,server 端已经支持跨域// proxy: {// ['/admin-api']: {// target: env.VITE_BASE_URL,// ws: false,// changeOrigin: true,// rewrite: (path) => path.replace(new RegExp(`^/admin-api`), ''),// },// },},
子应用
- 服务端:
- 接口跨域:接受跨域请求
- 接口凭证:‘true’改为‘false’
生产环境
主应用:
编辑 nginx.conf
文件:
worker_processes 1;events {worker_connections 1024;
}http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {listen 9527;server_name localhost;location / {root html;index index.html index.htm;}# 主应用接口转发location ^~/admin-api/ {proxy_pass http://localhost:48080/;client_max_body_size 2000m;proxy_send_timeout 1800s;send_timeout 1800s;# 增强headers配置proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_set_header X-Forwarded-Host $host;proxy_set_header X-Forwarded-Port $server_port;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";# 优化cookie处理proxy_cookie_domain localhost:48080 $host;proxy_cookie_path / "/; secure; HttpOnly"; # 确保安全属性# 禁用缓存,确保每次请求都到达后端proxy_no_cache $cookie_session $http_pragma $http_authorization;proxy_cache_bypass $cookie_session $http_pragma $http_authorization;# 增强跨域配置add_header Access-Control-Allow-Origin $http_origin always;add_header Access-Control-Allow-Credentials "true" always;add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS, PUT, DELETE' always;add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,Set-Cookie' always;add_header Access-Control-Expose-Headers 'Set-Cookie' always;# OPTIONS请求处理if ($request_method = 'OPTIONS') {return 204;}# 日志配置access_log /var/log/nginx/admin-api.access.log;error_log /var/log/nginx/admin-api.error.log debug;# 增加请求体缓冲,防止大请求被截断proxy_request_buffering on;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}
}
子应用:
配置静态资源缓存、反向代理、跨域等相关内容
编辑 nginx.conf
文件:
# 在http区域内一定要添加下面配置, 支持websocket
map $http_upgrade $connection_upgrade {default upgrade;'' close;
}server {listen 3001;server_name localhost;#root /usr/share/nginx/html/platform;# docker host html files,使用外部文件,开发调试时用root /usr/share/nginx/hosthtml/platform;gzip on;gzip_comp_level 2;gzip_min_length 1000;gzip_types text/xml text/css;gzip_http_version 1.1;gzip_vary on;gzip_disable "MSIE [4-6] \.";# 静态资源缓存配置,同时包含CORS头location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {expires 1y;add_header Cache-Control "public";add_header Access-Control-Allow-Origin "*" always;add_header Content-Security-Policy "frame-ancestors *";}# 根路径,包含CORS头location / {try_files $uri $uri/ /index.html =404;add_header Access-Control-Allow-Origin "*" always;add_header Content-Security-Policy "frame-ancestors *";}# 后端服务反向代理,不需要包含CORS头,因为后端服务中已经开启跨域location /api {if ($request_method = 'OPTIONS') {add_header Access-Control-Allow-Origin "$http_origin" always;add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE" always;add_header Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization" always;add_header Access-Control-Allow-Credentials "true" always;add_header Access-Control-Max-Age 1728000 always;add_header Vary "Origin" always;add_header Content-Length 0 always;add_header Content-Type "text/plain; charset=utf-8" always;return 204; # 返回 204 No Content} proxy_pass http://backend:7860;proxy_read_timeout 300s;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $connection_upgrade;client_max_body_size 50m;# 添加必要的CORS头add_header Access-Control-Allow-Origin "$http_origin" always;add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE" always;add_header Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization" always;add_header Vary "Origin" always;add_header Content-Security-Policy "frame-ancestors *";}location /workspace/ {alias /usr/share/nginx/html/client/;index index.html index.htm;try_files $uri $uri/ /workspace/index.html;add_header Access-Control-Allow-Origin "*" always;add_header Content-Security-Policy "frame-ancestors *";}location /workspace/api {rewrite ^/workspace(/.*)$ $1 break;if ($request_method = 'OPTIONS') {add_header Access-Control-Allow-Origin "$http_origin" always;add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE" always;add_header Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization" always;add_header Access-Control-Allow-Credentials "true" always;add_header Access-Control-Max-Age 1728000 always;add_header Vary "Origin" always;add_header Content-Length 0 always;add_header Content-Type "text/plain; charset=utf-8" always;return 204; # 返回 204 No Content} proxy_pass http://backend:7860;proxy_read_timeout 300s;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $connection_upgrade;client_max_body_size 50m;# 添加必要的CORS头add_header Access-Control-Allow-Origin "$http_origin" always;add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE" always;add_header Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization" always;add_header Vary "Origin" always;add_header Content-Security-Policy "frame-ancestors *";}location ~ ^/(workspace/subApp|subApp|tmp-dir)/ {rewrite ^/workspace(/.*)$ $1 break;proxy_pass http://minio:9000;add_header Access-Control-Allow-Origin "*" always;add_header Content-Security-Policy "frame-ancestors *";}
}
Nginx转发(未实现)
实现思路:通过主应用配置子应用的url地址(例:/subAppUrl),Nginx监测到该地址时,将静态资源及api进行转发到真实地址(例:http://xxx.xxx.com)。
主应用
修改 nginx.conf
文件:
worker_processes 1;events {worker_connections 1024;
}http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;# 性能优化gzip on;gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;gzip_vary on;gzip_proxied any;gzip_comp_level 6;gzip_buffers 16 8k;gzip_http_version 1.1;server {listen 9527;server_name localhost;# 全局 CORS 配置add_header Access-Control-Allow-Origin * always;add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS' always;add_header Access-Control-Allow-Headers 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;add_header Access-Control-Max-Age 1728000 always;# 处理预检请求location ~* ^/ {if ($request_method = 'OPTIONS') {add_header 'Content-Type' 'text/plain; charset=utf-8';add_header 'Content-Length' 0;return 204;}}location / {root html;index index.html index.htm;try_files $uri $uri/ /index.html;}location ^~ /admin-api {client_max_body_size 100M;client_body_buffer_size 100M;# 修正代理路径proxy_pass http://localhost:48080/admin-api;# 完整的代理头设置proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_set_header X-Forwarded-Host $host;proxy_set_header X-Forwarded-Port $server_port;# 关键:传递所有客户端请求头proxy_set_header Accept-Encoding "";proxy_set_header Origin "";proxy_pass_header Set-Cookie;# 禁用缓存proxy_buffering off;# 超时设置proxy_connect_timeout 60s;proxy_send_timeout 60s;proxy_read_timeout 150s;# WebSocket支持proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";# 调试日志access_log logs/admin-api.access.log;error_log logs/admin-api.error.log debug;}# 微前端子应用代理配置location ^~ /subAppUrl {# 禁用缓存,确保实时获取内容proxy_buffering off;add_header X-Proxy-Location "sub-app";# 重要的代理头设置proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-Host $host;proxy_set_header X-Forwarded-Port $server_port;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;# WebSocket支持(如果微前端需要)proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";# 超时设置proxy_connect_timeout 60s;proxy_send_timeout 60s;proxy_read_timeout 60s;# 调试日志access_log logs/sub-app.access.log;error_log logs/sub-app.error.log debug;# 转发请求到微前端应用服务器rewrite ^/subAppUrl(.*) $1 break;proxy_pass http://你的真实地址:端口号;}# 静态资源缓存配置location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {expires 7d;add_header Cache-Control "public";}}
}
页面
修改 index.vue
文件:
<template><WujieVuewidth="100%"height="100%"name="subApp":url="subAppUrl":props="{ proxy: true }":preload="true"/>
</template>
<script lang="tsx" setup>
import WujieVue from 'wujie-vue3'const route = useRoute()// Nginx 配置(location^~ /subAppUrl)一致
const subAppUrl= ref()watch(() => route.fullPath,(newPath) => {subAppUrl.value = newPath// url地址为: /subapp/、/sbuapp/system、/subapp/log...},{ immediate: true })</script>
相关文章:

2025前端微服务 - 无界 的实战应用
遇饮酒时须饮酒,得高歌处且高歌 文章目录 什么是前端微服务主流框架概述无界 - 腾讯乾坤 - 阿里Micro-app Vue3项目引用⑴. 项目依赖安装⑵. main.ts 文件配置⑶. 路由配置⑷. 页面设置 隐藏子应用菜单及顶部信息栏子应用样式冲突问题虚拟路由⑴. 路由⑵. 页面 跨域…...
Spring Boot 缓存注解详解:@Cacheable、@CachePut、@CacheEvict(超详细实战版)
💡 前言 在高并发、高性能的系统开发中,缓存是提升接口响应速度和降低数据库压力的重要手段。Spring Boot 提供了强大的缓存抽象层 —— spring-context-support,并结合 JSR-107 标准,提供了多个缓存注解,如ÿ…...

【设计模式-4.8】行为型——中介者模式
说明:本文介绍行为型设计模式之一的中介者模式 定义 中介者模式(Mediator Pattern)又叫作调节者模式或调停者模式。用一个中介对象封装一系列对象交互,中介者使各对象不需要显式地互相作用,从而使其耦合松散…...
SpringCloud-基于SpringAMQP实现消息队列
在微服务架构中,使用消息队列进行异步通信是一种常见而有效的方法。Spring Cloud提供了一个强大的工具集,用于构建分布式系统,而Spring AMQP是其支持高级消息队列协议(AMQP)的组件,广泛应用于消息队列的场景中,尤其是与…...
ObjectMapper 在 Spring 统一响应处理中的作用详解
ObjectMapper 是 Jackson 库的核心类,专门用于处理 JSON 数据的序列化(Java 对象 → JSON)和反序列化(JSON → Java 对象)。在你提供的代码中,它解决了字符串响应特殊处理的关键问题。 一、为什么需要 Obj…...
H5移动端性能优化策略(渲染优化+弱网优化+WebView优化)
一、渲染优化:首屏速度提升的核心 1. 关键页面采用SSR或Native渲染 适用场景:首页、列表页、详情页等强内容展示页面 优化原理: SSR(服务端渲染):在服务端生成完整…...
【汇编逆向系列】二、函数调用包含单个参数之整型-ECX寄存器,LEA指令
目录 一. 汇编源码 二. 汇编分析 1. ECX寄存器 2. 栈位置计算 3. 特殊指令深度解析 三、 汇编转化 一. 汇编源码 single_int_param:0000000000000040: 89 4C 24 08 mov dword ptr [rsp8],ecx0000000000000044: 57 push rdi0000…...

行列式的性质
1 行列式使用如下性质定义 1)单位矩阵行列式值为 1, ,对于任意单位矩阵均成立; 2)当矩阵交换一行后,行列式值改变符号,如置换矩阵的行列式值为 (根据行交换次数决定)&…...

联软NSPM自动化策略管理 助力上交所加速国产化替代提升运维效率
在金融行业核心基础设施国产化浪潮与网络安全强监管的双重背景下,上海证券交易所(以下简称“上交所”)积极拥抱变革,携手长期合作伙伴联软科技,成功部署了联软安全策略管理系统(NSPM)。该项目不…...

Flask + ECharts+MYSQL物联网数字化大屏
基于Flask+ECharts的物联网数字化大屏系统,包含中国地图实时数据更新功能。这个系统模拟了物联网设备在全国范围内的分布和运行状况,并实时更新数据。 一、系统架构设计 技术栈 后端:Flask(轻量级路由+API支持) 前端:ECharts(地图+动态图表)、WebSocket(实时更新)…...
业务到解决方案构想
解决方案构想的核心理解 解决方案构想是连接业务需求与技术实现的关键桥梁,从您描述的内容和我的理解,这个阶段的核心点包括: 核心要点解读 转化视角:将业务视角的需求转变为解决方案视角 业务能力探索阶段识别了"做什么&q…...

数据库系统概论(十六)数据库安全性(安全标准,控制,视图机制,审计与数据加密)
数据库系统概论(十六)数据库安全性 前言一、数据库安全性1. 什么是数据库安全性?2. 为何会存在安全问题? 二、安全标准的发展1. 早期的“开拓者”:TCSEC标准2. 走向国际统一:CC标准3. TCSEC和CC标准有什么不…...

vue3从入门到精通(基础+进阶+案例)
Vue是什么? 渐进式JavaScript框架,易学易用,性能出色,适用场景丰富的Web前端框架 为什么要学习Vue Vue是目前前端最火的框架之一 Vue是目前企业技术栈中要求的知识点 Vue可以提升开发体验 。。。 Vue简介 Vue(发音为/vju/,…...

【Linux 学习计划】-- 系统中进程是如何调度的(内核进程调度队列)
目录 回顾进程优先级与进程调度的引入 内核runqueue图例 关于queue[140]前100个位置 | 实时进程与分时进程 遍历需要调度的进程与bitmap的引入 active、expired指针 结语 回顾进程优先级与进程调度的引入 在我们之前的学习中,我们是有学习过进程优先级这个概…...
gemini和chatgpt数据对比:谁在卷性能、价格和场景?
先把结论“剧透”给赶时间的朋友:顶配 Gemini Ultra/2.5 Pro 在纸面成绩上普遍领先,而 ChatGPT 家族(GPT-4o / o3 / 4.1)则在延迟、生态和稳定性上占优。下面把核心数据拆开讲,方便你对号入座。附带参考来源࿰…...

C#、VB.net——如何设置窗体应用程序的外边框不可拉伸
以Visual studio 2015为例,具体操作如下: 1、将窗体的“FormBorderStyle”属性值修改为“FixedSingle”: 2、点击“格式”——“锁定控件”: 这样生成的程序边框即可固定住,无法拉伸。...

基于SpringBoot的房屋租赁系统的设计与实现(thymeleaf+MySQL)
💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...

Spring Boot统一功能处理深度解析
第一章:为什么需要统一功能处理? 想象你正在开发一个电商系统,包含用户管理、商品管理、订单管理等模块。每个模块都需要: 用户身份验证操作日志记录异常统一处理数据格式标准化 如果每个模块都单独实现这些功能: …...

世事无常,比较复杂,人可以简单一点
2025年6月5日日,17~28℃,一般 待办: 宣讲会 职称材料的最后检查 职称材料有错误,需要修改 期末考试试题启用 教学技能大赛PPT 遇见:部门宣传泰国博士项目、硕士项目、本科项目。 感受或反思:东南亚博士…...
使用 Docker Compose 安装 PostgreSQL 16
前面是指南,后面是实际工作日志。 1. 创建 docker-compose.yml 文件 yaml 复制 下载 version: 3.9 services:postgres:image: postgres:16container_name: postgres-16environment:POSTGRES_USER: your_username # 替换为你的用户名POSTGRES_PASSWORD: your…...
每日算法刷题Day23 6.5:leetcode二分答案3道题,用时1h40min(有点慢)
8. 3007.价值和小于等于K的最大数字(中等,学习,太难,先过) 3007. 价值和小于等于 K 的最大数字 - 力扣(LeetCode) 思想 1.给你一个整数 k 和一个整数 x 。整数 num 的价值是它的二进制表示中在 x,2x,3x …...
【Android基础回顾】七:内存管理机制
Android 的内存管理机制是一个多层次的复杂系统,旨在高效利用有限的物理内存(RAM),在保证前台应用流畅运行的同时,尽可能在后台保留更多应用以提高启动速度(多任务)。 它的核心机制结合了 Linu…...

数据结构哈希表总结
349. 两个数组的交集 力扣题目链接(opens new window) 题意:给定两个数组,编写一个函数来计算它们的交集。 说明: 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。 public int[] intersection(int[] nums1, int[] num…...
Spring事务失效-----十大常见场景及解决方案全解析
Spring事务失效的常见场景及原因分析 Spring事务管理是开发中的核心功能,但在实际应用中可能因各种原因导致事务失效。以下是常见的事务失效场景及详细解析: 1. 方法未被Spring管理 场景:使用new关键字直接创建对象,而非通过Spring容器注入原因:Spring事务基于AOP代理,…...
KMP 算法中 next 数组的构建函数 get_next
KMP 算法中 next 数组的构建函数 get_next ,负责计算模式串的 next 数组,核心是通过递推找到每个位置的 “最长相等前缀后缀长度”。(下标从 1 开始): 一、函数作用 get_next(SString T, int next[]) 的任务…...

IDEA 开发PHP配置调试插件XDebug
1、安装PHP环境 为了方便,使用的PhpStudy。 安装路径:D:\resources\phpstudy_pro\Extensions\php\php7.3.4nts 2、下载Xdebug Xdebug: Downloads 选择对应的版本下载,本次使用的是7.3。 3、配置Xdebug 在php.ini中添加Xdebug配置。 D…...

奇异值分解(SVD):线性代数在AI大模型中的核心工具
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…...
矩阵分解相关知识点总结(二)
文章目录 三、矩阵的QR分解3.1、Givens矩阵与Givens变换3.2、Householder矩阵与Householder变换3.3、QR分解 书接上文矩阵分解相关知识点总结(一) 三、矩阵的QR分解 3.1、Givens矩阵与Givens变换 设非零列向量 x ∈ R n \bm{x}\in {\bf{R}}^n x∈Rn及单…...

MySQL——视图 用户管理 语言访问
目录 视图 用户管理 数据库权限 访问 准备工作 使用函数 mysql界面级工具 连接池 视图 这里的视图与事务中的读视图是两个不同的概念:视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的…...

二、Sqoop 详细安装部署教程
作者:IvanCodes 日期:2025年6月2日 专栏:Sqoop教程 Apache Sqoop 是一个强大的工具,用于在 Hadoop (HDFS, Hive, HBase) 与关系型数据库 (如 MySQL, PostgreSQL, Oracle) 之间高效传输数据。本教程将详细指导您如何根据官方网站截…...