SpringBoot集成FastDFS+Nginx整合基于Token的防盜鏈

本文是第二篇!
第一篇,《Java高級(jí)架構(gòu)之FastDFS分布式文件集群》:https://blog.51cto.com/xvjunjie/2377669
第三篇,《FastDFS的HA架構(gòu)多Group多Storage多Tracker結(jié)合SpringBoot》https://blog.51cto.com/xvjunjie/2445770

創(chuàng)新互聯(lián)專(zhuān)業(yè)提供成都服務(wù)器托管服務(wù),為用戶(hù)提供五星數(shù)據(jù)中心、電信、雙線(xiàn)接入解決方案,用戶(hù)可自行在線(xiàn)購(gòu)買(mǎi)成都服務(wù)器托管服務(wù),并享受7*24小時(shí)金牌售后服務(wù)。

為什么要用SpringBoot?

SpringBoot是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來(lái)簡(jiǎn)化新Spring應(yīng)用的初始搭建以及開(kāi)發(fā)過(guò)程。該框架使用了特定的方式來(lái)進(jìn)行配置,從而使開(kāi)發(fā)人員不再需要定義樣板化的配置。通過(guò)這種方式,Spring Boot致力于在蓬勃發(fā)展的快速應(yīng)用開(kāi)發(fā)領(lǐng)域(rapid application development)成為領(lǐng)導(dǎo)者。

  • 創(chuàng)建獨(dú)立的Spring應(yīng)用程序

  • 嵌入的Tomcat,無(wú)需部署WAR文件

  • 簡(jiǎn)化Maven配置

  • 自動(dòng)配置Spring

  • 提供生產(chǎn)就緒型功能,如指標(biāo),健康檢查和外部配置

  • 絕對(duì)沒(méi)有代碼生成并且對(duì)XML也沒(méi)有配置要求

