Fei

非淡泊无以明志,非宁静无以致远

Spring

Demo代码

1 概述

Spring是一款主流的Java EE轻量级开源框架

  • 广义的Spring
    泛指以Spring Framework为核心的Spring技术栈, 如: Spring Framework, Spring MVC, SpringBoot, SpringCloud, SpringData, Spring Security, 其中Spring Framework是其他子项目的基础.

  • 狭义的Spring
    特指Spring Framework, 通常称为Spring框架. Spring框架是一个分层的、面向切面的java应用程序的一站式轻量级解决方案, 它是Spring技术栈的核心和基础, 是为了解决企业级应用开发的复杂性而创建的.
    Spring有两个核心模块, IoC和AOP.
    IoC: Inverse of Control: 控制反转, 指把创建对象的过程交给Spring进行管理
    AOP: Aspect Oriented Programing: 面向切面编程. AOP用来封装多个类的公共行为, 将那些与业务无关, 却为业务模块所共同调用的逻辑封装起来, 减少系统的重复代码, 降低模块间的耦合度. 另外, AOP还解决了一些系统层面的问题, 比如日志、事务、权限等.

1.1 Spring Framework特点

  • 非侵入式: 使用Spring Framework开发应用时, Spring对应用程序本身的结构影响非常小, 对领域模型可以做到零污染; 对功能性组件也只需要使用几个简单的注解进行标记, 完全不会破坏原有结构, 反而能将组件结构进一步简化. 这就让Spring Frame开发应用程序时结构清晰, 简洁优雅.
  • 控制反转: 框架创建对象
  • 面向切面: 在不修改源代码的基础上增强代码功能
  • 容器: Spring IoC是一个容器, 包含并管理组件对象的生命周期
  • 组件化: Spring实现了使用简单的组件配置组合成一个复杂的应用, 在Spring中可以使用xml和注解组合这些对象
  • 一站式: 可以整合各种开源框架

1.2 Spring模块组成

image-20251123091800267

1. 简单

1.1 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]


提示:

2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案


进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// O(n^2)
//按照距离寻找
//相邻, 间隔一位, 间隔二位, 间隔三位....
//01, 12,23,34,45,56....
//02, 13, 24, 35....
class Solution {
public int[] twoSum(int[] nums, int target) {
for(int i = 1; i < nums.length; i++){
for(int j = i; j < nums.length; j++){
if(nums[j-i] + nums[j] == target){
return new int[]{j-i, j};
}
}
}
return new int[]{0,0};
}
}


//哈希表
//注意到方法一的时间复杂度较高的原因是寻找 target - x 的时间复杂度过高。因此,我们需要一种更优秀的方法,能够快速寻找数组中是否存在目标元素。如果存在,我们需要找出它的索引。
// 使用哈希表,可以将寻找 target - x 的时间复杂度降低到从 O(N) 降低到 O(1)。
// 这样我们创建一个哈希表,对于每一个 x,我们首先查询哈希表中是否存在 target - x,然后将 x 插入到哈希表中,即可保证不会让 x 和自己匹配。
// 时间复杂度:O(N),其中 N 是数组中的元素数量。对于每一个元素 x,我们可以 O(1) 地寻找 target - x。
// 空间复杂度:O(N),其中 N 是数组中的元素数量。主要为哈希表的开销。

class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i]; // 寻找 target - x
if (map.containsKey(complement)) { // 如果存在,返回索引
return new int[] { map.get(complement), i };
}
map.put(nums[i], i); // 将 x 插入哈希表
}
throw new IllegalArgumentException("No two sum solution");
}
}

1.2 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

今天哥们又接到一个文件处理的开发需求,要实现一个文件上传、下载的通用服务。为了快速满足这一需求,我使用了SpringBoot + 华为云OBS快速写了一个小小的程序。

项目结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
src
└── main
├── java
│   └── com
│   └── xmbc
│   └── file
│   ├── XmbcFileApplication.java # 启动类
│   ├── config
│   │   ├── HuaweiObsConfig.java # 华为云OBS的配置 (1)
│   │   └── ResourcesConfig.java
│   ├── controller
│   │   ├── HuaweiObsFileController.java # 文件上传下载的Controller (4)
│   │   └── SysFileController.java
│   ├── service
│   │   ├── ISysFileService.java # 文件处理的接口 (2)
│   │   └── impl
│   │   ├── FastDfsSysFileServiceImpl.java
│   │   ├── HuaweiObsSysFileServiceImpl.java # 华为云OBS的实现 (3)
│   │   └── LocalSysFileServiceImpl.java
│   └── utils
│   └── FileUploadUtils.java
└── resources
├── application-dev.yaml # 若依的框架原配置,没啥用,当个备份吧
├── application-local.yaml # 本地配置
├── banner.txt # 默认的logo
├── bootstrap.yaml # 启动类
└── logback.xml # 日志配置
12 directories, 15 files

