官方服务API对接

登录注册系统

Tip

登录看似简单实则学问很大,不仅仅是自己设计个简单的数据库表来完成账号注册和登录就完事了,还可以延伸到权限认证(动态路由)、登录续期、设备ip限制、三方登录对接、单点登录等问题

目前基本上都是基于OAuth2协议,流程基本一样,小而美的开源SDK,集成了市面上基本所有的第三方授权登录:

有些三方登录的申请和授权会比较麻烦,可以直接参考justauth官方文档:JustAuth
可以尝试免签方案:水滴聚合登录官网 - QQ\微信\Google免签约快捷登录API接口 (uniqueker.top)

权限校验则有:轻量的Sa-Token,复杂的SpringSecurity

支付对接

支付宝:在众多支付手段中支付宝应该算是比较友好的了,因为他提供有支付沙盒环境,调试好后直接更换接口就可以直接搞掂了。参考:SpringBoot 集成支付宝支付,看这篇就够了 (qq.com)

微信支付:参见上方WxJava

团队工作流

搭建私服

Git版本控制:

GitLab社区版默认启动核心数+1,会占用大量内存
编辑gitlab配置文件/etc/gitlab/gitlab.rb,取消注释修改以下

unicorn['worker_processes'] = 2

保存退出执行gitlab-ctl reconfigure使其生效
注意:此值最小值是2,如果设置成1,服务器可能会卡死。

Maven私服:
Nexus:Sonatype公司的一款maven私服产品

快速中后台

最著名的是若依,低代码快速搭建前后端。但老实说若依的代码质量,emm,而且虽然一直在更新,但有些技术栈其实挺旧的
快速入门若依:基于若依完成的自己的功能_哔哩哔哩_bilibili,现在新的中后台手脚架基本上也延续了若依的设计思想
下面这个RuoYi-Vue-Plus是基于若依不断发展并最终替换所有原初技术栈,迭代最新的技术栈,保持最新主流,也非常适合用来学习各种最新技术。

接口文档

个人感觉都不太好用,代码耦合太高

可以试试基于JavaDoc的Api-fox这样的接口调试工具来生成文档

自建对象存储

可以使用托管的,七牛、头条之类的,这是自建

去中心化的轻量、强大的分布式文件系统,基本上实现了Elastaticsearch的分片集群特点能够做到:备选结点、自动故障转移等特性

要求保证必须有大于1/2的存活结点才能上传否则不能上传,(但能够下载),这种机制保证数据安全,还有文件恢复算法

文件上传和下载接口设计:

前端携带md5,上传时临时分块以便实现断点续传

  • 文件是否已存在
    • 检查Minnio
    • 检查数据库
  • 文件分块存不存在
    • 检查Minnio(因为分块信息不会存入数据库)
  • 下载分块
  • 合并分块:无论是下载分块还是合并分块都是在服务器端创建临时文件来执行操作,为了避免冲突要使用工具类生成前后缀保证唯一性
  • 校验分块
  • 将合并后的文件上传到文件系统
  • 将文件信息入库保存
  • 根据md5值存储文件目录
    • 因为如果大量文件都在同一目录下的话会很影响IO的效率,所以此处我们不选择年月日格式来创建目录
    • 我们在此处取md5的第一位为第一层目录,第二位为第二层目录,第三层目录是md5命名,分块存储在第三层目录下的chunk文件夹内。当然这个目录规律由我们来定,只要合理

持续集成CI、CD

自己用的话,Github的Action也可以了
轻量级 gitea 就行, 也不用上云,甚至直接使用CloudFlare提供的Page、Vercel等第三方服务也基本够用。其实可以更本质一点,无非两种方案:

  • 定期轮询:编写一个shell脚本来监听GitHub仓库的新推送并执行部署命令,您可以使用Git的钩子功能。具体来说,您可以使用post-receive钩子,它在每次成功的推送到仓库后触发。以下是一个基本的shell脚本示例,它将在新的推送到达时执行部署命令:

    #!/bin/bash
    
    # 保存最新的提交到一个变量中
    LATEST_COMMIT=$(git rev-parse HEAD)
    
    # 检查是否有新的推送
    git fetch origin main
    
    if [[ $(git rev-parse HEAD) != $LATEST_COMMIT ]]; then
      echo "检测到新的推送,正在部署..."
      # 在这里执行您的部署命令
      # 例如:./deploy.sh
    fi
    

    这个脚本首先定义了一个变量LATEST_COMMIT来存储当前的最新提交。然后,它使用git fetch来更新本地仓库的信息,并检查是否有新的提交。如果有新的推送,它将执行部署命令。
    请注意,这个脚本需要定期运行,例如可以通过cron任务来实现。

  • 仓库事件推送:自己写了一些 shell ,gitea 收到 events 就发 webhooks ,nc 监听端口,收到指定 http 的 hook 就执行 shell 编译打包部署。以Github为例:要设置GitHub仓库的Webhook,你需要在仓库的设置页面中找到Webhook选项,并添加一个新的Webhook。在添加Webhook时,你需要提供一个Payload URL,即你的服务器的地址,GitHub会向该地址发送HTTP请求。你还可以选择要监听的事件类型(例如代码推送、Issues创建等),以及是否要触发SSL验证等选项。
    一旦设置完成,当你的GitHub仓库中发生指定的事件时,GitHub会向你的服务器发送HTTP请求,你可以在服务器上编写相应的脚本来处理这些请求,例如进行持续集成、自动部署等操作。需要注意的是,你的服务器必须能够被公网访问,并且能够处理来自GitHub的HTTP请求。你可以使用类似于nc(Netcat)等工具来监听并处理这些请求。