為什么要用Nginx?

  • 概述

    Nginx(engine x)是一個(gè)開(kāi)源的,支持高并發(fā)的www服務(wù)和代理服務(wù)軟件。Nginx是俄羅斯人Igor Sysoev開(kāi)發(fā)的,最初被應(yīng)用到俄羅斯的大型網(wǎng)站(www.rambler.ru)上。后來(lái)作者將源代碼以類(lèi)BSD許可證的形式開(kāi)源出來(lái)供全球使用。在功能應(yīng)用方面,Nginx不僅是一個(gè)優(yōu)秀的Web服務(wù)軟件,還具有反向代理負(fù)載均衡和緩存的功能。在反向代理負(fù)載均衡方面類(lèi)似于LVS負(fù)載均衡及HAProxy等你專(zhuān)業(yè)代理軟件。Nginx部署起來(lái)更加方便簡(jiǎn)單,在緩存服務(wù)功能方面,有類(lèi)似于Squid等專(zhuān)業(yè)的緩存服務(wù)軟件。Nginx可以運(yùn)行在UNIX、Linux、MS Windows Server、Mac OS X Server、Solaris等操作系統(tǒng)中。

  • Nginx的重要特性

    1. 可以針對(duì)靜態(tài)資源高速節(jié)點(diǎn)并發(fā)訪(fǎng)問(wèn)及緩存。
    2. 可以使用反向代理加速,并且可以進(jìn)行數(shù)據(jù)緩存。
    3. 具有簡(jiǎn)單負(fù)載均衡,節(jié)點(diǎn)健康檢查和容錯(cuò)功能。
    4. 支持遠(yuǎn)程Fast CGI服務(wù)的緩存加速。
    5. 支持Fast CGI、Uwsgi、SCGI、Memcached Server的加速和緩存。
    6. 支持SSL、TLS、SNI。
    7. 具有模塊化的架構(gòu)。
    8. 過(guò)濾器包括gzip壓縮、ranges支持、chunked響應(yīng)、XSLT、SSL和圖像縮放等功能。
    9. 在SSL過(guò)濾器中,包含多個(gè)SSL頁(yè)面,如果經(jīng)由Fast CGI或反向代理處理,可以并行處理。
  • Nginx所具備的WWW服務(wù)特性

    1. 支持基于域名、端口和IP的虛擬主機(jī)配置。
    2. 支持KeepAlived和piplined連接。
    3. 可進(jìn)行簡(jiǎn)單、方便、靈活的配置和管理。
    4. 支持修改Nginx配置,并且在代碼上線(xiàn)時(shí),可平滑重啟,不中斷業(yè)務(wù)訪(fǎng)問(wèn)。
    5. 可自定義訪(fǎng)問(wèn)日志格式,臨時(shí)緩沖寫(xiě)日志操作,快速日志輪詢(xún)及通過(guò)rsyslog處理日志。
    6. 可利用信號(hào)控制Nginx進(jìn)程。
    7. 支持3xx-5xxHTTP狀態(tài)碼重定向。
    8. 支持rewrite模塊,支持URI重寫(xiě)及正則表達(dá)式匹配。
    9. 支持基于客戶(hù)端IP地址和HTTP基本認(rèn)證的訪(fǎng)問(wèn)控制。
    10. 支持PUT、DELETE、MKCOL、COPY、MOVE等特殊的HTTP請(qǐng)求方法。
    11. 支持FLV流和MP4流技術(shù)產(chǎn)品應(yīng)用。
    12. 支持HTTP響應(yīng)速率限制。
    13. 支持同一IP地址的并發(fā)連接或請(qǐng)求限制。
    14. 支持郵件服務(wù)代理。
    15. 支持高并發(fā),可以支持幾百萬(wàn)并發(fā)連接。
    16. 資源消耗少,在3萬(wàn)并發(fā)連接下,可以開(kāi)啟10個(gè)nginx的線(xiàn)程消耗的內(nèi)存不到200MB。
    17. 可以做HTTP反向代理及加速緩存,及負(fù)載均衡功能,內(nèi)置對(duì)RS節(jié)點(diǎn)服務(wù)器健康檢查功能,折現(xiàn)但能夠與專(zhuān)業(yè)的HAProxy或LVS的功能。
    18. 具備Squid等專(zhuān)業(yè)緩存軟件等的緩存功能。
    19. 支持異步網(wǎng)絡(luò)I/O事件模型epoll(Linux2.6+)。
  • Nginx軟件主要企業(yè)應(yīng)用

    1. 作為Web服務(wù)軟件。
    2. 使用Nginx運(yùn)行HTML、JS、CSS、小圖片等靜態(tài)數(shù)據(jù)(類(lèi)似于Lighttpd)。
    3. 結(jié)合Fast CGI運(yùn)行PHP等動(dòng)態(tài)程序(例如使用fastcgi_pass方式)。
    4. Nginx結(jié)合Tomcat/Resin等支持Java動(dòng)態(tài)程序(常用proxy_pass)。
    5. 反向代理或負(fù)載均衡服務(wù)(Nginx從1.9.0開(kāi)始就開(kāi)始支持TCP的代理了)。
    6. 前端業(yè)務(wù)數(shù)據(jù)緩存服務(wù)。
  • Web服務(wù)應(yīng)用產(chǎn)品性能對(duì)比

    1. 靜態(tài)數(shù)據(jù)的訪(fǎng)問(wèn)上:處理小文件(小于1MB)時(shí),Nginx和Lighttpd比Apache更有優(yōu)勢(shì),Nginx處理小文件的優(yōu)勢(shì)明顯,Lighttpd綜合最強(qiáng)。
    2. 動(dòng)態(tài)數(shù)據(jù)的訪(fǎng)問(wèn)上:三者差距不大,Apache更有優(yōu)勢(shì),因?yàn)樘幚韯?dòng)態(tài)數(shù)據(jù)的能力在于PHP(Java)和后端數(shù)據(jù)庫(kù)的服務(wù)能力,也就是說(shuō)瓶頸不在Web服務(wù)器上。
    3. 一般情況下普通PHP引擎支持的并發(fā)連接參考值300~1000。Java引擎和數(shù)據(jù)庫(kù)的并發(fā)連接參考值300~1500。
  • 為什么Nginx比Apache的性能高?

    1. Nginx使用最新版的eepoll(Linux 2.6內(nèi)核)和kqueue(FreeBSD)異步網(wǎng)絡(luò)I/O模型,而Apache使用的是傳統(tǒng)的select模型。
    2. 目前Linux下能夠承受高并發(fā)訪(fǎng)問(wèn)的Squid、Memcached軟件采用都是epoll模型。
    3. 處理大量的連接的讀寫(xiě)時(shí),Apache所采用的select網(wǎng)絡(luò)I/O模型比較低。
  • 如何正確采用Web服務(wù)器?

    1. 靜態(tài)業(yè)務(wù):如果是高并發(fā)場(chǎng)景,盡量采用Nginx或Lighttpd,二者首選Nginx。
    2. 動(dòng)態(tài)業(yè)務(wù):理論上采用Nginx和Apache均可,建議使用Nginx,為了避免相同業(yè)務(wù)服務(wù)的軟件多樣化,增加維護(hù)成本,動(dòng)態(tài)業(yè)務(wù)可以使用Nginx兼做前端代理,再根據(jù)頁(yè)面的元素或目錄轉(zhuǎn)發(fā)到其他的服務(wù)器進(jìn)行處理。
    3. 既有動(dòng)態(tài)業(yè)務(wù)又有靜態(tài)業(yè)務(wù),就用Nginx。

