乐趣区

关于springboot:京淘-day08

  1. 文件上传优化

==========

1.1 url 优化

阐明: 如果须要通过网络虚构门路拜访服务器. 则应该依照如下的配置实现.

  1. 本地磁盘门路: D:JT-SOFTimages20200930a.jpg
  2. 网络虚构门路: http://image.jt.com20200930a.jpg

1.2 编辑 pro 配置文件

1.3 实现属性的动静赋值

`package com.jt.service;

import com.jt.vo.ImageVO;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;

@Service
@PropertySource("classpath:/properties/images.properties") // 容器动静加载指定的配置文件
public class FileServiceImpl implements FileService{

    // 因为属性的值前期可能会发生变化, 所以应该动静的获取属性数据. 利用 pro 配置文件
    @Value("${image.rootDirPath}")
    private String rootDirPath;             //   = "D:/JT-SOFT/images";
    @Value("${image.urlPath}")
    private String urlPath;                 // = "http://image.jt.com";

    //1.2 筹备图片的汇合  蕴含了所有的图片类型.
    private static Set<String> imageTypeSet;
    static {imageTypeSet = new HashSet<>();
        imageTypeSet.add(".jpg");
        imageTypeSet.add(".png");
        imageTypeSet.add(".gif");
    }

    /**
     * 欠缺的校验的过程
     * 1. 校验是否为图片
     * 2. 校验是否为恶意程序
     * 3. 避免文件数量太多, 分目录存储.
     * 4. 避免文件重名
     * 5. 实现文件上传.
     * @param uploadFile
     * @return
     */
    @Override
    public ImageVO upload(MultipartFile uploadFile) {
        //0. 避免有多余的空格 所以先做去空格的解决
        rootDirPath.trim();
        urlPath.trim();

        //1. 校验图片类型  jpg|png|gif..JPG|PNG....
        //1.1 获取以后图片的名称 之后截取其中的类型.   abc.jpg
        String fileName = uploadFile.getOriginalFilename();
        int index = fileName.lastIndexOf(".");
        String fileType = fileName.substring(index);
        // 将数据转化为小写
        fileType = fileType.toLowerCase();
        //1.3 判断图片类型是否正确.
        if(!imageTypeSet.contains(fileType)){
            // 图片类型不匹配
            return ImageVO.fail();}

        //2. 校验是否为恶意程序 依据宽度 / 高度进行判断
        try {
            //2.1 利用工具 API 对象 读取字节信息. 获取图片对象类型
            BufferedImage bufferedImage = ImageIO.read(uploadFile.getInputStream());
            //2.2 校验是否有宽度和高度
            int width = bufferedImage.getWidth();
            int height = bufferedImage.getHeight();
            if(width==0 || height==0){return ImageVO.fail();
            }

            //3. 分目录存储  yyyy/MM/dd 分隔
            //3.1 将工夫依照指定的格局要求 转化为字符串.
            String dateDir = new SimpleDateFormat("/yyyy/MM/dd/")
                             .format(new Date());
            //3.2 拼接文件存储的目录对象
            String fileDirPath = rootDirPath + dateDir;
            File dirFile = new File(fileDirPath);
            //3.3 动态创建目录
            if(!dirFile.exists()){dirFile.mkdirs();
            }

            //4. 避免文件重名  uuid.jpg 动静拼接
            //4.1 动静生成 uuid  实现文件名称拼接  名. 后缀
            String uuid =
                    UUID.randomUUID().toString().replace("-", "");
            String realFileName = uuid + fileType;

            //5 实现文件上传
            //5.1 拼接文件实在门路 dir/ 文件名称.
            String realFilePath = fileDirPath + realFileName;
            //5.2 封装对象  实现上传
            File realFile = new File(realFilePath);
            uploadFile.transferTo(realFile);

            // 实现文件上传胜利!!! http://image.jt.com20200930a.jpg
            String url = urlPath + dateDir + realFileName;
            return ImageVO.success(url,width,height);
        } catch (IOException e) {e.printStackTrace();
            return ImageVO.fail();}
    }
}` 


