当前位置: 首页 > news >正文

微前端的需求有哪些?微前端的原理是怎么样的?为什么这么设计,及微前端的应用场景是什么?对有些客户,前端的重要性高于后端

微前端(Micro Frontends)是将前端应用拆分成多个独立、可部署的部分,每个部分可以由不同的团队独立开发、测试、部署和维护。这种架构类似于微服务在后端的应用,是为了应对复杂前端应用的维护和扩展问题而提出的。

来龙去脉

背景

随着前端技术的发展,前端应用变得越来越复杂和庞大。单体前端应用(Monolith Frontend)在开发和维护过程中面临以下问题:

  • 开发效率低:多个团队在同一个代码库中工作,容易产生冲突。
  • 部署风险高:每次部署都需要部署整个应用,任何部分的错误都会影响整个系统。
  • 技术债务:随着时间推移,不同部分可能采用不同的技术栈,难以统一和升级。
  • 可维护性差:代码库庞大,难以理解和维护。

微前端的出现

为了解决上述问题,微前端架构应运而生。微前端借鉴了微服务的思想,将一个大应用拆分为若干小的前端应用,每个应用可以独立开发、部署和运行。这些小应用通过某种方式集成在一起,形成最终的用户界面。

微前端的原理

微前端的核心思想是将前端应用拆分为多个独立的模块,这些模块可以独立开发、测试、部署和运行。具体原理包括以下几个方面:

  1. 独立开发和部署:每个微前端模块可以由不同的团队独立开发和部署,模块之间通过明确的接口进行通信。
  2. 独立运行环境:每个模块可以有自己的运行环境和技术栈,互不干扰。
  3. 模块加载和渲染:通过主应用(或称为壳应用)动态加载和渲染各个微前端模块,可以使用iframe、JavaScript动态加载等技术。
  4. 通信机制:通过事件总线、全局状态管理、URL路由等方式实现模块之间的通信和数据共享。

设计原因

微前端的设计主要是为了应对以下问题:

  • 团队独立性:不同团队可以独立开发和部署自己的模块,减少团队之间的依赖和冲突。
  • 技术多样性:不同模块可以使用不同的技术栈,允许团队选择最适合的技术。
  • 增量升级:可以逐步迁移和升级模块,而不需要一次性重构整个应用。
  • 降低风险:每个模块的发布和更新都是独立的,降低了全局部署的风险。

应用场景

微前端适用于以下场景:

  1. 大型企业应用:适用于需要多个团队协作的大型企业级应用。
  2. 需要频繁更新的应用:适用于需要频繁发布和更新的应用,可以降低发布风险。
  3. 多技术栈共存的应用:适用于需要同时使用多种前端技术的应用。
  4. 渐进式迁移:适用于需要逐步从老旧系统迁移到新系统的场景。

当然,关于微前端,还有很多内容可以深入探讨。以下是一些更详细的方面:

微前端的架构模式

微前端架构有多种实现方式,每种方式都有其优缺点,适用于不同的场景。

1. 基于iframe的架构

通过iframe将不同的微前端应用嵌入到主应用中。每个iframe加载一个独立的前端应用。

  • 优点

    • 隔离性强iframe天生具有隔离性,可以有效避免样式和脚本的冲突。
    • 独立性高:每个iframe可以独立开发、部署和运行。
  • 缺点

    • 性能问题iframe的加载和渲染性能较差,影响用户体验。
    • 通信复杂iframe之间的通信较为复杂,需要使用postMessage等机制。

2. 基于JavaScript的动态加载

通过JavaScript动态加载微前端模块,通常使用模块联邦(Module Federation)等技术。

  • 优点

    • 性能较好:可以优化加载和渲染,提高性能。
    • 灵活性高:可以根据需要动态加载和卸载模块。
  • 缺点

    • 隔离性较弱:需要额外处理样式和脚本的冲突问题。
    • 复杂度高:需要处理模块加载、依赖管理等问题。

3. 基于Web Components

使用Web Components(如Custom Elements、Shadow DOM)将每个微前端模块封装成独立的组件。

  • 优点

    • 标准化:基于Web标准的组件,具有良好的兼容性和可维护性。
    • 隔离性好:Shadow DOM提供了样式隔离,避免样式冲突。
  • 缺点

    • 学习成本:需要学习和掌握Web Components相关技术。
    • 浏览器兼容性:需要考虑对旧版浏览器的支持。

4. 基于Server-Side Includes (SSI)

通过服务端模板引擎在服务器端组合不同的微前端模块,生成完整的页面。

  • 优点

    • 性能好:在服务器端完成组合,减少客户端的加载时间。
    • 安全性高:避免了客户端的跨域问题。
  • 缺点

    • 灵活性差:需要在服务器端进行配置和管理,灵活性较低。
    • 开发复杂:需要处理服务端和客户端的协同问题。

微前端的技术栈