關(guān)于部署,就不在重復(fù)了,如果需要請(qǐng)移步《Java高級(jí)架構(gòu)之FastDFS分布式文件集群》:https://blog.51cto.com/xvjunjie/2377669

使用IDEA場(chǎng)景啟動(dòng)器創(chuàng)建工程

  • 創(chuàng)建Maven工程,修改POM.xml文件添加如下依賴(lài):
<dependencies>
    <!-- SpringBoot的自動(dòng)配置相關(guān)依賴(lài) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
        <version>1.5.20.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <version>1.5.20.RELEASE</version>
    </dependency>
    <!-- 日志相關(guān)的依賴(lài) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
        <version>1.5.20.RELEASE</version>
    </dependency>
    <!-- 對(duì)象池相關(guān)的依賴(lài) -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
        <version>2.6.0</version>
    </dependency>

</dependencies>

創(chuàng)建必要的包

  • annotation:存放相關(guān)的注解

  • autoconfiguation: 存儲(chǔ)自動(dòng)配置類(lèi)

  • factory: 存放工廠(chǎng)類(lèi)

  • properties: 存放配置參數(shù)類(lèi)

  • service: 存放服務(wù)類(lèi)

一般情況下,SpringBoot都會(huì)提供相應(yīng)的@EnableXxx注解標(biāo)注在應(yīng)用的主啟動(dòng)類(lèi)上開(kāi)啟某個(gè)功能:

// EnableFastdfsClient.java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(FastdfsAutoConfiguration.class)
@Documented
public @interface EnableFastdfsClient {
}

下面是相關(guān)的自動(dòng)配置類(lèi):

// FastdfsAutoConfiguration.java
@Configuration
@EnableConfigurationProperties(FastdfsProperties.class)
public class FastdfsAutoConfiguration {
    @Autowired
    private FastdfsProperties fastdfsProperties;

    @Bean
    @ConditionalOnMissingBean(FastdfsClientService.class)
    public FastdfsClientService fastdfsClientService() throws Exception {
        return new FastdfsClientService(fastdfsProperties);
    }
}

創(chuàng)建相關(guān)的工廠(chǎng)類(lèi):

