Java高级架构之FastDFS分布式文件集群详解

FastDFS简介

FastDFS是一款开源的轻量级分布式文件系统,使用C实现,支持Linux、BSD等unix-like操作系统。值得注意的是,fastdfs并不是通用的文件系统,只能通过专用的API访问。

fastdfs为互联网应用量身定做,解决了大容量文件存储的问题,fastdfs追求高性能和高扩展性。fastdfs的主要概念:

tracker-server:跟踪服务器。用于跟踪文件,主要起调度作用。在内存中记录了所有存储组和存储服务器的状态信息,是客户端和数据存储的主要枢纽。相比GFS更为精简,因为不记录文件索引。

storage-server: 存储服务器。用于存储文件。直接使用操作系统的文件系统来管理和组织文件。

group: 组,卷。多个服务器存在一个组中,在一个组中的服务器存储的文件是完全相同的,并且同一个组的服务器地位是对等的。对于文件的操作可以在任意一个组中的服务器上进行。

metadata: 元数据。以键值对的方式存储,用于存储文件的相关信息。

各大存储系统的对比

话说没有对比就没有伤害,fastdfs也不是万能的,需要根据业务来选择适合的存储系统。

存储系统 适合存储的文件类型 文件分布情况 系统性能 复杂度 FUSE(用户文件系统) POSIX() 备份机制 通讯协议接口 社区情况 实现语言
FastDFS 4KB至500MB 将小文件合并存储 很高 简单 不支持 不支持 组内冗余备份 HTTP API 国内用户 C
TFS 所有文件 小文件合并以块组织分片 - 复杂 不支持 不支持 块存储多份,主辅灾备 HTTP API C++
MFS 大于64K 分片存储 Master节点占用内存较高 - 支持 支持 多点备份,动态冗余 使用FUSE挂载 较多 Perl
HDFS 大文件 大文件分片块存储 - 简单 支持 支持 多副本 原生API 较多 Java
Ceph 对象大文件 OSD一主多从 - 复杂 支持 支持 多副本 原生API 较少 C++
MogileFS 海量小图片 - 复杂 支持 不支持 动态冗余 原生API 文档少 Perl
ClusterFS 大文件 - - 简单 支持 支持 - - C

GitHub项目主页: https://github.com/happyfish100/fastdfs

FastDFS客户端与服务器端交互原理

FastDFS+Nginx整合

架构图

安装FastDFS

mkdir /source
cd /source
yum install -y gcc gcc-c++ make cmake wget libevent
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.35.tar.gz
wget https://github.com/happyfish100/fastdfs/archive/V5.10.tar.gz
tar -zxvf V1.0.35.tar.gz
tar -zxvf V5.10.tar.gz
cd libfastcommon-1.0.35
./make.sh
./make.sh install
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
cd ../
cd fastdfs-5.10/
./make.sh
./make.sh install
cd ../
rm -rf libfastcommon-1.0.35
rm -rf fastdfs-5.10
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
mkdir -p /data/fdfs/tracker
mkdir -p /data/fdfs/storage
ln -s /usr/bin/stop.sh /usr/local/bin/stop.sh
ln -s /usr/bin/restart.sh /usr/local/bin/restart.sh

修改配置文件

修改跟踪器配置文件:

base_path=/data/fdfs/tracker

修改存储器配置文件:

base_path=/data/fdfs/storage
store_path0=/data/fdfs/storage
tracker_server=192.168.80.3:22122

修改客户端配置文件:

base_path=/data/fdfs/client
tracker_server=192.168.80.3:22122

启动

/etc/init.d/fdfs_trackerd start
/etc/init.d/fdfs_storaged start
netstat -tunlap | grep :22122
tcp    0   0 0.0.0.0:22122      0.0.0.0:*        LISTEN   7247/fdfs_trackerd
tcp    0   0 192.168.80.3:22122   192.168.80.3:39318   ESTABLISHED 7247/fdfs_trackerd
tcp    0   0 192.168.80.3:39318   192.168.80.3:22122   ESTABLISHED 7444/fdfs_storaged 

启动后要查看状态, 出现 active (exited) 字样可以尝试重启服务。

测试

/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /source/FastDFS_v5.05.tar.gz
group1/M00/00/00/wKhQA1ysjSGAPjXbAAVFOL7FJU4.tar.gz

文件存储在:

ll /data/fdfs/storage/data/00/00/wKhQA1ysjSGAPjXbAAVFOL7FJU4.tar.gz

安装Nginx并配置模块

