博客星球大冒险:用Spring Boot和JWT打造你的数字王国

揭秘如何在Spring Boot中无缝集成JWT,为你的应用打造一个高度可扩展且安全的认证系统。从添加依赖到创建JWT过滤器,再到实现令牌的有效性管理和刷新机制,每一步都精心设计,确保你的乐园能够迎接成千上万的游客!

文章目录

    • 构建一个基于Spring Boot的个人博客系统
      • 第一部分:搭建基础框架
      • 第二部分:文章的CRUD操作与JWT令牌验证
        • 创建文章
        • 读取文章
        • 更新文章
        • 删除文章
        • JWT令牌验证
      • 第三部分:增强安全性与JWT令牌刷新
        • 使用HTTPS
        • CORS策略配置
        • JWT令牌刷新机制
      • 第四部分:监控与维护,确保系统稳定运行
        • 系统监控
        • 数据备份
        • 用户反馈
        • 性能优化
        • 安全审计
        • 持续集成/持续部署(CI/CD)
      • 实战案例总结与未来展望
        • 实战案例总结
        • 未来展望

在这里插入图片描述

构建一个基于Spring Boot的个人博客系统

第一部分:搭建基础框架

在这个信息爆炸的时代,每个人都有自己的故事想要分享。想象一下,你是一个充满激情的博主,想要搭建一个属于自己的个人博客系统,让世界听到你的声音。而今天,我们就要用Spring Boot和JWT来实现这个梦想。

首先,我们需要搭建一个基础的Spring Boot项目。这就像是准备一块空白的画布,等待我们在上面挥洒创意。

  1. 创建项目:打开你最爱的IDE(比如IntelliJ IDEA或者Eclipse),创建一个新的Spring Boot项目。选择你需要的依赖,比如Spring WebSpring SecurityJWT

  2. 配置文件:在src/main/resources目录下,创建你的application.properties文件,配置数据库连接、服务器端口等信息。

    server.port=8080
    spring.datasource.url=jdbc:mysql://localhost:3306/your_blog_db
    spring.datasource.username=root
    spring.datasource.password=yourpassword
    jwt.secret=your_jwt_secret_key
    
  3. 数据库设计:设计一个简单的数据库,至少包含用户表和博客文章表。用户表存储用户的基本信息,博客文章表存储文章内容。

  4. 实体类:创建对应的实体类(Entity),比如UserPost

    @Entity
    public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String username;
        private String password;
        // getters and setters
    }
    
    @Entity
    public class Post {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String title;
        private String content;
        @ManyToOne
        private User author;
        // getters and setters
    }
    
  5. 仓库接口:创建Spring Data JPA的仓库接口,用于数据访问。

    public interface UserRepository extends JpaRepository<User, Long> {
        Optional<User> findByUsername(String username);
    }
    
    public interface PostRepository extends JpaRepository<Post, Long> {
        List<Post> findByAuthorId(Long authorId);
    }
    
  6. 安全配置:配置Spring Security,启用JWT认证。

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        // 省略部分代码...
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                // 配置省略...
                .csrf().disable(); // 禁用CSRF,因为JWT是无状态的
        }
    }
    
  7. 用户服务:创建用户服务,用于处理用户注册、登录等业务逻辑。

    @Service
    public class UserService {
        @Autowired
        private UserRepository userRepository;
        @Autowired
        private PasswordEncoder passwordEncoder;
    
        public User registerUser(User user) {
            user.setPassword(passwordEncoder.encode(user.getPassword()));
            return userRepository.save(user);
        }
    
        public String login(String username, String password) {
            User user = userRepository.findByUsername(username)
                .orElseThrow(() -> new RuntimeException("User not found"));
            if (passwordEncoder.matches(password, user.getPassword())) {
                return Jwts.builder()
                    .setSubject(user.getUsername())
                    .signWith(SignatureAlgorithm.HS256, "your_jwt_secret_key".getBytes())
                    .compact();
            }
            throw new RuntimeException("Invalid username or password");
        }
    }
    
  8. 控制器:创建控制器,提供API接口。

    @RestController
    @RequestMapping("/api")
    public class UserController {
        @Autowired
        private UserService userService;
    
        @PostMapping("/register")
        public ResponseEntity<?> register(@RequestBody User user) {
            User registeredUser = userService.registerUser(user);
            return ResponseEntity.ok(registeredUser);
        }
    
        @PostMapping("/login")
        public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) {
            String token = userService.login(loginRequest.getUsername(), loginRequest.getPassword());
            return ResponseEntity.ok(new AuthenticationResponse(token));
        }
    }
    