// StorageClientFactory.java
// 用于創(chuàng)建連接對(duì)象的工廠(chǎng)類(lèi)
public class StorageClientFactory implements PooledObjectFactory<StorageClient> {

    @Override
    public PooledObject<StorageClient> makeObject() throws Exception {
        TrackerClient client = new TrackerClient();
        TrackerServer server = client.getConnection();
        return new DefaultPooledObject<>(new StorageClient(server, null));
    }

    @Override
    public void destroyObject(PooledObject<StorageClient> p) throws Exception {
        p.getObject().getTrackerServer().close();
    }

    @Override
    public boolean validateObject(PooledObject<StorageClient> p) {
        return false;
    }

    @Override
    public void activateObject(PooledObject<StorageClient> p) throws Exception {

    }

    @Override
    public void passivateObject(PooledObject<StorageClient> p) throws Exception {

    }
}

Properties類(lèi)用來(lái)映射application.properties或者application.yml配置文件:

// FastdfsProperties.java
@ConfigurationProperties(prefix = "fastdfs")
public class FastdfsProperties {
    // 連接超時(shí)時(shí)間
    // 網(wǎng)絡(luò)超時(shí)時(shí)間
    // 字符集編碼
    // 是否使用Token
    // Token加密密鑰
    // 跟蹤器IP地址,多個(gè)使用分號(hào)隔開(kāi)
    // 連接池的連接對(duì)象最大個(gè)數(shù)
    // 連接池的最大空閑對(duì)象個(gè)數(shù)
    // 連接池的最小空閑對(duì)象個(gè)數(shù)
    // Nginx服務(wù)器IP,多個(gè)使用分號(hào)分割
    // 獲取連接對(duì)象時(shí)可忍受的等待時(shí)長(zhǎng)(毫秒)
    private String connectTimeout = "5";
    private String networkTimeout = "30";
    private String charset = "UTF-8";
    private String httpAntiStealToken = "false";
    private String httpSecretKey = "";
    private String httpTrackerHttpPort = "";
    private String trackerServers = "";
    private String connectionPoolMaxTotal = "18";
    private String connectionPoolMaxIdle = "18";
    private String connectionPoolMinIdle = "2";
    private String nginxServers = "";

    // 需要?jiǎng)?chuàng)建相關(guān)的Setter和Getter方法
}

在Service類(lèi)中封裝方法, 下面僅展示3個(gè)常用的方法:

// FastdfsClientSerivce.java
public class FastdfsClientService {
    // SpringBoot加載的配置文件
    // 連接池配置項(xiàng)
    // 轉(zhuǎn)換后的配置條目
    // 連接池
    // Nginx服務(wù)器地址
    private FastdfsProperties fdfsProp;
    private GenericObjectPoolConfig config;
    private Properties prop;
    private GenericObjectPool<StorageClient> pool;
    private String[] nginxServers;
    private Logger logger;

    public FastdfsClientService(FastdfsProperties fdfsProp) throws Exception {
        this.fdfsProp = fdfsProp;
        this.logger = LoggerFactory.getLogger(getClass());
        init();
        create();
        info();
    }