好吧,大佬一看就知道这是使用了某个开源的框架,本文使用了若依的框架(对应ruoyi-file)。因为本文作者是个程序菜鸟,为了快速满足开发组长的需求,所以使用起来比较粗糙。

首先,看看我做了什么好事。在bootstrap.yamlapplication-local.yaml中配置好参数,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# bootstrap.yaml
spring:
profiles:
active: local

# application-local.yaml

server:
port: 9300
spring:
profiles:
activate:
on-profile: local
application:
name: xmbc-file
cloud:
nacos:
discovery:
enabled: false # 禁用nacos
obs:
huawei:
bucketName: test-xcmg-app-fileprocessing # 华为云OBS的bucket名称
endPoint: https://obs.cn-east-3.myhuaweicloud.com # 华为云OBS的endpoint

file: # 先随便乱写的,为了保证config可以读取,这里随便写一个。后续有需要再修改
path: "/"
prefix: "xmbc_file"
domain: "local.xmbc.com"

启动配置完成之后,我们就根据我上文的目录结构后注释的编号来看看对应的代码:

(1) HuaweiObsConfig.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package com.xmbc.file.config;

import com.obs.services.ObsClient;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
* Minio 配置信息
*
* @author xmbc
*/
@Configuration
@ConfigurationProperties(prefix = "obs")
@Data
public class HuaweiObsConfig
{
/**
* endpoint填写桶所在的endpoint
*/

@Value("${obs.huawei.endPoint}")
String endPoint;



/**
* 华为云Access Key
*/
private String accessKey = System.getenv("HUAWEICLOUD_SDK_AK");

/**
* 华为云Secret Key
*/
private String secretKey = System.getenv("HUAWEICLOUD_SDK_SK");

/**
* 存储桶名称
*/
@Value("${obs.huawei.bucketName}")
private String bucketName;


/**
* 创建ObsClient实例
* 使用永久AK/SK初始化客户端
*/
@Bean
public ObsClient getHuaweiObsClient()
{
return new ObsClient(accessKey, secretKey,endPoint);
}
}

1. 目的

说到目的,我现在学习技术的目的已经不再单纯的是因为着迷于技术本身,而是为了生活,过去两年的职业生活,让我逐渐意识到经济基础才能决定上层建筑。我的想法很丰富,想去遨游世界,想当老板,想成为一个技术大佬,想做个歌手… 而这些都好遥远啊,现在的我只能作为一个小小的打杂人员游离于这个社会之中,没有稳定的社交圈,没有自己的稳定居所,只有一份不上不下的工作维持这糟糕的生活。但是我不想这样下去,我想去成都找一份工作,能支撑我有一间自己的稳定居所,有自己的社交圈,不用现在每天提心吊胆,担心裁员,被孤独和焦虑折磨。 所以,所以这一次我重新安排自己的技术学习路线就是为了自己未来有一份稳定可观的工作,最好是在成都,这是我的目标,现在就这么确定好了。我会努力的!加油!

2. 技术学习路线

参考课程:
1.尚硅谷课程

按照自研项目的顺序进行学习。这个顺序也是一般应用部署的工作流程,所以对于记忆也更方便。

  • 自研项目:

    1. 基础设施: Linux
    2. 运行环境: Kubernetes, Docker
    3. 后端:
      1. SpringBoot, SpringCloud
      2. Flowable
      3. PostgreSQL or MySQL
    4. 前端:
      1. Vue
      2. Vue Element Admin
    5. 中间件: RabbitMQ, Nacos, Zookeeper, ElasticSearch, Nginx, Redis
  • 操作系统

    1. Linux – 巩固
  • 语言:

    1. Java – 巩固
    2. Python – 保持
    3. Go – 有时间去学习
  • 数据库:

    1. postgresql – 有时间去学习
    2. mysql – 巩固
    3. redis – 必学
  • 云原生:

    1. Kubernetes – 必学
    2. Docker – 巩固
  • 前后端框架:

    1. SpringBoot – 巩固
    2. SpringCloud – 专业学习
    3. Vue – 专业学习
  • 中间件:

    1. RabbitMQ – 必学
    2. Nacos – 必学
    3. Zookeeper – 必学
    4. ElasticSearch – 必学
    5. Nginx – 必学
    6. Redis – 必学
  • 开源项目:
    前端: Vue Element Admin – 必学
    后端: Flowable – 必学

3. 心路历程

2024-09-06: 又一次准备开始,这一次没有以前的那种强烈的斗志,不知道能坚持到什么时候,但是我必须得这么做,为了自己能在一两年内转到成都找一份收入可观的工作,我要努力💪。加油吧!!