现在,我们已经搭建了一个基本的个人博客系统的框架。在下一部分,我们将实现文章的创建、查询、更新和删除功能,同时加入JWT令牌的验证,确保只有登录用户才能操作自己的文章。敬请期待,我们的个人博客系统即将变得更加完善和安全!

第二部分:文章的CRUD操作与JWT令牌验证

随着我们的个人博客系统的基础框架搭建完成,现在我们要进入更加激动人心的部分——实现文章的CRUD(创建、读取、更新、删除)操作,并确保通过JWT令牌验证来保护这些操作的安全。

创建文章

首先,我们需要允许用户创建文章。这就像是在乐园中添加新的游乐设施,让游客们有更多新鲜事物可以体验。

  1. 文章控制器:在控制器中添加创建文章的接口。

    @RestController
    @RequestMapping("/api/posts")
    public class PostController {
        @Autowired
        private PostService postService;
    
        @PostMapping("/")
        public ResponseEntity<?> createPost(@RequestBody Post post, @AuthenticationPrincipal User currentUser) {
            if (post.getAuthor().getId().equals(currentUser.getId())) {
                Post createdPost = postService.createPost(post);
                return ResponseEntity.ok(createdPost);
            }
            return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
        }
    }
    
  2. 文章服务:在服务层实现创建文章的逻辑。

    @Service
    public class PostService {
        @Autowired
        private PostRepository postRepository;
    
        public Post createPost(Post post) {
            return postRepository.save(post);
        }
        // 其他服务方法...
    }
    
读取文章

接下来,我们需要允许用户读取文章。这就像是在乐园中设置指示牌,让游客们知道每个游乐设施的位置和介绍。

  1. 读取单篇文章:允许用户通过文章ID来读取单篇文章。

    @GetMapping("/{id}")
    public ResponseEntity<?> getPostById(@PathVariable Long id) {
        Optional<Post> post = postRepository.findById(id);
        if (post.isPresent()) {
            return ResponseEntity.ok(post.get());
        }
        return ResponseEntity.notFound().build();
    }
    
  2. 读取用户所有文章:允许用户读取自己所有的文章。

    @GetMapping("/user/{userId}")
    public ResponseEntity<?> getPostsByUser(@PathVariable Long userId, @AuthenticationPrincipal User currentUser) {
        if (currentUser.getId().equals(userId)) {
            List<Post> posts = postService.getPostsByUser(userId);
            return ResponseEntity.ok(posts);
        }
        return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
    }
    
更新文章

更新文章就像是给游乐设施进行维护和升级,确保它们始终保持最佳状态。

  1. 更新文章接口:在控制器中添加更新文章的接口。

    @PutMapping("/{id}")
    public ResponseEntity<?> updatePost(@PathVariable Long id, @RequestBody Post postDetails, @AuthenticationPrincipal User currentUser) {
        Optional<Post> post = postRepository.findById(id);
        if (post.isPresent() && post.get().getAuthor().getId().equals(currentUser.getId())) {
            post.get().setTitle(postDetails.getTitle());
            post.get().setContent(postDetails.getContent());
            Post updatedPost = postRepository.save(post.get());
            return ResponseEntity.ok(updatedPost);
        }
        return ResponseEntity.notFound().build();
    }
    
删除文章

最后,我们需要允许用户删除文章。这就像是在乐园中拆除老旧的设施,为新的创意腾出空间。

  1. 删除文章接口:在控制器中添加删除文章的接口。

    @DeleteMapping("/{id}")
    public ResponseEntity<?> deletePost(@PathVariable Long id, @AuthenticationPrincipal User currentUser) {
        Optional<Post> post = postRepository.findById(id);
        if (post.isPresent() && post.get().getAuthor().getId().equals(currentUser.getId())) {
            postRepository.delete(post.get());
            return ResponseEntity.ok().build();
        }
        return ResponseEntity.notFound().build();
    }
    
JWT令牌验证

为了确保用户只能操作自己的文章,我们在每个需要认证的请求处理方法中,通过@AuthenticationPrincipal注解注入了当前认证的用户信息。然后,我们检查当前用户是否是文章的所有者。

通过这种方式,我们不仅实现了文章的CRUD操作,还确保了操作的安全性,防止了未授权的访问。