    /**
     * 初始化全局客戶(hù)端
     */
    private void init() throws Exception {
        this.prop = new Properties();
        this.logger.info("FastDFS: reading config file...");
        this.logger.info("FastDFS: fastdfs.connect_timeout_in_seconds=" + this.fdfsProp.getConnectTimeout());
        this.logger.info("FastDFS: fastdfs.network_timeout_in_seconds=" + this.fdfsProp.getNetworkTimeout());
        this.logger.info("FastDFS: fastdfs.charset=" + this.fdfsProp.getCharset());
        this.logger.info("FastDFS: fastdfs.http_anti_steal_token=" + this.fdfsProp.getHttpAntiStealToken());
        this.logger.info("FastDFS: fastdfs.http_secret_key=" + this.fdfsProp.getHttpSecretKey());
        this.logger.info("FastDFS: fastdfs.http_tracker_http_port=" + this.fdfsProp.getHttpTrackerHttpPort());
        this.logger.info("FastDFS: fastdfs.tracker_servers=" + this.fdfsProp.getTrackerServers());
        this.logger.info("FastDFS: fastdfs.connection_pool_max_total=" + this.fdfsProp.getConnectionPoolMaxTotal());
        this.logger.info("FastDFS: fastdfs.connection_pool_max_idle=" + this.fdfsProp.getConnectionPoolMaxIdle());
        this.logger.info("FastDFS: fastdfs.connection_pool_min_idle=" + this.fdfsProp.getConnectionPoolMinIdle());
        this.logger.info("FastDFS: fastdfs.nginx_servers=" + this.fdfsProp.getNginxServers());

        this.prop.put("fastdfs.connect_timeout_in_seconds", this.fdfsProp.getConnectTimeout());
        this.prop.put("fastdfs.network_timeout_in_seconds", this.fdfsProp.getNetworkTimeout());
        this.prop.put("fastdfs.charset", this.fdfsProp.getCharset());
        this.prop.put("fastdfs.http_anti_steal_token", this.fdfsProp.getHttpAntiStealToken());
        this.prop.put("fastdfs.http_secret_key", this.fdfsProp.getHttpSecretKey());
        this.prop.put("fastdfs.http_tracker_http_port", this.fdfsProp.getHttpTrackerHttpPort());
        this.prop.put("fastdfs.tracker_servers", this.fdfsProp.getTrackerServers());
        ClientGlobal.initByProperties(this.prop);
    }
    /**
     * 顯示初始化信息
     */
    private void info() {
        this.logger.info("FastDFS parameter: ConnectionPoolMaxTotal ==> " + this.pool.getMaxTotal());
        this.logger.info("FastDFS parameter: ConnectionPoolMaxIdle ==> " + this.pool.getMaxIdle());
        this.logger.info("FastDFS parameter: ConnectionPoolMinIdle ==> " + this.pool.getMinIdle());
        this.logger.info("FastDFS parameter: NginxServer ==> " + Arrays.toString(this.nginxServers));
        this.logger.info(ClientGlobal.configInfo());
    }

    /**
     * 創(chuàng)建連接池
     */
    private void create() {
        this.config = new GenericObjectPoolConfig();
        this.logger.info("FastDFS Client: Creating connection pool...");
        this.config.setMaxTotal(Integer.parseInt(this.fdfsProp.getConnectionPoolMaxTotal()));
        this.config.setMaxIdle(Integer.parseInt(this.fdfsProp.getConnectionPoolMaxIdle()));
        this.config.setMinIdle(Integer.parseInt(this.fdfsProp.getConnectionPoolMinIdle()));
        StorageClientFactory factory = new StorageClientFactory();
        this.pool = new GenericObjectPool<StorageClient>(factory, this.config);
        this.nginxServers = this.fdfsProp.getNginxServers().split(",");
    }

    /**
     * Nginx服務(wù)器負(fù)載均衡算法
     *
     * @param servers 服務(wù)器地址
     * @param address 客戶(hù)端IP地址
     * @return 可用的服務(wù)器地址
     */
    private String getNginxServer(String[] servers, String address) {
        int size = servers.length;
        int i = address.hashCode();
        int index = abs(i % size);
        return servers[index];
    }

    /**
     * 帶有防盜鏈的下載
     *
     * @param fileGroup       文件組名
     * @param remoteFileName  遠(yuǎn)程文件名稱(chēng)
     * @param clientIpAddress 客戶(hù)端IP地址
     * @return 完整的URL地址
     */
    public String autoDownloadWithToken(String fileGroup, String remoteFileName, String clientIpAddress) throws Exception {
        int ts = (int) (System.currentTimeMillis() / 1000);
        String token = ProtoCommon.getToken(remoteFileName, ts, ClientGlobal.getG_secret_key());
        String nginx = this.getNginxServer(this.nginxServers, clientIpAddress);
        return "http://" + nginx + "/" + fileGroup + "/" + remoteFileName + "?token=" + token + "&ts=" + ts;
    }