# 安装Nginx需要的pcre(Perl兼容正则表达式)库,允许Nginx使用rewrite模块提供URL重写功能。
yum install pcre pcre-devel perl-ExtUtils-Embed -y
# 安装openssl-devel,允许Nginx提供HTTPS服务。
yum install openssl-devel -y
# 下载软件包
cd /source
wget http://59.80.44.46/nginx.org/download/nginx-1.14.2.tar.gz
wget http://nchc.dl.sourceforge.net/project/fastdfs/FastDFS%20Nginx%20Module%20Source%20Code/fastdfs-nginx-module_v1.16.tar.gz
# 解压软件包
tar xvf nginx-1.14.2.tar.gz
tar xvf fastdfs-nginx-module_v1.16.tar.gz
# 创建必要的软连接
ln -s /usr/include/fastdfs/ /usr/local/include/fastdfs
ln -s /usr/include/fastcommon/ /usr/local/include/fastcommon
cp FastDFS/conf/http.conf /etc/fdfs/
cp FastDFS/conf/mime.types /etc/fdfs/
cp fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
mkdir -p /data/fdfs/fastdfs-nginx-module

修改配置文件 /etc/fdfs/mod_fastdfs.conf :

connect_timeout=10
base_path=/data/fdfs/fastdfs-nginx-module
# 配置服务器的地址
tracker_server=192.168.80.3:22122
url_have_group_name = true
store_path0=/data/fdfs/storage
mkdir /applications
mkdir /tmp/nginx
useradd nginx -s /sbin/nologin -M
cd nginx-1.14.2
./configure \
--user=nginx \
--group=nginx \
--prefix=/applications/nginx-1.14.2 \
--with-http_ssl_module \
--with-http_gzip_static_module \
--http-client-body-temp-path=/tmp/nginx/client \
--http-proxy-temp-path=/tmp/nginx/proxy \
--http-fastcgi-temp-path=/tmp/nginx/cgi \
--with-poll_module \
--with-file-aio \
--with-http_realip_module \
--with-http_addition_module \
--with-http_random_index_module \
--with-pcre \
--with-http_stub_status_module \
--with-stream \
--add-module=/source/fastdfs-nginx-module/src
make
make install
ln -s /applications/nginx-1.14.2/ /applications/nginx
chown -R nginx.nginx /applications/nginx
chown -R nginx.nginx /applications/nginx-1.14.2/
chown -R nginx.nginx /tmp/nginx/

修改配置文件 /applications/nginx/conf/nginx.conf , 在http区块添加:

server {
    listen    8000;
    server_name media;

    location / {
      root  html;
      index index.html index.htm;
    }

    # 拦截文件请求,转发到下面的模块
    location ~/group[0-9] {
      ngx_fastdfs_module;
    }

    error_page  500 502 503 504 /50x.html;
    location = /50x.html {
      root  html;
    }
  }

测试配置文件正确性并启动:

/applications/nginx/sbin/nginx -t
/applications/nginx/sbin/nginx

删除临时文件:

rm -rf FastDFS
rm -rf fastdfs-nginx-module
rm -rf libfastcommon-1.0.35
rm -rf nginx-1.14.2

测试Nginx文件下载功能, 在浏览器输入: http://192.168.80.3:8000/group1/M00/00/00/wKhQA1ysjSGAPjXbAAVFOL7FJU4.tar.gz

一个nginx只能访问一个storage服务器的数据,所以多个storage服务器要配置多个nginx,然后将nginx按照请求路径中的组id(groupid)进行路由。

简单的启动停止服务的脚本:

# start-service
# usage: ./start-service
echo "============================================Sync datetime==========================================="
ntpdate time7.aliyun.com
echo "===========================================Getting status==========================================="
/etc/init.d/fdfs_trackerd status
/etc/init.d/fdfs_storaged status
echo "==========================================Starting service=========================================="
/etc/init.d/fdfs_storaged start
/etc/init.d/fdfs_trackerd start
echo "===========================================Getting status==========================================="
/etc/init.d/fdfs_trackerd status
/etc/init.d/fdfs_storaged status
echo "=========================================Testing config file========================================"
/applications/nginx/sbin/nginx -t
echo "=========================================Starting web server========================================"
/applications/nginx/sbin/nginx
echo "=======================================Getting network status======================================="
sleep 5s
netstat -tunlap | grep :22122
netstat -tunlap | grep :8000
# stop-service
# usage: ./stop-service
echo "===========================================Getting status==========================================="
/etc/init.d/fdfs_trackerd status
/etc/init.d/fdfs_storaged status
echo "==========================================Stopping service=========================================="
/etc/init.d/fdfs_storaged stop
/etc/init.d/fdfs_trackerd stop
echo "========================================Stopping web server========================================="
kill `cat /applications/nginx/logs/nginx.pid`
echo "===========================================Getting status==========================================="
/etc/init.d/fdfs_trackerd status
/etc/init.d/fdfs_storaged status
echo "=======================================Getting network status======================================="
sleep 5s
netstat -tunlap | grep :22122
netstat -tunlap | grep :8000