在本实战案例的下一部分,我们将深入探讨如何进一步增强我们的博客系统的安全性,包括使用HTTPS、配置CORS策略以及实现JWT的刷新机制等。敬请期待,让我们的博客系统更加坚不可摧!
在这里插入图片描述

第三部分:增强安全性与JWT令牌刷新

随着我们个人博客系统的CRUD功能实现,现在是时候加强系统的安全性,确保我们的数据和用户信息安全无虞。在这部分,我们将通过几个关键步骤来提升我们系统的安全等级。

使用HTTPS

首先,我们需要确保所有的数据传输都是加密的。这就像是给我们的乐园加上了一层隐形的防护罩,保护游客的安全。

  1. 获取SSL证书:你可以从证书颁发机构(CA)获取免费的SSL证书,或者如果你的服务器支持,也可以自签名一个证书。

  2. 配置HTTPS:在Spring Boot应用中配置HTTPS,通常涉及到配置server.ssl.key-store和相关的密钥密码。

    server.port=8443
    server.ssl.key-store=classpath:your.keystore
    server.ssl.key-store-password=your_keystore_password
    server.ssl.keyStoreType=PKCS12
    server.ssl.keyAlias=your_keyalias
    
  3. 强制重定向:在应用中强制所有HTTP请求重定向到HTTPS。

    @Configuration
    public class HttpsRedirectConfig {
        @Bean
        public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
            return http
                .requiresChannel()
                .anyRequest().requiresSecure()
                .and()
                .build();
        }
    }
    
CORS策略配置

跨源资源共享(CORS)是一个重要的安全机制,可以防止恶意网站访问我们的资源。我们需要合理配置CORS策略。

  1. CORS配置:在Spring Security配置中添加CORS策略。

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .cors().configurationSource(request -> {
                CorsConfiguration config = new CorsConfiguration();
                config.setAllowedOrigins(Collections.singletonList("https://your-client-domain.com"));
                config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));
                return config;
            })
            .and()
            // 其他配置...
    }
    
JWT令牌刷新机制

JWT令牌通常有一个过期时间,所以我们需要一个机制来刷新令牌,而不是让用户重新登录。

  1. 刷新令牌(Refresh Token):当用户登录时,除了访问令牌外,我们还发放一个具有更长有效期的刷新令牌。

    public class AuthenticationResponse {
        private String accessToken;
        private String refreshToken;
    
        // 构造函数、getter和setter
    }
    
  2. 刷新令牌存储:刷新令牌需要被安全地存储在服务端,通常可以使用Redis等内存数据库。

  3. 刷新接口:创建一个接口,允许用户使用刷新令牌来获取新的访问令牌。

    @PostMapping("/refresh")
    public ResponseEntity<?> refreshAuthenticationToken(@RequestBody RefreshTokenRequest request) {
        String refreshToken = request.getRefreshToken();
        // 验证刷新令牌的有效性,如果有效,生成新的访问令牌
        // ...
    }
    
  4. 自动刷新令牌:在客户端,我们可以编写逻辑来自动检测令牌过期,并使用刷新令牌来获取新的访问令牌。

    // 假设我们有一个函数来检查令牌是否过期
    function isTokenExpired(token) {
        // 实现检查逻辑
    }
    
    // 刷新令牌的函数
    async function refreshToken() {
        const response = await fetch('/api/refresh', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({ refreshToken: localStorage.refreshToken })
        });
        const data = await response.json();
        localStorage.setItem('accessToken', data.accessToken);
        // 更新访问令牌并重试请求
    }
    
    // 在发送请求前检查令牌
    if (isTokenExpired(localStorage.accessToken)) {
        refreshToken().catch(error => console.error('Refresh token failed', error));
    }
    

通过这些步骤,我们不仅增强了个人博客系统的安全性,还提升了用户体验,让用户能够无缝地继续他们的活动,即使在令牌过期后也能平滑过渡。

接下来,我们将探讨如何监控和维护我们的系统,确保它始终运行在最佳状态。敬请期待,让我们的个人博客系统成为乐园中最闪亮的星!

第四部分:监控与维护,确保系统稳定运行

随着我们的个人博客系统功能日益完善,安全性得到加强,现在是时候关注系统的监控与维护了。这就像是乐园的日常运营,需要确保一切运转顺畅,给游客提供最好的体验。

系统监控