2 反向代理机制阐明

2.1 为什么须要反向代理

需要: 当实现文件上传时, 业务返回页面的是虚拟地址门路
url 地址: http://image.jt.com/2020/09/30/a.jpg
实在图片地址: file:///D:/JT-SOFT/image/2020/09/30/d534bed912c748b0ac979ee40222490a.jpg
问题: 如何让用户通过 url 拜访 找到实在的磁盘地址的图片.

2.2 反向代理机制

2.2.1 反向代理介绍

反向代理服务器位于用户与指标服务器之间 ,然而对于用户而言,反向代理服务器就相当于指标服务器,即 用户间接拜访反向代理服务器就能够取得指标服务器的资源 。同时,用户 不须要晓得指标服务器的地址 ,也毋庸在用户端作任何设定。反向代理服务器通常可用来作为 Web 减速,即应用反向代理作为 Web 服务器的前置机来升高网络和服务器的负载,进步拜访效率。
概括:
1. 位于用户 (客户端)- 服务器之间.
2. 用户拜访反向代理服务器, 认为是实在的服务器信息.
3. 用户基本不分明实在的服务器信息到底是谁.
4. 个别反向代理机制爱护了实在的服务器信息, 所以也称之为 服务器端代理.

2.3 正向代理机制

2.3.1 需要引入

1. 宽带: 电信运营商 账号 / 明码 只能被一台机器应用.
2. 路由器: 在家庭的外部创立了局域网 使得局域网中的设施能够通过路由器的性能与外界通信.

2.3.2 正向代理介绍

正向代理,意思是一个位于客户端和原始服务器 (origin server) 之间的服务器,为了从原始服务器获得内容,客户端向代理发送一个申请并指定指标 (原始服务器),而后代理向原始服务器转交申请并将取得的内容返回给客户端。客户端能力应用正向代理。
总结:
1. 正向代理位于客户与服务器之间
2. 客户端在发动申请之前 确定了指标服务器的地址.
3. 服务器不分明到底是哪台客户端拜访的我, 认为只是路由器拜访的.
4. 正向代理爱护了客户的信息, 所以也称之为 客户端代理

2.4 Nginx

2.4.1 Nginx 介绍

Nginx (engine x) 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务。Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.ru 站点(俄文:Рамблер)开发的,第一个公开版本 0.1.0 公布于 2004 年 10 月 4 日。
其将源代码以类 BSD 许可证的模式公布,因它的稳定性、丰盛的功能集、示例配置文件和低系统资源的耗费而闻名。2011 年 6 月 1 日,nginx 1.0.4 公布。
Nginx 是一款轻量级的 Web 服务器 / 反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在 BSD-like 协定下发行。其特点是占有内存少,并发能力强,事实上 nginx 的并发能力在同类型的网页服务器中体现较好,中国大陆应用 nginx 网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

特点:
1. 内存少 不超过 2M tomcat 服务器大概占用 600M
2. 并发能力强 3- 5 万次 / 秒 tomcat 服务器大概 150-220 之间

2.4.2 Nginx 装置应用


注意事项:

  1. 不要将 nginx 放到 C 盘及系统目录中 留神中文门路和空格.
  2. nginx 服务器启动的速度特地快, 窗口会闪退 只启动一次即可
  3. nginx 启动会占用 80 端口.
  4. nginx 命令的运行必须在 nginx.exe 所在的目录中执行.

2.4.2 Nginx 命令

1). 启动命令 start nginx
2). 重启命令 nginx -s reload
3). 进行命令 nginx -s stop

2.4.3 Nginx 服务器启动项阐明

