Halo自定义部分扩展

LOVELETTERD·2023-04-03 22:44·234 次阅读

Halo自定义部分扩展

简介#

Halo是一款现代化的开源博客/CMS系统,前端由Vue,后端java开发的。我选择的原因是因为是java开发的,所以方便我自定义的扩展。

MinIO扩展#

在我们写博客的时候经常会用到图片,Halo支持多种文件存储方式。这里我选择了MinIO,但是在使用的过程中发现了一个小的问题,它上传的文件是按照你文件的名称直接进行存储的,这就导致一个问题,重名的文件会被后面上传的文件替换。所以第一个我想改造的点就是,让我上传的文件能够自动重命名,这样就不会因为名称重复被替换。

先从github拉下源码找到MinIO上传文件的相关代码,如图:

我们只需要修改一个这个setFilename就好了,我这里直接简单的用uuid就好了。这样就完成了我的需求了。

接下来就是打包部署,由于我用的是docker的方式安装。所以先要打包成docker镜像。好在它本身附带了Dockerfile文件 执行执行
docker build -t halo:v1 .

然后再重新部署就好了

可以看到图片成功上传并且重命名了

Skywalking扩展#

由于后期我相对Halo做一些扩展功能,所以我想引入链路追踪系统方便我在开发使用过程中排查错误。我这里选择Skywalking。
首先我想在请求的响应中加入traceid以便后续可以通过traceid去查询调用链路。

先引入所需要的依赖。

Copy
implementation 'org.apache.skywalking:apm-toolkit-trace:8.7.0'

因为我们需要在每个请求中都加上traceid所以我们用filter来做

Copy
@Component public class TraceResponseFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { try{ //设置skywalking的traceId httpServletResponse.addHeader("traceId", TraceContext.traceId()); }catch (Exception e){} filterChain.doFilter(httpServletRequest, httpServletResponse); } }

想要使用skywalking还需要用到javaagent,所以我们在打包镜像的时候需要将agent一并打包到镜像中,所以我们还需要改造Dockerfile

Copy
FROM adoptopenjdk:11-jre-hotspot as builder WORKDIR application ARG JAR_FILE=halo*.jar COPY ${JAR_FILE} application.jar RUN java -Djarmode=layertools -jar application.jar extract ################################ FROM adoptopenjdk:11-jre-hotspot MAINTAINER johnniang <johnniang@fastmail.com> WORKDIR application COPY --from=builder application/dependencies/ ./ COPY --from=builder application/spring-boot-loader/ ./ COPY --from=builder application/snapshot-dependencies/ ./ COPY --from=builder application/application/ ./ # JVM_XMS and JVM_XMX configs deprecated for removal in halov1.4.4 ENV JVM_XMS="256m" \ JVM_XMX="256m" \ JVM_OPTS="-Xmx256m -Xms256m" \ TZ=Asia/Shanghai RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime \ && echo $TZ > /etc/timezone \ COPY agent /usr/local/agent ENTRYPOINT java -Xms${JVM_XMS} -Xmx${JVM_XMX} ${JVM_OPTS} -javaagent:/usr/local/agent/skywalking-agent.jar -DSW_AGENT_NAME=halo -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=ip:port -Djava.security.egd=file:/dev/./urandom org.springframework.boot.loader.JarLauncher

然后打包部署

可以看到我们的响应头中已经成功携带了traceid

复制traceid去平台查询

新增mysql主从复制#

因为我博客的后台系统采用的是mysql作为数据存储的,mysql单节点的如果挂了有数据丢失的风险。所以我决定给mysql做一个主从同步,搭建mysql的主从同步也很简单只需要。修改主节点的my.cnf文件,重启服务。

Copy
[client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] init_connect='SET collation_connection = utf8mb4_unicode_ci' init_connect='SET NAMES utf8mb4' character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci skip-character-set-client-handshake skip-name-resolve log-bin=mysql-bin-master server-id=1

在另外一台主机上修改my.cnf文件把它作为从节点。

Copy
[client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] init_connect='SET collation_connection = utf8mb4_unicode_ci' init_connect='SET NAMES utf8mb4' character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci skip-character-set-client-handshake skip-name-resolve server-id=2

然后重启mysql服务,在主节点mysql内执行

Copy
show master status; | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 629 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)

再进去从节点的mysql内执行

Copy
mysql> CHANGE MASTER TO -> MASTER_HOST='master_host_name', -> MASTER_USER='replication_user_name', -> MASTER_PASSWORD='replication_password', -> MASTER_LOG_FILE='recorded_log_file_name', -> MASTER_LOG_POS=recorded_log_position;

然后执行

START SLAVE;

这样我们mysql服务的主从复制就已经完成了

posted @   loveletters  阅读(234)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示
目录