监控是确保系统稳定运行的关键。我们需要监控服务器性能、应用状态以及用户活动。

  1. 服务器监控:使用工具如Nagios、Zabbix或云服务提供商的监控工具来监控CPU、内存、磁盘和网络状态。

  2. 应用性能监控(APM):利用New Relic、Datadog或Spring Boot Actuator等工具来监控应用性能,包括响应时间、错误率等。

  3. 日志管理:配置日志管理系统,如ELK Stack(Elasticsearch, Logstash, Kibana)或Graylog,来收集、搜索和分析日志。

    logging.file.name=logs/myblog.log
    logging.level.root=WARN
    logging.level.com.example.myblog=DEBUG
    
  4. 健康检查:实现健康检查端点,用于实时监控应用状态。

    @GetMapping("/actuator/health")
    public Map<String, Object> healthCheck() {
        // 实现健康检查逻辑
    }
    
数据备份

数据是任何系统最宝贵的资产,因此定期备份至关重要。

  1. 定期备份:设置定期备份计划,备份数据库和重要文件。

  2. 灾难恢复计划:制定灾难恢复计划,确保在发生严重故障时能够快速恢复服务。

用户反馈

用户的反馈是改进系统的重要途径。

  1. 收集用户反馈:提供一个渠道,让用户可以报告问题或提出改进建议。

  2. 用户行为分析:分析用户行为数据,了解用户如何使用你的应用,并发现潜在的改进点。

性能优化

随着用户量的增加,性能优化变得尤为重要。

  1. 代码优化:定期审查和优化代码,减少不必要的计算和资源消耗。

  2. 数据库优化:优化数据库查询,使用索引,定期清理和维护数据库。

  3. 缓存策略:使用缓存来减少数据库访问次数,提高响应速度。

    @Cacheable("posts")
    public Post getPostById(Long id) {
        // 数据库查询逻辑
    }
    
安全审计

定期进行安全审计,确保没有安全漏洞。

  1. 代码审计:定期进行代码审计,查找潜在的安全漏洞。

  2. 依赖审计:使用工具如OWASP Dependency-Check来检查项目依赖中的已知漏洞。

  3. 安全测试:定期进行渗透测试和安全扫描,确保系统安全。

持续集成/持续部署(CI/CD)

自动化的CI/CD流程可以确保代码质量,并快速部署新功能和修复。

  1. 自动化测试:编写单元测试和集成测试,确保代码更改不会引入新的错误。

  2. 构建自动化:使用Jenkins、GitLab CI或GitHub Actions等工具自动化构建过程。

  3. 自动化部署:自动化部署流程,确保新版本可以平滑上线。

通过这些监控与维护措施,我们的个人博客系统将能够稳定运行,为用户提供持续的服务。这不仅能够提升用户满意度,还能确保我们能够及时发现并解决问题,保持系统的长期健康。

随着本实战案例的结束,我们希望读者能够从中获得宝贵的知识和经验,构建出自己的安全、稳定、高效的个人博客系统。记住,技术之路永无止境,持续学习、实践和改进,你的乐园将越来越精彩!
在这里插入图片描述

实战案例总结与未来展望

在本系列的实战案例中,我们从零开始,一步步构建了一个基于Spring Boot和JWT的个人博客系统。我们不仅实现了基本的CRUD功能,还加强了系统的安全性,实现了用户认证和授权,并通过HTTPS、CORS策略和JWT刷新机制来保护用户数据。此外,我们还探讨了如何对系统进行监控和维护,以及如何通过社区建设和开源协作来促进项目的持续发展。

实战案例总结
  1. 基础框架搭建:我们创建了用户和文章的实体类,配置了数据库,并实现了基本的Spring Security认证流程。

  2. CRUD功能实现:我们为博客文章提供了完整的创建、读取、更新和删除功能,并通过@AuthenticationPrincipal注解确保了操作的安全性。

  3. 安全性加强:通过实现HTTPS、CORS策略和JWT刷新机制,我们加强了系统的安全性,保护了用户数据和隐私。

  4. 监控与维护:我们讨论了如何对系统进行监控,包括服务器性能、应用状态和用户活动,并强调了数据备份和灾难恢复计划的重要性。

  5. 社区贡献与持续发展:我们探讨了如何通过社区建设、开源协作、持续学习、用户支持和国际化来促进项目的持续发展和创新。

未来展望