微前端并不限制使用特定的技术栈,可以根据实际需求选择合适的技术。常见的技术栈包括:

  • JavaScript框架:React、Vue、Angular、Svelte等。
  • 模块打包工具:Webpack、Rollup、Parcel等。
  • 状态管理:Redux、MobX、Vuex等。
  • 路由管理:React Router、Vue Router等。
  • 通信机制:Event Bus、Custom Events、Shared State等。

微前端的实施步骤

实施微前端架构通常需要以下几个步骤:

  1. 需求分析:确定应用的需求和微前端的适用性。
  2. 架构设计:选择合适的微前端架构模式和技术栈。
  3. 模块划分:将应用划分为若干独立的模块,每个模块有明确的功能边界。
  4. 开发和测试:独立开发和测试每个模块,确保模块的独立性和稳定性。
  5. 集成和部署:通过主应用集成各个模块,并进行统一的部署和运维。

微前端的挑战

尽管微前端有很多优点,但在实际应用中也面临一些挑战:

  • 性能优化:需要优化模块的加载和渲染,避免影响用户体验。
  • 通信和状态管理:需要设计高效的模块间通信机制和全局状态管理方案。
  • 样式和资源管理:需要处理模块间的样式冲突和资源共享问题。
  • 安全性:需要确保不同模块间的隔离性,避免安全漏洞。
  • 运维和监控:需要建立完善的运维和监控体系,保障系统的稳定性和可靠性。

当然,让我们深入探讨微前端的更多细节,包括实际的实施经验、最佳实践,以及一些具体的工具和框架。

微前端的最佳实践

1. 明确的模块边界

确保每个微前端模块有明确的功能边界和责任划分。模块之间的依赖和通信需要通过明确的接口和协议来实现。

  • 功能划分:根据业务功能、页面结构或用户角色划分模块。
  • 接口设计:设计清晰的API接口,确保模块之间的低耦合。

2. 独立开发和部署

每个微前端模块应独立开发、测试和部署,确保模块的独立性和可维护性。

  • 独立代码库:每个模块使用独立的代码库和版本控制。
  • 独立CI/CD:每个模块有独立的持续集成和持续部署流程。

3. 高效的模块加载

优化模块的加载和渲染,确保用户体验。

  • 懒加载:根据需要动态加载模块,减少初始加载时间。
  • 缓存策略:利用浏览器缓存和CDN优化资源加载。
  • 预加载:根据用户行为预加载即将使用的模块。

4. 统一的状态管理

设计统一的状态管理方案,确保各个模块之间的数据一致性。

  • 全局状态管理:使用Redux、MobX等全局状态管理库。
  • 模块间通信:通过事件总线、消息队列等方式实现模块间的通信。

5. 样式隔离

确保各个模块的样式互不干扰,避免样式冲突。

  • CSS Modules:使用CSS Modules实现样式的局部作用域。
  • Shadow DOM:使用Web Components的Shadow DOM实现样式隔离。
  • 命名规范:制定统一的样式命名规范,避免全局样式污染。

6. 安全性

确保模块之间的隔离性,避免安全漏洞。

  • 内容安全策略(CSP):使用CSP策略限制模块的资源加载和执行。
  • 跨域资源共享(CORS):配置CORS策略,确保资源的安全加载。
  • 身份认证和授权:设计统一的认证和授权机制,确保用户数据的安全性。

7. 运维和监控

建立完善的运维和监控体系,保障系统的稳定性和可靠性。

  • 日志记录:记录各个模块的运行日志,便于问题排查。
  • 性能监控:监控模块的加载和运行性能,及时发现和优化性能瓶颈。
  • 错误处理:设计统一的错误处理机制,及时捕获和处理运行时错误。

微前端的工具和框架

1. Single-SPA

Single-SPA 是一个用于构建微前端架构的框架,支持多个框架并存(如React、Vue、Angular等),通过注册应用和路由,实现多个微前端应用的加载和渲染。

  • 优点:灵活性高,支持多种前端框架,易于集成。
  • 缺点:需要一定的学习成本,配置较为复杂。

2. qiankun

qiankun 是基于Single-SPA的微前端框架,由阿里巴巴开发。它提供了更加开箱即用的API和工具,简化了微前端的实现。

  • 优点:易用性高,提供了丰富的功能和文档。
  • 缺点:与Single-SPA类似,仍需要一定的学习和配置。

3. Module Federation

Module Federation 是Webpack 5引入的一种模块加载技术,允许在应用之间动态加载代码,实现微前端模块的共享和加载。

  • 优点:与Webpack无缝集成,高性能,灵活性强。
  • 缺点:与Webpack的依赖较强,学习曲线较陡。

4. Bit

Bit 是一个组件驱动的开发平台,支持将前端组件独立化,实现微前端的组件化开发。

  • 优点:组件化强,易于复用和分享。
  • 缺点:需要适应组件驱动的开发模式。

当然,我们继续深入探讨微前端的更多细节和工具。

5. Piral