基于Token的防盗链实现

FastDFS内置使用Token的方式实现防盗链,Token是带有时效性的,Token中包含了文件id、时间戳ts和token。在FastDFS中使用URL带上ts和token的方式请求资源。在FastDFS中提供了生成Token的算法,扩展模块会对Token进行验证。由于Token的生成和校验都在服务器端,因此不会存在安全性问题。链接示例:

http://192.168.1.15:8080/group1/M01/01/01/wKgBD01c15nvKU1cAABAOeCdFS466570.c?token=b32cd06a53dea4376e43d71cc882f9cb&ts=1297930137

/etc/fdfs/http.conf 中修改:

# 开启Token校验
http.anti_steal.check_token=true
# Token的声明周期为240秒
http.anti_steal.token_ttl=240
# 加密字符串,可以使用 openssl rand -base64 64 生成
http.anti_steal.secret_key=2scPwMPctXhbLVOYB0jyuyQzytOofmFCBIYe65n56PPYVWrntxzLIDbPdvDDLJM8QHhKxSGWTcr+9VdG3yptkw
# Token校验失败的时候返回的图片
http.anti_steal.token_check_fail=/data/fdfs/error.svg

使用Java客户端验证:

将客户端安装到本地仓库:

git clone https://github.com/happyfish100/fastdfs-client-java.git
cd fastdfs-client-java
mvn clean install

使用Maven创建一个普通的项目,在POM文件中添加依赖:

<dependencies>
  <dependency>
    <groupId>org.csource</groupId>
    <artifactId>fastdfs-client-java</artifactId>
    <version>1.27-SNAPSHOT</version>
  </dependency>
</dependencies>

在resources目录下创建FastDFS配置文件 fastdfs-client.properties :

fastdfs.connect_timeout_in_seconds = 5
fastdfs.network_timeout_in_seconds = 30
fastdfs.charset = UTF-8
fastdfs.http_anti_steal_token = true
fastdfs.http_secret_key = 2scPwMPctXhbLVOYB0jyuyQzytOofmFCBIYe65n56PPYVWrntxzLIDbPdvDDLJM8QHhKxSGWTcr+9VdG3yptkw
fastdfs.http_tracker_http_port = 8080
fastdfs.tracker_servers = 192.168.80.3:22122

创建 com.bluemiaomiao.Demo.java 类文件:

package com.bluemiaomiao;

import org.csource.common.MyException;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.ProtoCommon;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.Properties;

public class Demo {
  public static void main(String[] args) throws IOException, MyException, NoSuchAlgorithmException {
    // 加载配置文件
    Properties prop = new Properties();
    prop.load(Demo.class.getResourceAsStream("/fastdfs-client.properties"));
    ClientGlobal.initByProperties(prop);
    // 显示初始化配置信息
    System.out.println(ClientGlobal.configInfo());
    // 使用文件上传工具返回的地址,一般情况下保存在数据库中
    String remoteFileName = "group1/M00/00/00/wKhQA1ysjSGAPjXbAAVFOL7FJU4.tar.gz";
    // 获取当前时间戳
    int ts = (int)(System.currentTimeMillis()/1000);
    // 获取Token, 传入的文件ID不要含有分组信息
    String token = ProtoCommon.getToken("M00/00/00/wKhQA1ysjSGAPjXbAAVFOL7FJU4.tar.gz", ts, prop.getProperty("fastdfs.http_secret_key"));
    // 使用浏览器访问返回的URL
    System.out.println("http://192.168.80.3:8000/" + remoteFileName + "?token=" + token + "&ts=" + ts);
  }
}

如果访问时显示防盗链图片,可能是测试客户端与服务器之间的之间有一定差距,两个主机之间不能有分钟级别的差距,可以使用如下方法同步服务器:

# 安装同步时间服务器的客户端, Windows系统也需要与该服务器同步
# 控制面板->时钟和区域->设置日期和时间->Internet时间->更改设置
yum install ntpdate
ntpdate time7.aliyun.com