随着技术的不断进步和用户需求的不断变化,我们的个人博客系统也需要不断地演进和改进。以下是一些可能的未来发展方向:

  1. 人工智能集成:利用机器学习算法来分析用户行为,提供个性化的内容推荐。

  2. 移动应用开发:开发移动应用版本,让用户能够随时随地撰写和阅读博客。

  3. 社交功能增强:增加社交互动功能,如评论、点赞和分享,以提高用户参与度。

  4. 多云和微服务架构:随着用户量的增长,考虑采用多云策略和微服务架构来提高系统的可扩展性和可用性。

  5. 区块链技术应用:探索区块链技术在内容版权保护和用户身份验证方面的应用。

  6. 增强现实(AR)和虚拟现实(VR):利用AR和VR技术为用户提供沉浸式的内容体验。

  7. 国际化和本地化:进一步扩展多语言支持,为全球用户提供本地化的用户体验。

  8. 环境友好和可持续性:优化系统架构,减少能源消耗,致力于构建环境友好的绿色应用。

通过这些未来展望,我们可以看到个人博客系统的潜力和可能性是无限的。随着技术的不断发展,我们有理由相信,我们的系统将变得更加智能、互动和全球化。

在此,我们的实战案例告一段落。希望大伙们能够从本系列中获得启发,不仅在技术上有所提升,更在思维和视野上得到拓展。记住,每一次代码的编写,都是我们构建未来世界的一小步。让我们携手前进,共同创造一个更加美好的数字世界。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AltiumDesigner/AD添加数据库连接

1.首先确保本机电脑有无对应的数据库驱动&#xff0c;例如我这边要添加MySQL的数据&#xff0c;则需要首先下载MySQL数据驱动&#xff1a;MySQL :: Download MySQL Connector/ODBC (Archived Versions) 2.运行“odbcad32.exe”&#xff0c;如下图添加对应的数据库配置&#xf…

基于深度学习的模糊认知图方法

1 文章信息 文章题目为“Deep Fuzzy Cognitive Maps for Interpretable Multivariate Time Series Prediction”&#xff0c;该文于2019年发表于“IEEE TRANSACTIONS ON FUZZY SYSTEMS”。文章提出了深度模糊认知图&#xff08;FCM&#xff09;用于多变量时间序列预测&#xff…

一个良好的嵌入式系统框架(基于FreeRTOS)

目录 Unix操作系统里的优先级嵌入式系统里的优先级 Unix操作系统里的优先级 在《Unix传奇》中有这样一句话&#xff0c;用户态的进程/线程是三等公民、root线程是二等公民、硬件中断是一等公民。 在操作系统中&#xff0c;"用户态"和"内核态"是两种不同的…

BERT模型学习(1)

BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;由谷歌在2018年推出&#xff0c;迅速成为自然语言处理&#xff08;NLP&#xff09;领域的一个突破性成果。 基本概念 在深入了解BERT之前&#xff0c;需要先简单了解一下自然语言处理&a…

五分钟“手撕”链表

为了提高大家的学习效率&#xff0c;我把代码放开头&#xff0c;供查阅。 目录 一、链表的实现代码 二、什么是链表 三、链表的分类 四、链表的常见操作 插入 删除 五、Java自带的LinkedList 两个构造方法 一些常用方法 六、LinkedList的遍历 七、ArrayList和Linke…

达梦数据库写文件的方式探索

0x01 前沿 这篇文章整体算是《达梦数据库手工注入笔记》的续集&#xff0c;达梦作为国内优秀的信创数据库&#xff0c;在关基单位中拥有越来越大的用户使用量。 通过SQL注入来写文件一直以来都是SQL注入漏洞深入利用的一种方式&#xff0c;对于不同的数据库通常写文件的方式也是…

探索无限可能性——微软 Visio 2021 改变您的思维方式

在当今信息化时代&#xff0c;信息流动和数据处理已经成为各行各业的关键。微软 Visio 2021 作为领先的流程图和图表软件&#xff0c;帮助用户以直观、动态的方式呈现信息和数据&#xff0c;从而提高工作效率&#xff0c;优化业务流程。本文将介绍 Visio 2021 的特色功能及其在…

【管理咨询宝藏119】翰威特组织架构设计优化方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏119】翰威特组织架构设计优化方案 【格式】PDF版本 【关键词】人力资源、组织设计、组织架构 【核心观点】 - 城镇化建设和居民可支配收入的增长…