kubernetes(K8S),太重,依赖Docker、K8S生态,不太适合个人使用

公司内网可以采取的方案:

研发管理

TAPD

敏捷开发参考流程:https://www.tapd.cn/home/solution/tapdpro
TAPD是一种常用的敏捷软件开发方法论,它代表了"Team, Artifact, Process, and Domain"这四个关键组成部分。TAPD的目标是通过团队协作、良好的工作成果管理、规范的工作流程和深入理解项目领域来提高软件开发效率和质量。

  • Team(团队):TAPD注重建设高效的团队,鼓励跨职能团队合作,注重沟通与协作,并为团队提供必要的支持与资源。
  • Artifact(工作成果):TAPD强调对软件开发过程中产生的各类工作成果进行有效管理,包括需求文档、设计文档、测试用例、源代码等。
  • Process(工作流程):TAPD倡导规范、透明的工作流程,包括项目计划、需求分析、开发、测试、发布等环节,通过清晰的任务分配、迭代式的开发等方式提高开发效率。
  • Domain(项目领域):TAPD认为深入理解项目领域对于软件开发至关重要,开发团队应该具备足够的领域知识,根据实际需求来制定相应的开发策略和方案。
    总之,TAPD是一种注重团队协作、工作成果管理、工作流程规范和项目领域理解的敏捷软件开发方法论。它可以帮助团队提高开发效率,降低项目风险,并提供高质量的软件产品。 而腾讯就有现成的产品:腾讯敏捷产品研发平台

这是项目进度的管理方式,代码提交可以使用Git/SVN等,提交时携带TAPD平台任务的源码关键字

技术选型

office办公

日志

xxl-job的日志解决方案

你可能还在程序里使用xxl-job提供的日志记录类来写日志,传给rpa调度器?
No!No!No!这一点也不优雅。有一个很好的解决方案,那就是:比如在xxl-job任务调度器上定义一个名为cmd的执行器。他怎么做呢?调度器启动扫描注册的任务执行器去执行他的时候

  • xxl-job会启动一个新的进程去执行
  • 读取这个进程对象
  • 逐行读取对象的控制台日志
  • 然后使用xxl-job的XxlJobHelper去传递这些日志
    这样你压根不用管自定义Job里边怎么去写日志
    你正常使用System.plint.out、log就行不用使用xxlJobHelper对象传日志了
    解放自己,参见xxl-job源码admin模块的例子去看
/**  
 * 3、命令行任务  
 */  
@XxlJob("commandJobHandler")  
public void commandJobHandler() throws Exception {  
    String command = XxlJobHelper.getJobParam();  
    int exitValue = -1;  
  
    BufferedReader bufferedReader = null;  
    try {  
        // command process  
        ProcessBuilder processBuilder = new ProcessBuilder();  
        processBuilder.command(command);  
        processBuilder.redirectErrorStream(true);  
  
        Process process = processBuilder.start();  
        //Process process = Runtime.getRuntime().exec(command);  
  
        BufferedInputStream bufferedInputStream = new BufferedInputStream(process.getInputStream());  
        bufferedReader = new BufferedReader(new InputStreamReader(bufferedInputStream));  
  
        // command log  
        String line;  
        while ((line = bufferedReader.readLine()) != null) {  
            XxlJobHelper.log(line);  
        }  
  
        // command exit  
        process.waitFor();  
        exitValue = process.exitValue();  
    } catch (Exception e) {  
        XxlJobHelper.log(e);  
    } finally {  
        if (bufferedReader != null) {  
            bufferedReader.close();  
        }  
    }  
  
    if (exitValue == 0) {  
        // default success  
    } else {  
        XxlJobHelper.handleFail("command exit value("+exitValue+") is failed");  
    }  
  
}

自娱自乐

静态博客扩展

碎念念

静态博客很好,但我们也需要评论、访问计数呀,那怎么做呢?

如果只是个人使用的小站系统只是想提供一个交流的地方的话我们可以使用giscus,一个免费的评论系统,无需设计数据库表,适合简单的留言和收集需求

内网穿透

隧道-内网穿透⭐

本地机器也可以通过CloudFlare隧道完成内网穿透

优点:

  • 支持代理http协议,提供SSL证书,自动升级https
  • 免费,基本无流量限制
    缺点:
  • 需要自定义域才能使用它的隧道服务(这是你的缺点
  • 增加延迟(国内访问响应变慢)

开源的内网穿透方案:ftp,需要自行准备服务器搭建