2025前端微服务 - 无界 的实战应用

news2025/6/6 20:49:07

遇饮酒时须饮酒,得高歌处且高歌

在这里插入图片描述

文章目录

  • 什么是前端微服务
  • 主流框架概述
    • 无界 - 腾讯
    • 乾坤 - 阿里
    • 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>
  <WujieVue
    width="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>
  <WujieVue
    width="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>
  <WujieVue
    width="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>
  <WujieVue
    width="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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2402098.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【设计模式-4.8】行为型——中介者模式

说明&#xff1a;本文介绍行为型设计模式之一的中介者模式 定义 中介者模式&#xff08;Mediator Pattern&#xff09;又叫作调节者模式或调停者模式。用一个中介对象封装一系列对象交互&#xff0c;中介者使各对象不需要显式地互相作用&#xff0c;从而使其耦合松散&#xf…

行列式的性质

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

联软NSPM自动化策略管理 助力上交所加速国产化替代提升运维效率

在金融行业核心基础设施国产化浪潮与网络安全强监管的双重背景下&#xff0c;上海证券交易所&#xff08;以下简称“上交所”&#xff09;积极拥抱变革&#xff0c;携手长期合作伙伴联软科技&#xff0c;成功部署了联软安全策略管理系统&#xff08;NSPM&#xff09;。该项目不…

Flask + ECharts+MYSQL物联网数字化大屏

基于Flask+ECharts的物联网数字化大屏系统,包含中国地图实时数据更新功能。这个系统模拟了物联网设备在全国范围内的分布和运行状况,并实时更新数据。 一、系统架构设计 技术栈 后端:Flask(轻量级路由+API支持) 前端:ECharts(地图+动态图表)、WebSocket(实时更新)…

数据库系统概论(十六)数据库安全性(安全标准,控制,视图机制,审计与数据加密)

数据库系统概论&#xff08;十六&#xff09;数据库安全性 前言一、数据库安全性1. 什么是数据库安全性&#xff1f;2. 为何会存在安全问题&#xff1f; 二、安全标准的发展1. 早期的“开拓者”&#xff1a;TCSEC标准2. 走向国际统一&#xff1a;CC标准3. TCSEC和CC标准有什么不…

vue3从入门到精通(基础+进阶+案例)

Vue是什么&#xff1f; 渐进式JavaScript框架&#xff0c;易学易用&#xff0c;性能出色&#xff0c;适用场景丰富的Web前端框架 为什么要学习Vue Vue是目前前端最火的框架之一 Vue是目前企业技术栈中要求的知识点 Vue可以提升开发体验 。。。 Vue简介 Vue(发音为/vju/,…

【Linux 学习计划】-- 系统中进程是如何调度的(内核进程调度队列)

目录 回顾进程优先级与进程调度的引入 内核runqueue图例 关于queue[140]前100个位置 | 实时进程与分时进程 遍历需要调度的进程与bitmap的引入 active、expired指针 结语 回顾进程优先级与进程调度的引入 在我们之前的学习中&#xff0c;我们是有学习过进程优先级这个概…

C#、VB.net——如何设置窗体应用程序的外边框不可拉伸

以Visual studio 2015为例&#xff0c;具体操作如下&#xff1a; 1、将窗体的“FormBorderStyle”属性值修改为“FixedSingle”&#xff1a; 2、点击“格式”——“锁定控件”&#xff1a; 这样生成的程序边框即可固定住&#xff0c;无法拉伸。

基于SpringBoot的房屋租赁系统的设计与实现(thymeleaf+MySQL)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

Spring Boot统一功能处理深度解析

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

世事无常,比较复杂,人可以简单一点

2025年6月5日日&#xff0c;17~28℃&#xff0c;一般 待办&#xff1a; 宣讲会 职称材料的最后检查 职称材料有错误&#xff0c;需要修改 期末考试试题启用 教学技能大赛PPT 遇见&#xff1a;部门宣传泰国博士项目、硕士项目、本科项目。 感受或反思&#xff1a;东南亚博士…

数据结构哈希表总结

349. 两个数组的交集 力扣题目链接(opens new window) 题意&#xff1a;给定两个数组&#xff0c;编写一个函数来计算它们的交集。 说明&#xff1a; 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。 public int[] intersection(int[] nums1, int[] num…

IDEA 开发PHP配置调试插件XDebug

1、安装PHP环境 为了方便&#xff0c;使用的PhpStudy。 安装路径&#xff1a;D:\resources\phpstudy_pro\Extensions\php\php7.3.4nts 2、下载Xdebug Xdebug: Downloads 选择对应的版本下载&#xff0c;本次使用的是7.3。 3、配置Xdebug 在php.ini中添加Xdebug配置。 D…

奇异值分解(SVD):线性代数在AI大模型中的核心工具

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…

MySQL——视图 用户管理 语言访问

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

二、Sqoop 详细安装部署教程

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

【C语言预处理详解(下)】--#和##运算符,命名约定,命令行定义 ,#undef,条件编译,头文件的包含,嵌套文件包含,其他预处理指令

目录 五.#和##运算符 5.1--#运算符 5.2--##运算符 六.命名约定&#xff0c;#undef&#xff0c;命令行定义 6.1--命名约定 6.2--#undef 6.3--命名行定义 七.条件编译 常见的条件编译指令&#xff1a; 1.普通的条件编译&#xff1a; 2.多个分支的条件编译(可以利用条…

03.搭建K8S集群

K8S集群搭建的方式 目前主流的搭建k8s集群的方式有kubeadm、minikube、二进制包三种方式&#xff1a; kubeadm&#xff08;本案例搭建方式&#xff09; 是一个工具&#xff0c;用于快速搭建kubernetes集群&#xff0c;目前应该是比较方便和推荐的&#xff0c;简单易用 kubea…

RDMA简介3之四种子协议对比

RDMA协议共有四种子协议&#xff0c;分别为InfiniBand、iWARP、RoCE v1和RoCE v2协议。这四种协议使用统一的RDMA API&#xff0c;但在具体的网络层级实现上有所不同&#xff0c;如图1所示&#xff0c;接下来将分别介绍这四种子协议。 图1 RDMA四种子协议网络层级关系图 Infin…

【最新版】西陆洗车系统源码全开源+uniapp前端+搭建教程

一.系统介绍 一款基于ThinkPHPUniapp开发的多门店洗车系统&#xff0c;包含用户端&#xff08;小程序&#xff09;、门店员工端&#xff08;小程序&#xff09;、门店端&#xff08;PC&#xff09;、平台管理端&#xff08;PC&#xff09;。 门店分连锁门店和独立门店&#xf…