Piral 是一个用于构建微前端架构的框架,专注于提供一个灵活和可扩展的解决方案。Piral允许开发者创建一个门户应用(piral instance),其中可以嵌入多个微前端模块(pilet)。

  • 优点

    • 强大的插件系统,提供许多开箱即用的功能。
    • 灵活性高,支持多种前端技术栈。
    • 良好的文档和社区支持。
  • 缺点

    • 学习曲线较陡,特别是对于新手。
    • 生态系统相对较小,需要社区的持续发展。

6. Open Components

Open Components 是一种微服务风格的微前端架构,专注于组件的发布和消费。它允许开发者创建独立的组件服务,并通过HTTP API进行消费。

  • 优点

    • 组件化强,易于独立开发和部署。
    • 支持多种语言和框架,灵活性高。
  • 缺点

    • 依赖服务端的支持,前后端协同工作。
    • 需要额外的运维和部署管理。

微前端的实施案例

1. 大型电商平台

在大型电商平台中,通常有多个团队负责不同的功能模块,如首页、商品详情页、购物车、用户中心等。通过微前端架构,每个团队可以独立开发和部署自己的模块,提升开发效率和部署灵活性。

  • 实施方式:可以采用Single-SPA或qiankun等框架,结合模块联邦技术,实现动态加载和渲染。
  • 挑战:需要处理模块间的通信和状态管理,确保用户体验一致性。

2. 企业级管理系统

在企业级管理系统中,通常涉及多个子系统,如人力资源管理、财务管理、供应链管理等。通过微前端架构,可以将这些子系统拆分为独立的微前端模块,便于独立开发和维护。

  • 实施方式:可以采用iframe或Web Components等技术,实现模块的嵌入和隔离。
  • 挑战:需要考虑样式隔离和性能优化,确保系统的稳定性和可维护性。

3. 多品牌网站

在多品牌网站中,不同品牌可能有不同的前端需求和设计风格。通过微前端架构,可以为每个品牌创建独立的前端模块,并通过主应用进行统一管理和集成。

  • 实施方式:可以采用Piral或Open Components等框架,实现模块化和组件化开发。
  • 挑战:需要确保品牌间的样式和功能一致性,避免用户体验的割裂。

微前端的未来趋势

1. 标准化和规范化

随着微前端架构的普及,行业内将逐步形成一套标准化和规范化的解决方案,减少开发者的学习和实施成本。

  • 标准化协议:制定统一的模块通信和加载协议,确保模块的互操作性。
  • 最佳实践:总结和推广微前端的最佳实践,提升开发和运维效率。

2. 工具和框架的成熟

现有的微前端工具和框架将不断发展和完善,提供更多开箱即用的功能和更好的开发体验。

  • 集成开发环境:提供一体化的开发、测试和部署工具,简化微前端的实施流程。
  • 性能优化:通过更好的模块加载和渲染技术,提升微前端应用的性能。

3. 生态系统的扩展

微前端的生态系统将不断扩展,涵盖更多的前端技术和应用场景。

  • 多技术栈支持:支持更多的前端框架和技术,满足不同团队的需求。
  • 跨平台应用:扩展到移动端、桌面端等更多平台,实现全方位的应用支持。

4. 自动化和智能化

通过自动化和智能化技术,进一步提升微前端的开发和运维效率。

  • 自动化测试:提供自动化的测试工具和框架,确保模块的稳定性和可靠性。
  • 智能化运维:通过智能化的运维和监控工具,及时发现和处理系统问题,保障系统的平稳运行。

微前端的具体实现

让我们更详细地探讨一些常见的微前端实现技术和步骤。

1. Single-SPA 实现示例

Single-SPA 是一个流行的微前端框架,支持将多个前端框架集成到一个应用中。以下是一个简单的使用 Single-SPA 的示例:

步骤 1:安装 Single-SPA

首先,安装 Single-SPA CLI 工具:

npm install -g create-single-spa
步骤 2:创建主应用和微前端应用

使用 CLI 工具创建主应用:

npx create-single-spa

根据提示选择创建一个 root-config 项目。然后,创建微前端应用(例如 React 应用):

npx create-single-spa --moduleType app-parcel --template react
步骤 3:配置主应用

在主应用的 single-spa-config.js 文件中,注册微前端应用:

import { registerApplication, start } from "single-spa";registerApplication('react-app',() => import('react-app'),location => location.pathname.startsWith('/react-app')
);start();
步骤 4:运行和测试

启动主应用和微前端应用,并在浏览器中访问相应路径,验证微前端应用的加载和渲染。

2. qiankun 实现示例

qiankun 是基于 Single-SPA 的微前端框架,简化了微前端的实现。以下是一个使用 qiankun 的示例:

步骤 1:安装 qiankun

在主应用中安装 qiankun:

npm install qiankun
步骤 2:配置主应用

在主应用的入口文件中配置 qiankun:

import { registerMicroApps, start } from 'qiankun';// 注册微前端应用
registerMicroApps([{name: 'react-app',entry: '//localhost:7100',container: '#container',activeRule: '/react-app',},// 其他微前端应用
]);// 启动 qiankun
start();
步骤 3:配置微前端应用

在微前端应用中,导出生命周期函数:

