Halo自定义部分扩展

发布时间 2023-04-03 22:49:29作者: loveletters

简介

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去查询调用链路。

先引入所需要的依赖。

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

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

@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

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文件,重启服务。

[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文件把它作为从节点。

[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内执行

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内执行

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服务的主从复制就已经完成了