fastDFS笔记

FastDFS的整体架构:

         1. 客户端:

        客户端通常指的是我们的java程序,去连接FastDFS,操作FastDFS,那我们的java程序就是一个客户端,

 

 

         2. 服务端

     主要由两部分组成,

  1. 一部分是 跟踪器 Tracker   

跟踪器主要作调度工作,在内存中记录集群中存储节点storage的状态信息,是前端Client和后端storage的枢纽。相关信息都存储在内存中了,所以Tracker Server的性能非常高,  一个较大的集群(如上百个group中)有3台就够了。

  1. 一个是存储节点  Storage

存储节点用于存储文件,包括文件和文件属性,  都会保存到服务器的磁盘上,完成文件的管理功能:文件存储、文件同步、提供文件访问等。

 

FastDFS的环境配置:

在usr/bin目录下  存在很多fastXXX文件夹   在bin目录下 说明我们可以在任何目录下运行fastDFS的命令

在etc/fdfs目录下,  存放的是fastDFS的配置文件

 

另外注意需要把解压后的fastdfs-5.11/conf目录下的两个文件拷贝到/etc/fdfs/ ,否则后续会有很多奇怪问题不好解决

cp http.conf /etc/fdfs/

cp mime.types /etc/fdfs/

这两个文件后续需要用到,所以先拷贝过去

 

fastDFS没有提供windows版的安装 只能在linux下安装进行。

2.2 fastDFS配置:

​​​1.1.1去掉/etc/fdfs/目录下FastDFS配置文件的后缀名    

因为默认的设置下  会给你添加sample后缀名

将tracker.conf 和storage.conf 修改文件扩展名 以及 配置文件内容

默认指向的FastDFS作者余庆的目录,因为在我们的机器上不存在,所有手动改一下

文件路径是在etc/fdfs下  因为是配置文件路径

1.1.2修改storage.conf文件内容(配置3个)

base_path=/opt/fastdfs/storage #配置storage  log文件存储数据的目

 tracker_server = 192.168.0.102:22122  #注册当前存储节点的跟踪器地址

store_path0=/opt/fastdfs/storage/files   # 配置真正存放文件的目录

1.1.3修改tracker.conf文件内容(配置1个)

 

bind_addr=192.168.0.102  这里在本地的话 也一并修改了

# the base path to store data and log files
base_path=/opt/fastdfs/tracker#配置tracker存储数据的目

以上的设置目录一定是存在的

在配置了两个config文件到  etc/fdfs目录下之后就可以进行启动了

 

2.2 启动FastDFS 

  2.2.1  启动tracker服务

在任意目录下执行  fdfs_trackerd 

会提示   fdfs_trackerd <config_file>  [strat | stop | restart]

 fdfs_trackerd /etc/fdfs/tracker.conf

  2.2.2  启动storage服务

fdfs_storaged /etc/fdfs/storage.conf

 2.2.3  查看启动进程

ps -ef | grep fdfs

可以查看日志  /opt/fastdfs/storage/logs  

在/opt/fastdfs/storage/files/data  路径下 可以查看子目录   65535  = 256* 256


2.3测试FastDFS

    2.3.1 测试之前,需要修改 client.conf配置文件,修改两个配置

 

  • base_path=/opt/fastdfs/client

  • tracker_server=192.168.0.102:22122

  • 执行上传命令fdfs_test /etc/fdfs/client.conf upload /root/a.txt

 

 

 

 

使用fdfs-web来启动 遇到的错误bug

 

SpringBoot使用@Mapper注解无效解决办法 

原因在于 原因1:缺少相应的jar包,导致@Mapper注解无效

  <dependency>

            <groupId>org.mybatis.spring.boot</groupId>

            <artifactId>mybatis-spring-boot-starter</artifactId>

            <version>1.2.0</version>

       </dependency>

linux环境下maven仓库包的默认下载路径

通过查找maven安装路径maven/conf/settings.xml的参数可以知道

 

在执行mybatis-逆向工程的时候提示Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generate

原因归结于

注意修改generatorConfig.xml的location:

<generatorConfiguration>
    <classPathEntry
            location="C:\Users\zhaoliang\.m2\repository\mysql\mysql-connector-java\5.1.40\mysql-connector-java-5.1.40.jar"/>

将 /  修改为 \  配置正确

 

Cannot load driver class: com.mysql.cj.jdbc.Driver 

将之前pom.XML中的mysql依赖替换了一下就可以了

<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>

替换为

 <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
<version>8.0.13</version>
        </dependency>

换个版本号就对了

SpringBoot单元测试时报错 :java.lang.RuntimeException: Driver com.mysql.jdbc.Driver claims to not accept

检查一下 jdbc的url地址  是否没有加 ://

 

 

 

 


关于语料管理的代码逻辑述理 

@RequestParam 将请求参数绑定到控制器的方法上  是spingMVC接收普通参数的注解

语法  @RequestParam(value = " " , required= true/false ,   defaultValue=" ")

其中  value  参数名

required = true/false   是否包含该参数 ,默认为true  表示controller请求路径中必须包含该参数, 不包含就会报错  如果设置了 false  则有的话就ok  没有的话就会显示null  但不会报错

defaultValue   参数默认的值,   如果设置了该值 则 required=true 失效,   当没有设置value参数的时候,自动为false,  会自动填充该值进去  

 

base_token实体类中

timetokencontentconshaspascreate_timedel_flglast_create_timeis_use
时间token内容包含信息时间戳短值解析密码创建时间删除标志位最后更新时间是否启用1:启用 0:暂停

 

base_library实体类中

library_keynametimesdirscreate_timedel_flgpublic_apiuser_id
语料库key名称语料库创建时间语料库是否为空创建时间删除标志位预处理时使用api接口用户id