// src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';function render() {ReactDOM.render(<App />, document.getElementById('root'));
}if (!window.__POWERED_BY_QIANKUN__) {render();
}export async function bootstrap() {console.log('React app bootstraped');
}export async function mount() {render();
}export async function unmount() {ReactDOM.unmountComponentAtNode(document.getElementById('root'));
}
步骤 4:运行和测试

启动主应用和微前端应用,并在浏览器中访问相应路径,验证微前端应用的加载和渲染。

微前端的通信机制

在微前端架构中,各个模块需要进行通信以保持数据一致性和交互性。常见的通信机制包括:

1. 事件总线

使用事件总线(Event Bus)在不同模块之间传递消息。可以使用库如 mitt 或者 eventemitter3

// eventBus.js
import mitt from 'mitt';
const eventBus = mitt();
export default eventBus;// 在模块中使用
import eventBus from './eventBus';// 发送事件
eventBus.emit('eventName', eventData);// 监听事件
eventBus.on('eventName', (eventData) => {// 处理事件
});

2. 全局状态管理

使用全局状态管理工具(如 Redux 或 MobX)在不同模块之间共享状态:

// store.js
import { createStore } from 'redux';const initialState = {data: null,
};function reducer(state = initialState, action) {switch (action.type) {case 'SET_DATA':return { ...state, data: action.payload };default:return state;}
}const store = createStore(reducer);
export default store;// 在模块中使用
import store from './store';// 获取状态
const state = store.getState();// 订阅状态变化
store.subscribe(() => {const state = store.getState();// 更新视图
});// 分发动作
store.dispatch({ type: ''SSET_DATA', payload: newData });### 3. **自定义事件**利用浏览器提供的自定义事件机制,各个模块可以通过 `CustomEvent` 进行通信:```javascript
// 发送事件
const event = new CustomEvent('eventName', { detail: eventData });
window.dispatchEvent(event);// 监听事件
window.addEventListener('eventName', (event) => {const eventData = event.detail;// 处理事件
});

4. 共享服务

通过共享服务(Shared Service),模块之间可以共享公共逻辑和数据。这种方式通常在微前端架构中使用服务提供者模式(Service Provider Pattern)实现:

// sharedService.js
class SharedService {constructor() {this.data = null;this.subscribers = [];}setData(data) {this.data = data;this.notifySubscribers();}getData() {return this.data;}subscribe(callback) {this.subscribers.push(callback);}notifySubscribers() {this.subscribers.forEach(callback => callback(this.data));}
}const sharedService = new SharedService();
export default sharedService;// 在模块中使用
import sharedService from './sharedService';// 设置数据
sharedService.setData(newData);// 获取数据
const data = sharedService.getData();// 订阅数据变化
sharedService.subscribe((data) => {// 处理数据变化
});

微前端的性能优化

在微前端架构中,性能优化是一个重要的课题,以下是一些常见的优化策略:

1. 按需加载和懒加载

通过按需加载和懒加载技术,减少初始加载时间,提高用户体验:

// React 示例
const LazyComponent = React.lazy(() => import('./LazyComponent'));function App() {return (<React.Suspense fallback={<div>Loading...</div>}><LazyComponent /></React.Suspense>);
}

2. 代码拆分

利用 Webpack 等构建工具的代码拆分功能,将应用拆分为多个小的包,按需加载:

// webpack.config.js
module.exports = {optimization: {splitChunks: {chunks: 'all',},},
};

3. 缓存策略

利用浏览器缓存和 CDN 缓存策略,减少资源的重复加载:

<!-- HTML 示例 -->
<link rel="stylesheet" href="styles.css" integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxr+la69aL5/2eV8tqk5sIhoxl8n5Ue" crossorigin="anonymous">

4. 性能监控

通过性能监控工具,如 Lighthouse、Web Vitals 等,持续监控和优化应用的性能:

import { getCLS, getFID, getLCP } from 'web-vitals';getCLS(console.log);
getFID(console.log);
getLCP(console.log);

微前端的安全性

微前端架构中的安全性同样不容忽视,以下是一些常见的安全措施:

1. 内容安全策略(CSP)

通过配置内容安全策略,限制资源的加载来源,防止 XSS 攻击:

<!-- HTML 示例 -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src 'self' https://example.com; script-src 'self' https://example.com;">

2. 跨域资源共享(CORS)

配置 CORS 策略,确保资源加载的安全性:

// Node.js 示例
const express = require('express');
const cors = require('cors');
const app = express();app.use(cors({origin: 'https://example.com',methods: 'GET,POST',
}));app.listen(3000);

3. 身份认证和授权

通过统一的身份认证和授权机制,确保用户数据的安全性:

// 使用 JWT 进行身份认证
const jwt = require('jsonwebtoken');
const token = jwt.sign({ userId: 123 }, 'secret-key', { expiresIn: '1h' });// 验证 JWT
jwt.verify(token, 'secret-key', (err, decoded) => {if (err) {// 认证失败} else {// 认证成功}
});

相关文章:

微前端的需求有哪些?微前端的原理是怎么样的?为什么这么设计,及微前端的应用场景是什么?对有些客户,前端的重要性高于后端

微前端&#xff08;Micro Frontends&#xff09;是将前端应用拆分成多个独立、可部署的部分&#xff0c;每个部分可以由不同的团队独立开发、测试、部署和维护。这种架构类似于微服务在后端的应用&#xff0c;是为了应对复杂前端应用的维护和扩展问题而提出的。 来龙去脉 背景…...

【Spring Boot】统一数据返回

目录 统一数据返回一. 概念二.实现统一数据返回2.1 重写responseAdvice方法2.2 重写beforeBodyWriter方法 三. 特殊类型-String的处理四. 全部代码 统一数据返回 一. 概念 其实统一数据返回是运用了AOP&#xff08;对某一类事情的集中处理&#xff09;的思维&#xff0c;简单…...

证券交易系统中服务器监控系统功能设计

1.背景介绍 此服务器监控系统的目的在于提高行情服务器的监管效率&#xff0c;因目前的的行情服务器&#xff0c;包括DM、DT、DS配置数量较多&#xff0c;巡回维护耗时较多&#xff0c;当行情服务器出现异常故障&#xff0c;或者因为网络问题造成数据断线等情况时&#xff0c;监…...

【线性代数的本质】矩阵与线性变换

线性变化要满足两点性质&#xff1a; 直线&#xff08;连续的点&#xff09;在变换后还是直线。原点不变。 假设有坐标轴&#xff08;基底&#xff09; i ^ \widehat{i} i 和 j ^ \widehat{j} j ​&#xff1a; i ^ [ 1 0 ] , j ^ [ 0 1 ] \widehat{i}\begin{bmatrix} 1 \…...

CV02_超强数据集:MSCOCO数据集的简单介绍

1.1 简介 MSCOCO数据集&#xff0c;全称为Microsoft Common Objects in Context&#xff0c;是由微软公司在2014年推出并维护的一个大规模的图像数据集&#xff0c;旨在推动计算机视觉领域的研究&#xff0c;尤其是目标识别、目标检测、实例分割、图像描述生成等任务。该数据集…...

Linux--信号(万字详解!超完整!)

目录 0.预备知识 0.1.基本概念 0.2.信号的捕捉 0.3.理解信号的发送与保存 1.信号的产生&#xff08;阶段一&#xff09; 1.通过kill命令&#xff0c;向指定进程发送指定的信号 2.通过终端按键产生信号&#xff1a;ctrlc&#xff08;信号2&#xff09;&#xff0c;ctrl\(…...

onnx模型转rknn到部署

简介 最近开始用3568的板子&#xff0c;之前是在用3399&#xff0c;cpu的话3399比3568强&#xff0c;但是3568有1T的npu算力&#xff0c;所以模型移植过来用npu使用&#xff0c;之前用ncnn感觉太慢了&#xff0c;rk的npu使用没有开源&#xff0c;所以没法兼容&#xff0c;只能跑…...

lua入门(1) - 基本语法

本文参考自&#xff1a; Lua 基本语法 | 菜鸟教程 (runoob.com) 需要更加详细了解的还请参看lua 上方链接 交互式编程 Lua 提供了交互式编程模式。我们可以在命令行中输入程序并立即查看效果。 Lua 交互式编程模式可以通过命令 lua -i 或 lua 来启用&#xff1a; 如下图: 按…...

Finding Global Homophily in Graph Neural Networks When Meeting Heterophily

本文发表于:ICML22 推荐指数: #paper/⭐⭐⭐ 问题背景: 异配图的邻接矩阵难以确定,以及异配图的计算复杂度开销大 可行的解决办法:高通滤波多跳邻居,GPRGNN(pagerank一类&#xff0c;各阶邻居的权重不同,ACM-GCN&#xff08;高低通滤波,H2GCN&#xff08;应该复杂度很大&…...

DisFormer:提高视觉动态预测的准确性和泛化能力

最新的研究进展已经显示出目标中心的表示方法在视觉动态预测任务中可以显著提升预测精度&#xff0c;并且增加模型的可解释性。这种表示方法通过将视觉场景分解为独立的对象&#xff0c;有助于模型更好地理解和预测场景中的变化。 尽管在静态图像的解耦表示学习方面已经取得了一…...

Android SurfaceFlinger——Surface和Layer介绍(十九)

按照前面系统开机动画的流程继续分析,在获取到显示屏信息后,下一步就是开始创建 Surface和设置 Layer 层级,这里就出现了两个新的概念——Surface 和 Layer。 一、基本概念 1、Surface介绍 在 Android 系统中,Surface 是一个非常核心的概念,它是用于显示图像的生产者-消…...

C++基础(七):类和对象(中-2)

上一篇博客学的默认成员函数是类和对象的最重要的内容&#xff0c;相信大家已经掌握了吧&#xff0c;这一篇博客接着继续剩下的内容&#xff0c;加油&#xff01; 目录 一、const成员&#xff08;理解&#xff09; 1.0 引入 1.1 概念 1.2 总结 1.2.1 对象调用成员函数 …...

对秒杀的思考

一、秒杀的目的 特价商品&#xff0c;数量有限&#xff0c;先到先得&#xff0c;售完为止 二、优惠券的秒杀 和特价商品的秒杀是一样的&#xff0c;只不过秒杀的商品是优惠券 三、秒杀的需求 秒杀前&#xff1a;提前将秒杀商品&#xff0c;存放到Redis秒杀中&#xff1a;使…...

数据结构预科

在堆区申请两个长度为32的空间&#xff0c;实现两个字符串的比较【非库函数实现】 要求&#xff1a; 1> 定义函数&#xff0c;在对区申请空间&#xff0c;两个申请&#xff0c;主函数需要调用2次 2> 定义函数&#xff0c;实现字符串的输入&#xff0c;void input(char …...

想做亚马逊测评技术需要解决哪些问题,有哪些收益?

现在真正有亚马逊测评技术的人赚的盆满钵满&#xff0c;有些人看到别人赚取就自己盲目去做&#xff0c;买完了账号和设备就感觉自己懂了&#xff0c;却不知里面的水深着&#xff0c;花了钱却没有掌握真正的技术&#xff0c;号莫名其妙就封完了&#xff0c;而每一次大风控注定要…...

1117 数字之王

solution 判断现有数字是否全为个位数 全为个位数&#xff0c;找出出现次数最多的数字&#xff0c;并首行输出最多出现次数&#xff0c;第二行输出所有出现该次数的数值不全为个位数 若当前位数值为0&#xff0c;无需处理若当前位数值非0&#xff0c;则每位立方相乘&#xff0…...

关于ORACLE单例数据库中的logfile的切换、删除以及添加

一、有关logfile的状态解释 UNUSED&#xff1a; 尚未记录change的空白group&#xff08;一般会出现在loggroup刚刚被添加&#xff0c;或者刚刚使用了reset logs打开数据库&#xff0c;或者使用clear logfile后&#xff09; CURRENT: 当前正在被LGWR使用的gro…...

Linux高并发服务器开发(十三)Web服务器开发

文章目录 1 使用的知识点2 http请求get 和 post的区别 3 整体功能介绍4 基于epoll的web服务器开发流程5 服务器代码6 libevent版本的本地web服务器 1 使用的知识点 2 http请求 get 和 post的区别 http协议请求报文格式: 1 请求行 GET /test.txt HTTP/1.1 2 请求行 健值对 3 空…...

人工智能系列-NumPy(二)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 链接数组 anp.array([[1,2],[3,4]]) print(第一个数组&#xff1a;) print(a) print(\n) bnp.array([[5,6],[7,8]]) print(第二个数组&#xff1a;) print(b) print(\n) print…...

[单master节点k8s部署]19.监控系统构建(四)kube-state-metrics

kube-state-metrics 是一个Kubernetes的附加组件&#xff0c;它通过监听 Kubernetes API 服务器来收集和生成关于 Kubernetes 对象&#xff08;如部署、节点和Pod等&#xff09;的状态的指标。这些指标可供 Prometheus 进行抓取和存储&#xff0c;从而使你能够监控和分析Kubern…...

字符串函数5-9题(30 天 Pandas 挑战)

字符串函数 1. 相关知识点1.5 字符串的长度条件判断1.6 apply映射操作1.7 python大小写转换1.8 正则表达式匹配2.9 包含字符串查询 2. 题目2.5 无效的推文2.6 计算特殊奖金2.7 修复表中的名字2.8 查找拥有有效邮箱的用户2.9 患某种疾病的患者 1. 相关知识点 1.5 字符串的长度条…...

【C语言题目】34.猜凶手

文章目录 作业标题作业内容2.解题思路3.具体代码 作业标题 猜凶手 作业内容 日本某地发生了一件谋杀案&#xff0c;警察通过排查确定杀人凶手必为4个嫌疑犯的一个。 以下为4个嫌疑犯的供词: A说&#xff1a;不是我。 B说&#xff1a;是C。 C说&#xff1a;是D。 D说&#xff…...

C++ 多进程多线程间通信

目录 一、进程间通信 1、管道&#xff08;Pipe&#xff09; 2、消息队列&#xff08;Message Queue&#xff09; 3、共享内存&#xff08;Shared Memory&#xff09; 4、信号量&#xff08;Semaphore&#xff09; 5、套接字&#xff08;Socket&#xff09; 6、信号&…...

怎么做防御系统IPS

入侵防御系统&#xff08;IPS&#xff09;是入侵检测系统&#xff08;IDS&#xff09;的增强版本&#xff0c;它不仅检测网络流量中的恶意活动&#xff0c;还能自动采取措施阻止这些活动。实现IPS的主要工具包括Snort和Suricata。以下是使用Snort和Suricata来实现IPS的详细步骤…...

达梦数据库的系统视图v$auditrecords

达梦数据库的系统视图v$auditrecords 在达梦数据库&#xff08;DM Database&#xff09;中&#xff0c;V$AUDITRECORDS 是专门用来存储和查询数据库审计记录的重要系统视图。这个视图提供了对所有审计事件的访问权限&#xff0c;包括操作类型、操作用户、时间戳、目标对象等信…...

Spring Boot与MyBatis-Plus:代码逆向生成指南

在Spring Boot项目中使用MyBatis-Plus进行代码逆向生成&#xff0c;可以通过MyBatis-Plus提供的代码生成器来快速生成实体类、Mapper接口、Service接口及其实现类等。以下是一个简单的示例步骤&#xff1a; 代码逆向生成 1.添加依赖&#xff1a; 在pom.xml文件中添加MyBati…...

【MySQL】mysql访问

mysql访问 1.引入MySQL 客户端库2.C/C 进行增删改3.查询的处理细节4.图形化界面访问数据库4.1下载MYSQL Workbench4.2MYSQL Workbench远程连接数据库 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&a…...

(1)Jupyter Notebook 下载及安装

目录 1. Jupyter Notebook是什么&#xff1f;2. Jupyter Notebook特征3. 组成部分3.1 网页应用3.2 文档 4. 适用场景5. 利用Google Colab安装Jupyter Notebook3.1 什么是 Colab&#xff1f;3.2 访问 Google Colab3.3 新建笔记本 1. Jupyter Notebook是什么&#xff1f; 百度百科…...

监控平台zabbix对接grafana

本次博客基于监控平台zabbix介绍与部署-CSDN博客的环境下进行的 1、安装grafana并启动 添加一台虚拟机20.0.0.30 &#xff08;1&#xff09;系统初始化 [rootzx3 ~]# systemctl stop firewalld [rootzx3 ~]# setenforce 0 [rootzx3 ~]#&#xff08;2&#xff09;安装并启动…...

14-11 2024 年的 13 个 AI 趋势

2024 年的 13 个 AI 趋势 人工智能对环境的影响和平人工智能人工智能支持的问题解决和决策针对人工智能公司的诉讼2024 年美国总统大选与人工智能威胁人工智能、网络犯罪和社会工程威胁人工智能治疗孤独与对人工智能的情感依赖人工智能影响者中国争夺人工智能霸主地位人工智能…...

计算机大方向的选择

选专业要了解自己的兴趣所在。 即想要学习什么样的专业&#xff0c;如果有明确的专业意向&#xff0c;就可以有针对性地选择那些专业实力较强的院校。 2.如果没有明确的专业意向&#xff0c;可以优先考虑一下院校。 确定一下自己想要选择综合性院校还是理工类院校或是像财经或者…...

使用Qt Installer Framework在centos7中打包

文章目录 步骤 1: 安装Qt和Qt Installer Framework安装Qt安装Qt Installer Framework步骤 2: 创建项目目录结构步骤 3: 编写安装脚本配置文件(config/config.xml)Package 信息meta/package.xmldata 目录步骤 4: 编写安装脚本步骤 5: 生成安装程序总结在CentOS 7中使用Qt Inst…...

您的私人办公室!-----ONLYOFFICE8.1版本的桌面编辑器测评

随时随地创建并编辑文档&#xff0c;还可就其进行协作 ONLYOFFICE 文档是一款强大的在线编辑器&#xff0c;为您使用的平台提供文本文档、电子表格、演示文稿、表单和 PDF 编辑工具。 网页地址链接&#xff1a; https://www.onlyoffice.com/zh/office-suite.aspxhttps://www…...

点估计和参数分布的对比

点估计&#xff08;Point Estimation&#xff09;和 参数分布&#xff08;Parameter Distribution&#xff09;是统计学中两种不同的参数估计方法。 文章目录 点估计&#xff08;Point Estimation&#xff09;参数分布&#xff08;Parameter Distribution&#xff09;对比总结 …...

桌面保存的Word文件删除怎么找回?超实用的三个方法?

在日常工作和学习中&#xff0c;我们经常会使用Word文档进行文字编辑和文件保存。但是&#xff0c;有时由于操作失误或系统故障&#xff0c;我们会不小心将存放在电脑桌面重要的Word文件删除了。导致无法挽回的损失&#xff0c;但幸运的是&#xff0c;有一些方法可以帮助我们找…...

【leetcode】双指针算法题

文章目录 1.算法思想2.移动零3.复写零方法一方法二 4.快乐数5.盛水最多的容器方法一&#xff08;暴力求解&#xff09;方法二&#xff08;左右指针&#xff09; 6.有效三角形的个数方法一&#xff08;暴力求解&#xff09;方法二&#xff08;左右指针&#xff09; 7.两数之和8.…...

vue-router 源码分析——8.重定向

这是对vue-router 3 版本的源码分析。 本次分析会按以下方法进行&#xff1a; 按官网的使用文档顺序&#xff0c;围绕着某一功能点进行分析。这样不仅能学习优秀的项目源码&#xff0c;更能加深对项目的某个功能是如何实现的理解。这个对自己的技能提升&#xff0c;甚至面试时…...

CAN总线协议

CAN总线协议&#xff0c;全程为控制器局域网&#xff08;Controller Area Network&#xff09;协议&#xff0c;是一种用于实时应用的串行通讯协议。该协议由德国某公司专门为汽车行业开发&#xff0c;并逐渐成为一种标准&#xff0c;这是国际上应用最广泛的现场总线之一。 一…...

NLP篇1

场景&#xff1a;假设给你一篇文章。 目标&#xff1a;说白了&#xff0c;就是数学的分类。但是如何实现分类呢。下面将逐步一 一 分析与拆解。先把目标定好了和整体框架定好了。而不是只见树木而不见森林。 情感分类&#xff08;好评、差评&#xff0c;中性&#xff09; 整体…...

【一念发动便是行】念头,就是命运

一个个恶念累积就是负能量&#xff0c;念头就是命运&#xff0c;克除恶念&#xff0c;防范念头&#xff0c;念头都有能量&#xff0c;学圣学须内外庄严检肃&#xff0c;言语有灵 多数人的问题都是出在念头上&#xff0c;念头&#xff0c;就是自己的命运&#xff1b; 当我们对自…...

Django + Vue 实现图片上传功能的全流程配置与详细操作指南

文章目录 前言图片上传步骤1. urls 配置2. settings 配置3. models 配置4. 安装Pillow 前言 在现代Web应用中&#xff0c;图片上传是一个常见且重要的功能。Django作为强大的Python Web框架&#xff0c;结合Vue.js这样的现代前端框架&#xff0c;能够高效地实现这一功能。本文将…...

【介绍下R-tree,什么是R-tree?】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…...

每天10个js面试题(二)

1.事件轮询&#xff1f; JavaScript 是单线程的&#xff0c;同一时间只能做一件事。所有任务都需要排队&#xff0c;前一个任务结束&#xff0c;才会执行后一个任务&#xff0c;为了保证任务有序的执行&#xff0c;事件轮询就是单线程任务调度的一种方式&#xff0c;单线程任务…...

深入理解【 String类】

目录 1、String类的重要性 2、常用方法 2、1 字符串构造 2、2 String对象的比较 2、3 字符串查找 2、4字符转换 数值和字符串转换&#xff1a; 大小写转化&#xff1a; 字符串转数组&#xff1a; 格式转化&#xff1a; 2、5 字符串替换 2、6字符串拆分 2、7 字符串…...

Nacos 2.x 系列【20】集群部署

文章目录 1. 前言2. 部署服务端2.1 准备工作2.2 集群节点配置2.3 鉴权配置2.4 配置数据源2.5 配置 IP2.6 配置端口2.7 启动集群 3. 部署模式3.1 直连模式3.2 地址服务器模式3.2.1 地址服务器3.2.2 配置 3.3 VIP 模式&#xff08;推荐&#xff09;3.3.1 Nginx3.3.1 域名 1. 前言…...

LeetCode刷题记录:(15)三角形最小路径和

知识点&#xff1a;倒叙的动态规划 题目传送 解法一&#xff1a;二维动态规划【容易理解】 class Solution {public int minimumTotal(List<List<Integer>> triangle) {int n triangle.size();if (n 1) {return triangle.get(0).get(0);}// dp[i][j]:走到第i层第…...

【大数据面试题】35 Spark 怎么做优化?

一步一个脚印,一天一道大数据面试题 博主希望能够得到大家的点赞收,藏支持!非常感谢~ 点赞,收藏是情分,不点是本分。祝你身体健康,事事顺心! Spark 如何做优化一直是面试过程中常问的问题。那么这次也仅以此篇文章总结梳理,希望对大家有帮助。 通用优化 Spark 一般遇…...

2024年保安员职业资格考试题库大数据揭秘,冲刺高分!

186.安全技术防范是一种由探测、&#xff08;&#xff09;、快速反应相结合的安全防范体系。 A.保安 B.出警 C.延迟 D.监控 答案&#xff1a;C 187.安全技术防范是以&#xff08;&#xff09;和预防犯罪为目的的一项社会公共安全业务。 A.预防灾害 B.预防损失 C.预防失…...

怎么搭建个人博客教程,附云主机选购指南

一、搭建个人博客教程 1. 规划博客内容与技术栈 确定博客主题&#xff1a;首先明确博客的定位和主题&#xff0c;这将影响后续的技术选择和内容规划。选择技术栈&#xff1a;根据个人偏好和技术背景&#xff0c;选择合适的建站技术。例如&#xff0c;可以使用WordPress&#…...

使用Llama3/Qwen2等开源大模型,部署团队私有化Code Copilot和使用教程

目前市面上有不少基于大模型的 Code Copilot 产品&#xff0c;部分产品对于个人开发者来说可免费使用&#xff0c;比如阿里的通义灵码、百度的文心快码等。这些免费的产品均通过 API 的方式提供服务&#xff0c;因此调用时均必须联网、同时需要把代码、提示词等内容作为 API 的…...