使用 GitHub Actions 自动发布 Hexo 博客
GitHub Actions 简介GitHub Actions 是一个持续集成和持续交付 (CI/CD) 平台,可用于自动执行构建、测试和部署管道。 您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。
GitHub Actions 不仅仅是 DevOps,还允许您在存储库中发生其他事件时运行工作流程。 例如,您可以运行工作流程,以便在有人在您的存储库中创建新问题时自动添加相应的标签。
GitHub Actions 有一些自己的术语。
(1)workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。
(2)job (任务):一个 workflow 由一个或多个 jobs 构成,含义是一次持续集成的运行,可以完成多个任务。
(3)step(步骤):每个 job 由多个 step 构成,一步步完成。
(4)action (动作):每个 step 可以依次执行一个或多个命令(action)。
环境准备我的个人站点 Kyire の Blog - 记录美好生活 是通过 Hexo 框架搭建的。
搭建方法可参考:Hexo+Gitee 搭建 ...
Redis 集群部署案例设计
面试题:1~2 亿条数据需要缓存,请问如何设计这个存储案例?单机单台 100%不可能,肯定是分布式存储,用 redis 如何落地?
哈希取余分区
2 亿条记录就是 2 亿个 k,v,我们单机不行必须要分布式多机,假设有 3 台机器构成一个集群,用户每次读写操作都是根据公式:
hash(key) % N 个机器台数,计算出哈希值,用来决定数据映射到哪一个节点上。
优点
简单粗暴,直接有效,只需要预估好数据规划好节点,例如 3 台、8 台、10 台,就能保证一段时间的数据支撑。使用 Hash 算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡+分而治之的作用。
缺点
原来规划好的节点,进行扩容或者缩容就比较麻烦了,不管扩缩,每次数据变动导致节点有变动,映射关系需要重新进行计算,在服务器个数固定不变时没有问题,如果需要弹性扩容或故障停机的情况下,原来的取模公式就会发生变化:Hash(key)/3 会变成 Hash(key) /?。此时地址经过取余运算的结果将发生很大变化,根据公式获取的服务器也会变得不可控。某个 redi ...
SpringBoot2 核心技术
基础入门1、Spring 生态圈
Spring 官网:https://spring.io
Spring 能做什么?
Spring 的生态:
web 开发
数据访问
安全控制
分布式
消息服务
移动开发
批处理
…
2、为什么使用 SpringBoot?
Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”.
能快速创建出生产级别的 Spring 应用。
SpringBoot 的优点:
创建独立 Spring 应用
内嵌 web 服务器
自动 starter 依赖,简化构建配置
自动配置 Spring 以及第三方功能
提供生产级别的监控、健康检查及外部化配置
无代码生成、无需编写 XML
SpringBoot 是整合 Spring 技术栈的一站式框架
SpringBoot 是简化 Spring 技术栈的快速开发脚手架
SpringBoot 的缺点:
人称版本帝,社区活跃,迭代快,需要时刻关注版本变 ...
Nginx 从入门到实战
Nginx 的安装本文 Linux 环境基于 centos7
版本区别常用版本分为四大阵营
Nginx 开源版 http://nginx.org/
Nginx plus 商业版 https://www.nginx.com
openresty http://openresty.org/cn/
Tengine http://tengine.taobao.org/
编译安装这里下载的是 nginx-1.21.6.tar.gz ,解压后编译安装
1234567# 解压tar zxvf nginx-1.21.6.tar.gz -C ./cd nginx-1.21.6# 执行配置脚本./configure --prefix=/usr/local/nginx# 安装make && make install
如果出现警告或报错一般是缺少依赖的问题
12345678# 安装gccyum install -y gcc# 安装perl库yum install -y pcre pcre-devel# 安装zlib库yum install -y zlib zlib-devel# 重新执行安 ...
错误码及全局异常处理
写在前面在软件开发过程中,不可避免的是需要处理各种异常,在 Java 中,处理异常的方式一般就是采用try{...}catch{...}finally{...}代码块。在业务系统中,可能会有大量的异常处理代码块,这样不仅有大量的冗余代码,而且还影响代码的可读性。比较下面两张图:
可以看到,明显第二种的代码简洁,可读性高!此处的代码是在 Controller 层中的,在 Service 层中会有更多的异常处理代码块。
那么我们应该如何优雅的进行异常处理呢?
什么是统一异常处理在 Spring 里,我们可以使用@ControllerAdvice 来处理一些全局性的东西,最常见的是结合@ExceptionHandler 注解用于全局异常的处理。
@ControllerAdvice 是在类上声明的注解,其用法主要有三点:
@ExceptionHandler注解标注的方法:用于捕获 Controller 中抛出的不同类型的异常,从而达到异常全局处理的目的
@InitBinder注解标注的方法:用于请求中注册自定义参数的解析,从 ...
持续集成工具之 Jenkins
持续集成及 Jenkins 介绍软件开发生命周期软件开发生命周期又叫做SDLC(Software Development Life Cycle),它是集合了计划、开发、测试 和部署过程的集合。如下图所示 :
需求分析
这是生命周期的第一阶段,根据项目需求,团队执行一个可行性计划的分析。项目需求可能是公司内部 或者客户提出的。这阶段主要是对信息的收集,也有可能是对现有项目的改善和重新做一个新的项目。 还要分析项目的预算多长,可以从哪方面受益及布局,这也是项目创建的目标。
设计
第二阶段就是设计阶段,系统架构和满意状态(就是要做成什么样子,有什么功能),和创建一个项目 计划。计划可以使用图表,布局设计或者文者的方式呈现。
实现
第三阶段就是实现阶段,项目经理创建和分配工作给开者,开发者根据任务和在设计阶段定义的目标进 行开发代码。依据项目的大小和复杂程度,可以需要数月或更长时间才能完成。
测试
测试人员进行代码测试 ,包括功能测试、代码测试、压力测试等。
进化
最后进阶段就是对产品不断的进化改进和维护阶段,根据用户的使用情况,可能需要对某功能进行修 改,bug 修复 ...
分库分表理论知识
一、前言当一张表的数据达到几千万时,查询一次所花的时间会变得很长,系统效率会下降。Oracle 官方推荐单表容量为 500w 以下为最佳状态。
但单表或单库达到性能瓶颈时,就需要对数据库进行拆分,数据库拆分又分为:
垂直拆分
水平拆分
二、垂直拆分垂直拆分可以分为:垂直分表 和 垂直分库。
垂直分表概念:把一个表的多个字段分别拆成多个表,一般按字段的访问频次拆分,经常访问的字段一个表,不经常访问的字段一个表。减少布不必要的字段查询,提高数据库性能。
如图:
垂直分库概念:就是根据业务耦合性,将关联度低的不同表存储在不同的数据库中。做法与大系统拆分成多个小系统类似,按业务类型进行独立划分。与 微服务划分 的做法类似。每个微服务使用单独的一个数据库。
如图:
说明:
业务数据量小的情况下,只有一个数据库,所有的表都在这个库里。
业务扩展,数据量增加,单体服务转变为微服务治理。要将之前的库按业务类型拆分成多个库。每个微服务对应一个库。
垂直拆分优缺点优点:
解决业务系统层面的耦合,业务清晰
与微服务的治理类似,也能对不同业务的数据进行分级管理、维护、监控、扩展等
高 ...
GitLab 的安装与使用
Docker 安装 GitLabDockerHub 上有许多制作完善的镜像,直接搜索 gitlab 查看镜像:
搜索镜像
1docker search gitlab
这里可以选择汉化的 GitLab 社区版的镜像进行下载
下载镜像
1docker pull twang2218/gitlab-ce-zh
启动镜像
12345678docker run -d -p 8443:443 -p 8090:80 -p 8022:22 --restart always --name gitlab -v /usr/local/gitlab/etc:/etc/gitlab -v /usr/local/gitlab/log:/var/log/gitlab -v /usr/local/gitlab/data:/var/opt/gitlab --privileged=true twang2218/gitlab-ce-zh命令解释:-d 后台启动-p 映射端口--restart 重启配置-v 卷挂载--privileged=true 设置root权限
配置 GitLab编辑 gitlab.rb 文件 ...
Dom4j 如何新增 standalone?
前言工作中调用一个第三方接口,需要上传 xml 文件。Java 操作 xml 文件的 api 很多,有 Dom、SAX 、JDom、Dom4j。我一般常用的是 Dom4j,但是对接此接口上传的 xml 文件需要添加 standalone="no" 属性。查阅相关资料,发现 Dom4j -1.6.1 版本并没有提供相应的方法设置。
解决方案重写 XMLWriter 类中的 writeDeclaration 方法,具体代码如下:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253import java.io.FileOutputStream;import java.io.FileWriter;import java.io.IOException;import java.io.UnsupportedEncodingException;import org.dom4j.io.OutputFormat;import org.dom4j ...
Docker 安装 Centos7
前言本地化启动一个 Linux 服务器,使用 Docker 容器来构建一个包含 SSH 服务的 Linux 镜像。
准备 centos 官方镜像具体步骤:
12345678910111213141516# 1、拉取centos7官方镜像docker pull centos:7# 2、启动镜像docker run -itd --privileged centos:7 init# 3、进入容器bash中docker exec -it 镜像ID bash# 4、修改root用户密码[root@33c7ee24f43e /]# passwdChanging password for user root.New password:BAD PASSWORD: The password is shorter than 8 charactersRetype new password:passwd: all authentication tokens updated successfully.# 5、安装和配置ssh服务yum install openssh-server -y# 6、修改/etc/ss ...