base_corpus实体类  与library靠  library_id来关联

nametypelibrary_idtimesfile_typecreate_timedel_flgfile_pathfile_namefile_url
语料库文件名称1生语料2半熟语料3熟语料语料库id创建时间文件类型创建时间删除标志位文件地址文件名称文件URL地址

 

addCorpus的逻辑

 

获取token中包含的信息 并进行语料库数据字段的设置   判断接收的参数  Token

new baseToken()

setHas值为接收参数的token

利用mybatis.plus查询该token的信息  

获取到该token信息后  进行判断 是否为空 if == null   errorUtil.Error(“错误”)

JSON.parseObject(token.getContent())   获取token的包含信息 并进行解析
JSONObject user = JSON.parseObject(obs.getString("user"))    再对解析出来的content解析  user的信息出来

创建语料库   判断接收的参数  LibraryName

new BaseLibrary()

setName(libraryName   该值是参数传递过来的值)

设置完Library后进行判断 是否已经存在该名称的library   SELECT COUNT(1) FROM base_library WHERE (del_flg != 0) AND (name = ? ) 

如果有提示  语料库名称重复

 

再判断files文件    

if files==null  ||  files.size() ==0

library.setDirs(yes)  设置语料库内容是否为空

library.setLibraryKey(UUID.randomUUID().toString().replace("_",""));

setLibraryKey  (UUID)

setPulicApi

setTime  new Date

setUserId(user.getID)

save

 

new FileRes  文件返回信息类

setLibrary进去

setCorpus进去   最后返回该类信息    前端读到的就是   语料库名字+ 语料库信息+  预料信息   注意  语料库中可以存在多个语料的

 

添加语料

判断文件是否为空或者size为0

然后遍历文件数据  当然可能size >=1  所以需要遍历

x.getOriginalFilename()  得到文件名

再得到文件类型 (后缀名)

再进行判断  如果后缀名是zip的话 需要进行解压缩 

不是zip文件的话   

上传到服务器

fastDFSClient.uploadFileWithMultipart(x)
TrackerServer trackerServer = TrackerServerPool.borrowObject();   TrackerServerPool获取TrackerServer
StorageClient1 storageClient = new StorageClient1(trackerServer, null);  再根据TrackerServer创建StorageClient
// 读取流
// 上传
path = storageClient.upload_file1(fileBuff, suffix, nvps);

返回的值path  是个string[]   包含了  group1   url地址  再进行url地址的拼接

对返回的path值进行判断 如果isBlank  则抛出异常 文件上传失败

然后再log中添加信息

 

if (logger.isDebugEnabled()) {
    logger.debug("upload file success, return path is {}", path);
}

在文件上传模块 添加try catch  finally模块

finally模块   关闭数据流

然后外部  返还Tracker数据池对象

// 返还对象
TrackerServerPool.returnObject(trackerServer);

跳出来

BaseCorpus corpus =   new BaseCorpus()    

setFileName(  x. getOriginalFileName)

setFIlePath(    是fastDFSClient  upload之后返回的拼接路径地址)

setFileType(文件的后缀名字  如txt)

setLibraryId  (library.getID)

setName( x. getOriginalFileName)

setTime(new Date())

setType(1)  写死的一个生语料

corpus.insert()  save

在上面还创建了一个arrayList类型变量     corpusList    corpusList.add(corpus)    同样的语料也不只是一个   所以声明一个list变量来存储

 

fileRes   = new FileRes()  里面只有两个字段   一个是  Library 语料库信息  一个是  corpusList   语料库语料信息

最后   将corpusList  和  library 都存储在  fileRes中  作为返回值 return        

 

 

addFileForLibrary上传语料到语料库的逻辑

参数值是 token  libraryKey    type(语料类型)   files语料文件

new BaseToken()

setHas(参数token)

进行验证token

解析获取到的token字段值 将content内容提取  再将user内容从content中提取

在设置corpus   的type==3的时候  分别去设置  其type=2  type=3  在数据库中进行检索  如果存在的话 就对其进行delete

在接收的参数=2 的时候  不允许直接上传半熟语料

同样的 在上传的时候 去判断fileType   1生 2 半熟  3 熟语料

判断3的时候 先上传到服务器  然后在fastDFSclient返回的path中取出值来 setFilePath   setFileType等 再去存储数据库  与删除的时候逻辑相同   删除的时候一定要先删fdfs再去删除数据库 不然会导致野文件出现

另外,找到的 上传语料到语料库的代码中  查询到一个错误     378行   fastDFSClient.deleteFile后   并没有更新数据库(考虑将url地址设置为null   不将其删除) 

考虑到模型更新这个任务, 需要保留这样的模型  然后评比之后再进行删除  ?    这样的话其实也没有啥用  并不会保留文件数据  只是在数据库中存下了一些关于  name  type   libraryId的字段而已  索性直接删除吧

 

 

语料库预处理逻辑述理(corpusBefore):

传递的参数是 libraryKey 和   token 

libraryKey是     语料库的id       当然一个语料库中包含很多个语料   

一开始同样的,根据token来获取了  用户的id

再根据用户的id来获取  library的key值 

根据LibraryKey值来查询是否  语料库不存在

 

然后再根据语料库key值 查询出library中存在的corpus

corpus中是没有publicAPI的  

所以  JSONObject jsonObject = new JSONObject();
jsonObject.put("publicApi",library.getPublicApi());
jsonObject.put("libraryKey",libraryKey);
jsonObject.put("token",token);

FeignClient注解  使用了HanLP_v1的一些方法进行了预处理

也没有将数据库中的数据进行delete  不知道其设计是怎样的   待咨询

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值