2.4.4 对于 nginx 反向代理阐明

 `http {
    # 一个反向代理就是一个 server
    server {
        #监听 80 端口
        listen       80;
        #监听的域名  域名不能反复.
        server_name  localhost;
        #执行的反向代理的动作   / 拦挡所有的门路
        location / {
            # root 关键字  代理的是一个目录
            root   html;
            #默认跳转页面
            index  index.html index.htm;
        }    
    }

}` 



2.5 Nginx 实现图片回显

2.5.1 NGINX 配置

`# 图片服务器代理   image.jt.com:80
    server {
        listen 80;
        server_name image.jt.com;

        location / {
            # 转向目录
            root D:/JT-SOFT/images;
        }
    }` 

2.5.2 批改 hosts 文件

1.HOSTS 文件的阐明:

2.HOSTS 文件的地位

3). 以超级管理员身份运行

`# 京淘配置  
#左侧写 IP 地址   右侧写域名  两头应用空格分隔
127.0.0.1   image.jt.com
127.0.0.1   manage.jt.com

#实现 nginx 的
#192.168.126.129   image.jt.com
#192.168.126.129   manage.jt.com
127.0.0.1   www.jt.com
#Bug 有时在应用该软件时可能会呈现失落字母的景象.
127.0.0.1   sso.jt.com` 



3.nginx 实现 tomcat 集群部署

3.1 我的项目部署

3.2 服务器反向代理

 `# 配置京淘后盾治理服务器
    # manage.jt.com  localhost:8091 服务器
    server {
        listen 80;
        server_name manage.jt.com;

        location / {

            #映射服务器
            proxy_pass  http://localhost:8091;
        }
    }` 

批改 nignx 服务器之后, 重启 nginx

3.3 动静获取以后服务器端口号

`@RestController
public class PortController {

    // 从 spring 服务器中动静的获取端口号
    @Value("${server.port}")
    private Integer port;

    @RequestMapping("/getPort")
    public String getPort(){return "以后服务器拜访的端口号:"+port;}
}` 

3.4 我的项目打包



之后从我的项目的 target 目录中动静获取 jar 包文件 筹备集群部署.

3.4 我的项目发布命令

注意事项: 以后的命令执行 会占用 dos 命令窗口 打印控制台信息. 当 dos 命令窗口敞开 服务器进行.
退出 dos 命令窗口: ctrl + c

`java:     java     -jar   8081.war` 

*   1

3.4 nginx 负载平衡实现

3.4.1 轮询机制

阐明: 依照配置文件的程序 顺次拜访服务器.

`# 配置京淘后盾治理服务器
    # manage.jt.com  localhost:8091 服务器
    server {
        listen 80;
        server_name manage.jt.com;

        location / {

            #映射服务器
            #proxy_pass  http://localhost:8091;
            proxy_pass   http://jtWindows;    
        }
    }

    # 配置 tomcat 服务器集群  1. 轮询策略
    upstream jtWindows {

        #server 代表服务器地址
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;    
    }` 


3.4.2 权重机制

阐明: 依照权重的设置, 让性能更优的服务器多解决申请.

`# 配置 tomcat 服务器集群  1. 轮询策略  2. 权重策略
    upstream jtWindows {

        #server 代表服务器地址
        server 127.0.0.1:8081 weight=8;
        server 127.0.0.1:8082 weight=2;    
    }` 

3.4.3 IPHASH 策略(理解)

因为某些数据与服务器进行了绑定, 则起初必须要求用户拜访指定的服务器时, 应用 IPHASH 策略

`# 配置 tomcat 服务器集群  1. 轮询策略  2. 权重策略  3.iphash 策略
    upstream jtWindows {

        #server 代表服务器地址
        ip_hash;
        server 127.0.0.1:8081 weight=8;
        server 127.0.0.1:8082 weight=2;    
    }` 

作业

1. 装置 VMware 虚拟机程序

2. 查看网卡设置
如果没有网卡 则换一个 vmwar 版本装置…

  1. 启动 Linux 零碎



问题形容:
进入 BIOS 零碎中 开启虚拟化设置即可. 主板零碎 开机 F1/F2…

退出移动版