    /**
     * 上傳文件,適合上傳圖片
     *
     * @param buffer 字節(jié)數(shù)組
     * @param ext    擴(kuò)展名
     * @return 文件組名和ID
     */
    public String[] autoUpload(byte[] buffer, String ext) throws Exception {
        String[] upload = this.upload(buffer, ext, null);
        return upload;
    }

    /**
     * 不帶防盜鏈的下載,如果開(kāi)啟防盜鏈會(huì)導(dǎo)致該方法拋出異常
     *
     * @param fileGroup       文件組名
     * @param remoteFileName  遠(yuǎn)程文件ID
     * @param clientIpAddress 客戶(hù)端IP地址,根據(jù)客戶(hù)端IP來(lái)分配N(xiāo)ginx服務(wù)器
     * @return 完整的URL地址
     */
    public String autoDownloadWithoutToken(String fileGroup, String remoteFileName, String clientIpAddress) throws Exception {
        if (ClientGlobal.getG_anti_steal_token()) {
            this.logger.error("FastDFS Client: You've turned on Token authentication.");
            throw new Exception("You've turned on Token authentication.");
        }
        String nginx = this.getNginxServer(this.nginxServers, clientIpAddress);
        return "http://" + nginx + fileGroup + "/" + remoteFileName;
    }

    // 后面還有好多方法,就不一一展示了
}

為了在IDEA中使用便捷的配置提示功能,我們需要?jiǎng)?chuàng)建元數(shù)據(jù)文件(resources/spring-configuration-metadata.json):

{
  "groups": [
    {
      "name": "fastdfs",
      "type": "com.bluemiaomiao.properties.FastdfsProperties",
      "sourceType": "com.bluemiaomiao.properties.FastdfsProperties"
    }
  ],
  "properties": [
    {
      "name": "connectTimeout",
      "type": "java.lang.String",
      "sourceType": "com.bluemiaomiao.properties.FastdfsProperties",
      "defaultValue": "5"
    },
    {
      "name": "networkTimeout",
      "type": "java.lang.String",
      "sourceType": "com.bluemiaomiao.properties.FastdfsProperties",
      "defaultValue": "30"
    },
    {
      "name": "charset",
      "type": "java.lang.String",
      "defaultValue": "UTF-8"
    },
    {
      "name": "httpAntiStealToken",
      "type": "java.lang.String",
      "sourceType": "com.bluemiaomiao.properties.FastdfsProperties",
      "defaultValue": "false"
    },
    {
      "name": "httpSecretKey",
      "type": "java.lang.String",
      "sourceType": "com.bluemiaomiao.properties.FastdfsProperties"
    },
    {
      "name": "httpTrackerHttpPort",
      "type": "java.lang.Integer",
      "sourceType": "com.bluemiaomiao.properties.FastdfsProperties"
    },
    {
      "name": "trackerServers",
      "type": "java.lang.String",
      "sourceType": "com.bluemiaomiao.properties.FastdfsProperties"
    },
    {
      "name": "connectionPoolMaxTotal",
      "type": "java.lang.Integer",
      "sourceType": "com.bluemiaomiao.properties.FastdfsProperties",
      "defaultValue": "18"
    },
    {
      "name": "connectionPoolMaxIdle",
      "type": "java.lang.Integer",
      "sourceType": "com.bluemiaomiao.properties.FastdfsProperties",
      "defaultValue": "18"
    },
    {
      "name": "connectionPoolMinIdle",
      "type": "java.lang.Integer",
      "sourceType": "com.bluemiaomiao.properties.FastdfsProperties",
      "defaultValue": "2"
    },
    {
      "name": "nginxServers",
      "type": "java.lang.String",
      "sourceType": "com.bluemiaomiao.properties.FastdfsProperties"
    }
  ],
  "hints": [
    {
      "name": "http_anti_steal_token",
      "values": [
        {
          "value": "false"
        },
        {
          "value": "true"
        }
      ]
    }
  ]
}

