• java学习day70-JT项目08(图片回显/Nginx)


    实现图片回显

    准备虚拟路径

    编辑image.properties

    说明:在jt-manager中创建image.properties文件,在其中编辑关于图片配置的所有信息.

    在这里插入图片描述

    重新编辑FileServiceImpl

    说明:实现虚拟路径配置,并且设定属性动态赋值操作.

    package com.jt.service;
    
    @Service
    @PropertySource("classpath:/properties/image.properties")
    public class FileServiceImpl implements FileService {
        //创建虚拟路径
        @Value("${image.urlPath}")
        String urlPath ;//= "http://image.jt.com";
        //创建根目录
        @Value("${image.localDirPath}")
        private String localDirPath ;//="D:/JT-SOFT/images";
        private  static Set<String> imageTypeSet = new HashSet<>();
        static {
            imageTypeSet.add(".jpg");
            imageTypeSet.add(".png");
            imageTypeSet.add(".gif");
        }
    
        /**
         *
         * 1.校验文件有效性. jpg/. png|. gif......
         * 2.校验文件是否为恶意程序 (木马. exe).jpg
         * 3.提高用户检索图片的效率  分目录存储.
         * 4.为了防止重名图片的提交自定义文件名称.
         * 5.实现图片的物理上传 本地磁盘中.
         * 6.准备一个访问图片的虚拟路径
         *  @param uploadFile
         * @return
         */
    
        @Override
        public ImageVO upload(MultipartFile uploadFile) {
            //1 校验图片类型 1) 利用正则表达式进行校验 2)指定一个集合进行校验
            //1.1获取文件名称
            String fileName= uploadFile.getOriginalFilename();
            fileName = fileName.toLowerCase();
            //1.2获取文件名称后缀,然后将获取的后缀转为小写
            String fileType = fileName.substring(fileName.lastIndexOf("."));
    
            //进行校验
            if (!imageTypeSet.contains(fileType)){
                //如果类型不匹配,应该告诉用户上传图片有误
                //
                return ImageVO.fail();
            }
            //.校验文件是否为恶意程序 (木马. exe).jpg 方法:通过图片的特有属性进行校验
            try {
               //2.1  将上传的图片利用图片API进行转化,如果不能成功转化则一定不是图片
                BufferedImage bufferedImage = ImageIO.read(uploadFile.getInputStream());
                //校验图片的特有属性 宽度和高度
                int width = bufferedImage.getWidth();
                int height = bufferedImage.getHeight();
                if (width==0 || height == 0){
                    //如果获取的宽或者高为0 则不是图片
                    return  ImageVO.fail();
                }
    
            } catch (IOException e) {
                e.printStackTrace();
                return  ImageVO.fail();
            }
            //实现分目录存储 方案1 利用hash 之后每隔2-3位进行
            //方案2 通过时间来划分目录
            //获取格式化时间 利用工具API
            String datePath = new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
            //创建文件目录 2部分 根目录+时间目录
            String localDir = localDirPath+datePath;
            File dirFile = new File(localDir);
            if (!dirFile.exists()){
                dirFile.mkdirs();
            }
            //4防止文件重名,需要自定义名称 UUID
            //4.1 生成uuid
            String uuid = UUID.randomUUID().toString().replace("-","");
            //4.2 动态生成文件名称
            String uuidFileName = uuid+fileType;
            //5 实现文件上传 准备文件全路径
            String realFilePath = localDir+uuidFileName;
            //5.1 封装文件真实对象
            File imageFile = new File(realFilePath);
            //5.2 实现文件上传
            try {
                uploadFile.transferTo(imageFile);
    
            } catch (IOException e) {
                e.printStackTrace();
                return  ImageVO.fail();
            }
    
            //6.暂时使用虚拟路径
            //拼接指定的虚拟路径
            String url =urlPath+datePath+uuidFileName;
            return ImageVO.success(url);
        }
    }
    
    

    反向代理/正向代理说明

    关于代理映射的说明

    在这里插入图片描述

    反向代理(必会)

    反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
    特点:

    • 反向代理服务器位于用户和目标服务器之间.
    • 反向代理服务器就相当于目标服务器.(用户以为代理服务器就是真实服务器)
    • 用户通过反向代理服务器获取资源 而不是直接访问真实服务器.
    • 用户不清楚真实的服务器到底是谁.
    • 反向代理是服务器端代理.保护真实服务器信息.

    特征: 用户不清楚真实目标服务器是谁.

    情景题:
    人物介绍:
    A. 你 年薪800万 废物利用回收公司CEO 今年60 寻以为18-25岁 适龄女青年 共度余生
    B. 女生 : 特漂亮 身材好 标准: 事业有成 年龄无所谓(为人低调 害羞)
    C. 女闺蜜: 告诉她 帮我瞧瞧这老头 到底还能多久. 看看我委屈几年…
    约会地点: 三里屯 夜色酒吧 8号卡座 A-----女闺蜜------女生

    正向代理(必会)

    正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
    特点:
    1.代理服务器位于用户和服务器之间
    2.用户发起请求之前已经清楚的知道谁的目标服务器.
    3.用户通过代理服务器到指定的目标服务器获取资源.
    4.正向代理保护的是客户端信息,是客户端代理

    在这里插入图片描述

    关于正向/反向代理总结

    1. 正向代理是客户端代理,用户清楚的知道访问的服务器是谁. 保护了客户端信息
    2. 反向代理是服务器端代理.用户不清楚访问的真实服务到底是谁. 保护了服务端信息

    nginx

    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网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

    特点: 占有内存少 不超过2M ,并发能力强 3-5万次/秒

    Nginx下载

    在这里插入图片描述

    Nginx的安装

    注意事项: Nginx安装目录 不要装到C盘,并且路径不要有中文 空格 及系统目录.

    在这里插入图片描述

    Nginx 启动

    说明:双击nginx.exe 之后检查系统的启动项,
    访问网址: localhost:80,默认的是80端口

    通过任务管理器可以查询nginx是否正常启动

    在这里插入图片描述

    通过浏览器访问,如果出现以下页面则表示正常

    在这里插入图片描述

    关于nginx 进程项说明

    内存占用大的是主进程.需要先结束守护进程,才可以结束主进程(手动方式关闭的话)

    在这里插入图片描述

    关于nginx 操作命令

    命令执行位置: 执行命令时需要在nginx的根目录中执行.

    在这里插入图片描述

    之后地址栏中 键入 cmd进入dos命令创建中.

    在这里插入图片描述

    Nginx主要命令,使用命令启动的话,需要进入到程序的根目录下

    启动命令 start nginx
    重启命令 nginx -s reload
    关闭命令 nginx -s stop
    

    关于Nginx反向代理配置

    http {
    	#http协议内,可以有多个服务 每个服务就是一个server
        server {
        	# 监听用户访问的端口   默认是80端口
            listen       80;   
            # server_name 服务名称  浏览器的访问域名
            server_name  localhost;
    		#配置反向代理的实现  / 拦截所有的用户请求
            location / {
            	# root代表关键字   代表反向代理的目录
                root   html;
                # index 代表默认的访问页面
                index  index.html index.htm;
            }
          }
       }
    
    

    反向代理目录以及访问页面展示

    image-20200807184951666

    配置nginx图片服务器

    反向代理说明

    1.url地址: http://image.jt.com/2020/08/07/cc10f60491234317adf800aeafc6af1f.png
    2.本地磁盘地址: D:/JT-SOFT/images/2020/08/07/cc10f60491234317adf800aeafc6af1f.png
    目标:通过域名访问真实的磁盘地址.
    可以利用nginx的反向代理完成配置.

    编辑Nginx配置文件

    现象: nginx -s reload指令 可以展现报错信息.
    start nginx 无论启动是否成功 ,都不能展现报错.

    习惯: 启动nginx之后,最好执行重启指令.

    新增一个server,注意格式,必须要严格按照标准写,例如分号的书写

    # 配置图片服务器
    	server {
    		listen 80;
    		server_name image.jt.com;
    
    		##通过网址转向指定的目录  注意/的写法
    		location / {
    		
    			root D:/JT-SOFT/images;
    		}
    	}
    

    网络资源访问请求路径

    说明:通过hosts文件可以配置域名与IP地址的映射.那么在本机中可以实现反向代理,如果将来想要在公网中进行反向代理.则必须购买域名.

    在这里插入图片描述

    修改HOSTS文件

    说明: 每个操作系统针对开发人员,在本地都会有一个hosts文件可以编辑.
    windows: C:WindowsSystem32driversetc

    在这里插入图片描述

    利用工具软件管理HOSTS文件:

    京淘配置
    #左侧写IP地址 右侧写域名 中间使用空格分隔 配置内容
    127.0.0.1 image.jt.com
    127.0.0.1 manager.jt.com
    127.0.0.1 www.jt.com
    127.0.0.1 sso.jt.com

    在这里插入图片描述

    修改hosts文件权限

    方式1:直接对当前的用户名或组添加权限,标记所有的权限

    在这里插入图片描述

    方式2: 以超级管理员的方式运行Switch hosts软件

    在这里插入图片描述

    方式3: 添加指定的用户权限 步骤 1.获取当前计算机的名称 2.添加用户信息.
    注意事项: 计算机名称不要写中文.

    在这里插入图片描述

    关于Nginx图片回显异常说明

    1. 检查HOSTS文件配置正常.
    # 京淘配置  
    #左侧写IP地址   右侧写域名  中间使用空格分隔
    127.0.0.1   image.jt.com
    127.0.0.1   manager.jt.com
    127.0.0.1   www.jt.com
    127.0.0.1   sso.jt.com
    

    2.检查nginx配置文件是否正确

    # 配置图片服务器
    	server {
    		listen 80;
    		server_name image.jt.com;
    
    		##通过网址转向指定的目录  注意/的写法
    		location / {
    		
    			root D:/JT-SOFT/images;
    		}
    	}
    
    

    3.重启nginx
    在重启之前检查是否有多余的nginx服务项,如果有则关闭.

    在这里插入图片描述

    4.hosts文件是否生效

    在这里插入图片描述

    5.根据请求路径 检查代码中路径的拼接是否正常.

    尤其是"/"的检查

    http://image.jt.com/2020/08/07/cc10f60491234317adf800aeafc6af1f.png
    D:JT-SOFTimages/2020/08/07/cc10f60491234317adf800aeafc6af1f.png

    nginx域名代理

    业务需求

    要求:用户通过http://manager.jt.com的方式 访问localhost:8091的服务器.
    利用反向代理的方式实现该功能.

    配置nginx

    # 商品管理服务器  监听的是用户 manager.jt.com:80  映射的是url地址
    	server {
    		listen   80;
    		server_name  manager.jt.com;
    
    		#进行反向代理
    		location / {
    			#映射的url请求网址.
    			proxy_pass http://localhost:8091;
    		}  
    	}
    
    

    访问效果

    在这里插入图片描述

    image-20200807191211529

    Nginx属性学习

    Nginx负载均衡原理

    在这里插入图片描述

    Nginx 集群搭建

    说明: 要求启动3台服务器,运行jt-manager项目 端口号分别为8081/8082/8083, 通过/getPort请求,获取当前服务器端口号信息并且字符串返回.

    动态获取当前服务器端口号

    目的:为了能够在以后的负载均衡访问时看到自己访问的服务器到底是谁.

    package com.jt.controller;S
    
    @RestController
    public class PortController {
        @Value("${server.port}")
        private Integer port;
        @RequestMapping("/getPort")
        public String getPort(HttpServletRequest request){
          //  int port =request.getLocalPort();
            return "当前的端口为"+port;
        }
    }
    
    

    发布3台tomcat服务器

    要求端口号:8081/8082/8083.
    步骤:
    1.将项目打包 将项目先clean- build----install,然后运行,最后刷新磁盘目录

    在这里插入图片描述

    2.准备部署路径,之后将war包上传

    在这里插入图片描述

    3.利用命令运行服务器

    在这里插入图片描述

    image-20200807191817216

    按照以上步骤一次部署到三台服务器上

    轮询策略

    说明: 根据nginx的配置文件,依次访问服务器.

    在nginx配置文件中添加以下配置

    # 商品管理服务器  监听的是用户 manager.jt.com:80  映射的是url地址
    	server {
    		listen   80;
    		server_name  manager.jt.com;
    
    		#进行反向代理
    		location / {
    			#映射的url请求网址.
    			#proxy_pass http://localhost:8091;
    			proxy_pass  http://jtWindows;
    		}  
    	}
    	#该配置在http标签之下配置
    	#配置集群  1.默认方式   轮询策略
    	upstream jtWindows {
    
    		server localhost:8081;
    		server localhost:8082;
    		server localhost:8083;
    	}
    

    权重策略

    说明: 性能越高的服务器,则承担的压力也就越高.

    #配置集群  1.默认方式   轮询策略   2.权重策略 
    	upstream jtWindows {
    		#weight的值越大,权重也也越大
    		server localhost:8081  weight=6;
    		server localhost:8082  weight=3;
    		server localhost:8083  weight=1;
    	}
    
    

    IPHASH策略

    需求: 有时在访问时可能会固定的访问某台服务器. 将用户与服务器进行绑定. 以后用户只能访问该服务器.
    算法: IPHASH算法.

    其中的N 代表的是服务器的个数

    在这里插入图片描述

    配置如下:

    	#配置集群  1.默认方式   轮询策略   2.权重策略   3.IPhash策略
    	upstream jtWindows {
    	# 配置IPHASH策略
    		ip_hash;
    		server localhost:8081  weight=6;
    		server localhost:8082  weight=3;
    		server localhost:8083  weight=1;
    	}
    
    

    弊端:

    1. 用户与服务器进行绑定,当服务器宕机时则可能影响用户的使用.
    2. 由于访问是通过算数计算的结果,可能导致严重的负载不均的现象.

    Nginx 高级属性

    down属性

    说明:nginx在不做任何的配置时,无法感知服务器是否正常运行.所有会频繁的访问故障机.
    解决方案: 可以利用down属性 来标识故障机.

    #配置集群  1.默认方式   轮询策略   2.权重策略   3.IPhash策略
    	upstream jtWindows {
    		#ip_hash;    server localhost:8081  weight=6;
    		server localhost:8081 down;
    		server localhost:8082 ;
    		server localhost:8083 ;
    	}
    
    

    备用机策略

    说明:正常情况下一般服务器部署时需要准备几台服务器当做备用.正常的情况下该服务器不参与工作.只有当主机遇忙时/或者宕机时.该服务器才会工作.

    配置方式:

    #配置集群  1.默认方式   轮询策略   2.权重策略   3.IPhash策略
    	upstream jtWindows {
    		#ip_hash;    server localhost:8081  weight=6;
    		server localhost:8081 down;
    		server localhost:8082 down;
    		server localhost:8083 backup;
    	}
    
    
    

    nginx高可用配置

    说明:当tomcat服务器宕机时,可以通过如下的配置,实现服务器的自动的切换.无需人为的干预.

    配置信息:
    fail_timeout=60s; 设定超时时间(定义一个周期),如果出现访问失败的话,那么在该周期不会再次访问,直到下一个周期
    max_fails=1 设定最大的访问失败次数.

    #配置集群  1.默认方式   轮询策略   2.权重策略   3.IPhash策略
    	upstream jtWindows {
    		#ip_hash;    server localhost:8081  weight=6;
    		server localhost:8081 max_fails=1 fail_timeout=60s;
    		server localhost:8082 max_fails=1 fail_timeout=60s;
    		server localhost:8083 max_fails=1 fail_timeout=60s;
    	}
    
    
  • 相关阅读:
    Java工具类——UUIDUtils
    Python中的split()函数的用法
    学习笔记
    hdu 1558 线段相交+并查集
    hdu 4609 FFT
    hdu1402 FFT入门
    多项式乘法快速算法
    FFT
    GDUT校赛
    light oj 1236 分解质因数
  • 原文地址:https://www.cnblogs.com/liqbk/p/13455050.html
Copyright © 2020-2023  润新知