整合FastDHT实现数据去重

FastDHT是分布式哈希系统(DHT),使用BerkeleyDB做数据存储,使用libevent做网络IO处理。依赖于libfastcommon组件。

下载

去Oracle官方网站下载 Berkeley DB 数据库,去Fastdfs的GitHub主页下载FastDHT的源码包。由于之前已经安装过linevent和libfastcommon,因此只需要安装数据库和FastDHT即可。

安装配置数据库与FastDHT

tar -xvf db-6.2.23.tar.gz
cd db-6.2.23/build_unix/
../dist/configure --prefix=/applications/db-6.2.23
cd ../../
rm -rf db-6.2.23
unzip fastdht-master.zip
cd fastdht-master
vim make.sh

修改第27行代码:

CFLAGS='-Wall -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -I /applications/db-6.2.23/include/ -L /applications/db-6.2.23/lib/'

-I : 指定数据库提供的头文件目录

-L : 指定数据库提供的库文件目录

./make.sh
./make.sh install
cd ../
rm -rf fastdht-master

配置

mkdir /data/fdht

修改 /etc/fdht/fdht_client.conf 内容:

base_path=/data/fdht
#include /etc/fdht/fdht_servers.conf

修改 /etc/fdht/fdht_servers.conf 内容:

group0 = 192.168.80.3:11411

修改 /etc/fdht/fdhtd.conf 内容:

base_path=/data/fdht
#include /etc/fdht/fdht_servers.conf

修改 /etc/fdfs/storage.conf 内容:

check_file_duplicate=1
key_namespace=FastDFS
keep_alive=1
#include /etc/fdht/fdht_servers.conf

主要需要包含服务器端配置文件。

ln -s /applications/db-6.2.23/lib/libdb-6.2.so /usr/lib/libdb-6.2.so
ln -s /applications/db-6.2.23/lib/libdb-6.2.so /usr/lib64/libdb-6.2.so

启动并测试

fdhtd /etc/fdht/fdhtd.conf

重启使用:

fdhtd /etc/fdht/fdhtd.conf restart

查看结果:

netstat -tunlap | grep :11411
tcp    0   0 0.0.0.0:11411      0.0.0.0:*        LISTEN   20605/fdhtd

由于安装FastDHT的时候关闭了FastDFS,因此需要启动FastDFS

./start-service

修改之前的 start-service 脚本, 在启动tracker和storage服务之前添加:

fdhtd /etc/fdht/fdhtd.conf

在查看tracker和ngixn网络状态之前添加:

netstat -tunlap | grep :11411

测试:

fdfs_upload_file /etc/fdfs/client.conf /source/db-6.2.23.tar.gz
group1/M00/00/00/wKhQA1yu2L6APTk-AqQOLABfhaQ.tar.gz
fdfs_upload_file /etc/fdfs/client.conf /source/db-6.2.23.tar.gz
group1/M00/00/00/wKhQA1yu2MKAOmIiAqQOLHUWXfw.tar.gz
ll /data/fdfs/storage/data/00/00/
total 45268
-rw-r--r-- 1 root root 44305964 Apr 11 14:03 wKhQA1yu2L6AM0aiAqQOLKFBFuc.tar.gz
lrwxrwxrwx 1 root root    64 Apr 11 14:03 wKhQA1yu2L6APTk-AqQOLABfhaQ.tar.gz -> /data/fdfs/storage/data/00/00/wKhQA1yu2L6AM0aiAqQOLKFBFuc.tar.gz
lrwxrwxrwx 1 root root    64 Apr 11 14:03 wKhQA1yu2MKAOmIiAqQOLHUWXfw.tar.gz -> /data/fdfs/storage/data/00/00/wKhQA1yu2L6AM0aiAqQOLKFBFuc.tar.gz

自定义 fastdfs-spring-boot-starter

为了快速构建SpringBoot项目,我们可以自定义一个场景启动器来解决。详细信息: https://github.com/bluemiaomiao/fastdfs-spring-boot-starter .

下面使用SpringBoot构建一个示例项目:

添加依赖:

<dependency>
  <groupId>com.bluemiaomiao</groupId>
  <artifactId>fastdfs-spring-boot-starter</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>

在主配置类中添加注解:

@EnableFastdfsClient
@SpringBootApplication
public class DemoApplication {

@Autowired
private FastdfsClientService fastdfsClientService;

public static void main(String[] args) {
  SpringApplication.run(DemoApplication.class, args);
}
}