Introduction

虽然“容器是Linux”,但Podman也可以在Mac和Windows上运行,它提供了一个原生的Podman CLI,并嵌入了一个客户Linux系统来启动您的容器。此访客被称为Podman机器,并使用Podman机器命令进行管理。Mac和Windows上的Podman还监听Docker API客户端,支持直接使用基于Docker的工具和从您选择的语言进行编程访问。

容器仓库

配置镜像仓库
打开配置文件 /var/home/core/.config/containers/registries.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
unqualified-search-registries = ["docker.io", "quay.io", "docker.m.daocloud.io"]

[[registry]]
prefix = "docker.io"
location = "registry-1.docker.io"

[[registry.mirror]]
location = "mirror.baidubce.com"

[[registry]]
prefix = "quay.io"
location = "quay.io"

[[registry.mirror]]
location = "quay-mirror.qiniu.com"

[[registry]]
prefix = "docker.m.daocloud.io"
location = "docker.m.daocloud.io"
## [[registry]]
## prefix = "example.com/foo"
## insecure = false
## blocked = false
## location = "internal-registry-for-example.com/bar"

底层原理

Podman和Docker都可以直接在Linux上运行,但是如果是在Windows或者MacOS上,需要创建一个linux的虚拟机,让Docker和Podman在虚拟机中运行。Docker的方式是通过Docker Desktop来创建Linux虚拟机,而Podman则是需要手动podman machine init来创建Linux虚拟机。

Podman和Docker区别

alt text

一、基础篇

1.1 Linux入门

linux 官网: www.kernel.org

网站扫描: https://sitereport.netcraft.com

  • Linux和Unix关系
    • Uninx
      • BSD
        • FreeBSD
      • Sun Solaris
      • IBM AIX
      • AT&T System V
      • Minix
        • GUN/Linux内核
          • Ubuntu
          • RedHat
            • centOS
            • RedhatOS
          • SUSE
          • Fedora

1.2 vm和Linux安装

使用相应工具安装linux虚拟机, 本文使用multipass安装虚拟机
安装multipass brew install multipass

虚拟机网络连接模式介绍

  • 桥接模式: 虚拟机会获得一个与主机网络相同网段的IP地址,与主机、同网段的其他设备以及外网设备进行通信. 桥接模式将虚拟机直接连接到物理网络,虚拟机像是主机网络中的一台真实设备, 适合需要与外网和局域网中的其他设备自由通信的虚拟机,常用于企业网络、开发测试等。可能会引起ip冲突.
  • NAT模式: 虚拟机被分配一个虚拟的私有IP地址,外部网络无法直接访问该虚拟机。虚拟机通过主机的NAT转发来访问外网,主机充当网关角色。虚拟机只能通过主机访问外网,不能直接访问局域网中的其他设备。不会引起ip冲突
  • 仅主机模式:仅主机模式为虚拟机和主机之间创建一个完全隔离的网络环境,虚拟机不能直接访问外网。虚拟机和主机通过一个专用的虚拟网络接口互相通信,但不会与外部网络相连。不能访问外网,也不能与局域网中的其他设备通信。

Rancher 是一个 Kubernetes 管理工具,让你能在任何地方任何提供商上部署和运行集群。

Rancher 可以创建来自 Kubernetes 托管服务提供商的集群,创建节点并安装 Kubernetes,或者导入在任何地方运行的现有 Kubernetes 集群。

Rancher 基于 Kubernetes 添加了新的功能,包括统一所有集群的身份验证和 RBAC,让系统管理员从一个位置控制全部集群的访问。
此外,Rancher 可以为集群和资源提供更精细的监控和告警,将日志发送到外部提供商,并通过应用商店(Application Catalog)直接集成 Helm。如果你拥有外部 CI/CD 系统,你可以将其与 Rancher 对接。没有的话,你也可以使用 Rancher 提供的 Fleet 自动部署和升级工作负载。

Rancher 是一个 全栈式 的 Kubernetes 容器管理平台,为你提供在任何地方都能成功运行 Kubernetes 的工具。

1. 概述

Rancher 为 DevOps 工程师提供简单直接的用户界面,以管理其应用负载。用户不需要对 Kubernetes 有非常深入的了解,即可使用 Rancher。Rancher 应用商店包含一套实用的 DevOps 开发工具。Rancher 获得了多种云原生生态系统产品的认证,包括安全工具、监控系统、容器镜像仓库、存储和网络驱动等。

下图讲述了 Rancher 在 IT 管理团队和 DevOps 开发团队之间扮演的角色。DevOps 团队把他们的应用部署在他们选择的公有云或私有云上。IT 管理员负责查看并管理用户、集群、云服务的权限。

1.1 Rancher 架构

1.1.1 Rancher Server 和 Components