將自定義starter添加到項(xiàng)目

  • 創(chuàng)建SpringBoot項(xiàng)目,勾選Web選項(xiàng),版本選擇1.5.20

  • 進(jìn)入場(chǎng)景啟動(dòng)器的項(xiàng)目目錄執(zhí)行mvn clean install 將其安裝到本地

  • 在POM.xml文件中添加依賴(lài):
<dependency>
    <groupId>com.bluemiaomiao</groupId>
    <artifactId>fastdfs-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

記得開(kāi)啟IDEA的自動(dòng)導(dǎo)入功能

  • 創(chuàng)建配置文件application.properties
fastdfs.nginx-servers=192.168.80.2:8000,192.168.80.3:8000,192.168.80.4:8000
fastdfs.tracker-servers=192.168.80.2:22122,192.168.80.3:22122,192.168.80.4:22122
fastdfs.http-secret-key=2scPwMPctXhbLVOYB0jyuyQzytOofmFCBIYe65n56PPYVWrntxzLIDbPdvDDLJM8QHhKxSGWTcr+9VdG3yptkw
fastdfs.http-anti-steal-token=true
fastdfs.http-tracker-http-port=8080
fastdfs.network-timeout=30
fastdfs.connect-timeout=5
fastdfs.connection-pool-max-idle=18
fastdfs.connection-pool-min-idle=2
fastdfs.connection-pool-max-total=18
fastdfs.charset=UTF-8

或者使用application.yml

fastdfs:
  charset: UTF-8
  connect-timeout: 5
  http-secret-key: 2scPwMPctXhbLVOYB0jyuyQzytOofmFCBIYe65n56PPYVWrntxzLIDbPdvDDLJM8QHhKxSGWTcr+9VdG3yptkw
  network-timeout: 30
  http-anti-steal-token: true
  http-tracker-http-port: 8080
  connection-pool-max-idle: 20
  connection-pool-max-total: 20
  connection-pool-min-idle: 2
  nginx-servers: 192.168.80.2:8000,192.168.80.3:8000,192.168.80.4:8000
  tracker-servers: 192.168.80.2:22122,192.168.80.3:22122,192.168.80.4:22122
  • 創(chuàng)建控制器類(lèi)測(cè)試方法
// controllers.DownloadController.java
@Controller
@RequestMapping(value = "/download")
public class DownloadController {

    @Autowired
    private FastdfsClientService service;

    @ResponseBody
    @RequestMapping(value = "/image")
    public String image() throws Exception {
        // 之前上傳過(guò)的數(shù)據(jù),實(shí)際應(yīng)用場(chǎng)景應(yīng)該使用SQL數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)
        return service.autoDownloadWithToken("group1", "M00/00/00/wKhQA1ysjSGAPjXbAAVFOL7FJU4.tar.gz", "192.168.80.1");
    }
}
  • 項(xiàng)目主頁(yè):https://github.com/bluemiaomiao/fastdfs-spring-boot-starter
  • 國(guó)內(nèi)項(xiàng)目主頁(yè):https://gitee.com/bluemiaomiao/fastdfs-spring-boot-starter

網(wǎng)站名稱(chēng):SpringBoot集成FastDFS+Nginx整合基于Token的防盜鏈
本文地址:http://muchs.cn/article6/gecdig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、移動(dòng)網(wǎng)站建設(shè)自適應(yīng)網(wǎng)站、外貿(mào)建站網(wǎng)站導(dǎo)航、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化