此时将会自动初始化好全局客户端。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 浅析JavaWeb项目架构之Redis分布式日志队列

    摘要: 架构.分布式.日志队列,标题自己都看着唬人,其实就是一个日志收集的功能,只不过中间加了一个Redis做消息队列罢了. 为什么需要消息队列? 当系统中出现"生产"和"消费"的速度或稳定性等因素不一致的时候,就需要消息队列,作为抽象层,弥合双方的差异. 架构.分布式.日志队列,标题自己都看着唬人,其实就是一个日志收集的功能,只不过中间加了一个Redis做消息队列罢了. 为什么需要消息队列? 当系统中出现"生产"和"消费"的

  • 了解java架构之微服务架构—雪崩效应

    前言 微服务化产品线,每一个服务专心于自己的业务逻辑,并对外提供相应的接口,看上去似乎很明了,其实还有很多的东西需要考虑,比如:服务的自动扩充,熔断和限流等,随着业务的扩展,服务的数量也会随之增多,逻辑会更加复杂,一个服务的某个逻辑需要依赖多个其他服务才能完成. 一但一个依赖不能提供服务很可能会产生雪崩效应,最后导致整个服务不可访问. 微服务之间进行rpc或者http调用时,我们一般都会设置调用超时,失败重试等机制来确保服务的成功执行,看上去很美,如果不考虑服务的熔断和限流,就是雪崩的源头. 假

  • java使用三层架构实现电影购票系统

    使用三层架构实现电影购票系统,分用户和管理员,用户功能:展示电影,查找电影(模糊查询),查看电影详情,查找场次,购买影票,订制座位,退订影票等功能,界面美观漂亮,逻辑严谨,附加电影评论功能,订票超过五张打0.9折的打折功能.管理员功能:影院的增删改查,场次的增删改查,电影的增删改查,影票管理等. 管理员账号:admin  密码:admin 下载地址:java实现电影购票系统 效果展示图: 登录界面: 用户主界面: 查看热门电影: 点击电影进入查看详情,可以看到该电影的所有评论,可以进行评论. 点

  • bs架构和cs架构的区别_动力节点Java学院整理

    1.CS.BS架构定义 CS(Client/Server):客户端----服务器结构.C/S结构在技术上很成熟,它的主要特点是交互性强.具有安全的存取模式.网络通信量低.响应速度快.利于处理大量数据.因为客户端要负责绝大多数的业务逻辑和UI展示,又称为胖客户端.它充分利用两端硬件,将任务分配到Client 和Server两端,降低了系统的通讯开销.C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件,加之产品的更新换代十分快,已经很难适应百台电脑以上局域网用户同时使用. C/S 架构是一

  • java学生信息管理系统MVC架构详解

    本文实例为大家分享了java学生信息管理系统MVC架构,供大家参考,具体内容如下 一.项目结构 学生信息管理系统分三层进行实现.student.java主要提供数据,cotroller.java的功能是绑定试图和计算数据.Stuview.java用于单一的用来显示数据. 二.源码 1.1.Student 类 /* * @FileName: Student.class * @version:1.0 * @author:nazi * 描述:模型层 * */ import java.io.Serial

  • 10本Java架构师必读书籍

    Java架构师必读书籍,分享给大家 1.大型网站系统与JAVA中间件实践 本书围绕大型网站和支撑大型网站架构的Java中间件的实践展开介绍. 从分布式系统的知识切入,让读者对分布式系统有基本的了解:然后介绍大型网站随着数据量.访问量增长而发生的架构变迁:接着讲述构建Java中间件的相关知识:之后的几章都是根据笔者的经验来介绍支撑大型网站架构的Java中间件系统的设计和实践.希望读者通过本书可以了解大型网站架构变迁过程中的较为通用的问题和解法,并了解构建支撑大型网站的Java中间件的实践经验. 对

  • Java高级架构之FastDFS分布式文件集群详解

    FastDFS简介 FastDFS是一款开源的轻量级分布式文件系统,使用C实现,支持Linux.BSD等unix-like操作系统.值得注意的是,fastdfs并不是通用的文件系统,只能通过专用的API访问. fastdfs为互联网应用量身定做,解决了大容量文件存储的问题,fastdfs追求高性能和高扩展性.fastdfs的主要概念: tracker-server:跟踪服务器.用于跟踪文件,主要起调度作用.在内存中记录了所有存储组和存储服务器的状态信息,是客户端和数据存储的主要枢纽.相比GFS更

  • linux系统安装hadoop真分布式集群详解

    Hadoop真分布式完全集群安装,基于版本2.7.2安装,在两台Linux机器上面分别安装Hadoop的master和slave节点. 1.安装说明 不管NameNode还是DataNode节点,安装的用户名需要一致.master和slave的区别,只是在于配置的hostname,在config的slaves配置的hostname所代表的机器即为slave,不使用主机名也可以,直接配置为IP即可.在这种集群下面,需要在master节点创建namenode路径,并且使用格式化命令hdfs name

  • MySQL高级学习笔记(三):Mysql逻辑架构介绍、mysql存储引擎详解

    Mysql逻辑架构介绍总体概览 和其它数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用.主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离 . 这种架构可以根据业务的需求和实际需要选择合适的存储引擎. controller层: Connectors:连接层,c .java等连接mysql 业务逻辑处理成: Connection Pool:连接层 c3p0连接池等 Manager Service util:备份.容灾

  • java开发主流定时任务解决方案全横评详解

    目录 引言 Crontab 目标定位 使用方式 实现原理 方案分析 Spring Task 目标定位 使用方式 实现原理 方案分析 ElasticJob 目标定位 使用方式 实现原理 方案分析 XXLJob 目标定位 使用方式 实现原理 方案分析 Serverless Job 目标定位 使用方式 实现原理 方案分析 总结 引言 定时任务作为一种按照约定时间执行预期逻辑的通用模式,在企业级开发中承载着丰富的业务场景,诸如后台定时同步数据生成报表,定时清理磁盘日志文件,定时扫描超时订单进行补偿回调等

  • Kubernetes上使用Jaeger分布式追踪基础设施详解

    目录 正文 微服务架构中的可观察性 分布式追踪 Jaeger组件 架构图 Jaeger客户端 Jaeger代理 Jaeger SideCar 代理 Jaeger Daemonset 代理 Jaeger Collector 服务 Jaeger Query 查询服务 Storage Configuration 存储配置 监控 正文 作为分布式系统(或任何系统)的一个组成部分,监测基础设施的重要性怎么强调都不过分.监控不仅要跟踪二进制的 "上升 "和 "下降 "模式,还要

  • 分布式Hibernate search详解

    分布式Hibernate Search与Apache Tomcat6,ActiveMQ 和Spring.今天我将跟大家分享我的经验,以master/slave(s)方式配置分布式Hibernate Search并整合Apache ActiveMQ,Spring,应用程序额容器是Apache Tomcat 6. 怎么工作: -Hibernate Search 支持使用JMS back-end 和 master/slave(s) 索引进行分布式配置 - mater通过网络共享暴露索引 (例如通过NF

  • FasfDFS整合Java实现文件上传下载功能实例详解

    在上篇文章给大家介绍了FastDFS安装和配置整合Nginx-1.13.3的方法,大家可以点击查看下. 今天使用Java代码实现文件的上传和下载.对此作者提供了Java API支持,下载fastdfs-client-java将源码添加到项目中.或者在Maven项目pom.xml文件中添加依赖 <dependency> <groupId>org.csource</groupId> <artifactId>fastdfs-client-java</arti

  • Java 重载、重写、构造函数的实例详解

    Java 重载.重写.构造函数的实例详解 方法重写 1.重写只能出现在继承关系之中.当一个类继承它的父类方法时,都有机会重写该父类的方法.一个特例是父类的方法被标识为final.重写的主要优点是能够定义某个子类型特有的行为. class Animal { public void eat(){ System.out.println ("Animal is eating."); } } class Horse extends Animal{ public void eat(){ Syste

  • java并发学习之BlockingQueue实现生产者消费者详解

    1.介绍 阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满:从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空.并发包下很多高级同步类的实现都是基于BlockingQueue实现的. JDK7提供了以下7个阻塞队列: ArrayBlockingQueue :由数组结构组成的有界阻塞队列. LinkedBloc

  • Java线程之线程同步synchronized和volatile详解

    上篇通过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的(其实是巧合,多运行几次,会产生不同的输出结果),为什么会产生这样的结果呢,因为建立的Count对象是线程共享的,一个线程改变了其成员变量num值,下一个线程正巧读到了修改后的num,所以会递增输出. 要说明线程同步问题首先要说明Java线程的两个特性,可见性和有序性.多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共享变量来实现.拿上篇博文中的例子来说明,在多个线程之间共享了Count类的

随机推荐