Python实现定时任务的方式

大家好&#xff0c;在当今数字化的时代&#xff0c;定时任务的需求在各种应用场景中频繁出现。无论是数据的定时更新、周期性的任务执行&#xff0c;还是特定时间点的操作触发&#xff0c;Python 都为我们提供了强大而灵活的手段来实现这些定时任务。当我们深入探索 Python 的世…

代理 模式

一、什么是代理模式 代理模式指代理控制对其他对象的访问&#xff0c;也就是代理对象控制对原对象的引⽤。在某些情况下&#xff0c;⼀个对象不适合或者不能直接被引⽤访问&#xff0c;⽽代理对象可以在客⼾端和⽬标对象之间起到中介的作⽤。 二、为什么使用代理模式 模式作…

MySQL各种锁

目录 1. 从粒度上区分锁 1.1 全局锁&#xff08;第一粒度&#xff09; 1.2 表级锁&#xff08;第二粒度&#xff09; 1.3 行锁&#xff08;第三最小粒度&#xff09; 2 从模式上区分锁 2.1 什么是乐观锁 2.2 什么是悲观锁 2.3 意向共享锁和意向排他锁 2.4 临键锁和记录…

【Python】 深入理解Python中的UnicodeDecodeError及其解决方案

基本原理 在Python编程中&#xff0c;我们经常需要处理各种类型的数据&#xff0c;尤其是文本数据。文本数据在计算机中通常以字节的形式存在&#xff0c;而字节需要被解码成我们能够理解的字符。这个过程涉及到编码和解码的概念。 编码是将字符转换为字节的过程&#xff0c;…

23 vue3面试重难点复习:响应式原理、特点、8大生命钩子、data数据定义、组件、全家桶

vue作为用的最为广泛的当前热门框架&#xff0c;总结如下重难点核心知识&#xff1a; 1.vue特点是什么&#xff1f; 1.1优点 渐进式 vue本身只提供数据响应式&#xff0c;需要全局缓存用 vuex&#xff0c;需要路由用 vue-router 组件化 封装组件&#xff0c;利于复用 响应式数…

k8s——Pod进阶(资源限制和探针)

一、资源限制 1.1 资源限制的定义 当定义Pod时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是CPU和内存大小&#xff0c;以及其他类型的资源。 当为Pod中的容器指定了request资源时&#xff0c;调度器就使用该信息来决定将Pod调度到哪个节点上。当还为容器…

汇凯金业:量化交易有风险吗

量化交易是一种通过复杂的数学模型和算法在金融市场中进行高频和自动化交易的方式。尽管量化交易在提高市场效率、减少人为错误等方面具有诸多优点&#xff0c;但它也同样存在着不少风险。以下列举了一些主要的风险因素&#xff1a; 1. 模型风险 模型缺陷&#xff1a;量化交易…

网络协议。

一、流程案例 接下来揭秘我要说的大事情&#xff0c;“双十一”。这和我们要讲的网络协议有什么关系呢&#xff1f; 在经济学领域&#xff0c;有个伦纳德里德&#xff08;Leonard E. Read&#xff09;创作的《铅笔的故事》。这个故事通过一个铅笔的诞生过程&#xff0c;来讲述…

数据安全之翼:天空卫士在汽车数据安全领域的卓越领航

近期&#xff0c;中国汽车网络安全与数据安全产业的积极倡导者谈思实验室发布首份《汽车网络与数据安全行业全景图》&#xff0c;天空卫士入选&#xff0c;并且位列榜首。 天空卫士在汽车数据安全领域有丰富的实践经验&#xff0c;曾为多家汽车行业用户提供数据安全产品与服务&…

LeetCode - 贪心(Greedy)算法集合(Python)[分配问题|区间问题]

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/139242199 贪心算法&#xff0c;是在每一步选择中&#xff0c;都采取当前状态下&#xff0c;最好或最优&#xff08;即最有利&#xff09;的选择&…

不同linux账户切换不同的cuda版本

原因 由于服务器中安装了两个版本的cuda&#xff08;cuda10.1和cuda11.1&#xff09;&#xff0c;不同项目可能需要应用不同的cuda版本&#xff0c;但是自己又没有root权限或者只想在使用指定conda环境时改为用指定的cuda版本。总结起来有三种方法&#xff1a; 1、修改软链接指…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-24.1,2 SPI驱动实验-SPI协议介绍

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…