说明:在jt-manager中创建image.properties文件,在其中编辑关于图片配置的所有信息.
说明:实现虚拟路径配置,并且设定属性动态赋值操作.
@Service @PropertySource("classpath:/properties/image.properties") public class FileServiceImpl implements FileService{ //定义图片的类型集合. private static Set<String> imageTypeSet = new HashSet<>(); //为属性动态赋值. @Value("${image.localDirPath}") private String localDirPath; // = "D:/JT-SOFT/images"; //定义本地磁盘目录 @Value("${image.urlPath}") private String urlPath; //= "http://image.jt.com"; //定义了虚拟路径的域名 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.利用集合进行校验 Set 数据是否存在即可. //1.1 获取图片名称 abc.jpg ABC.JPG String fileName = uploadFile.getOriginalFilename(); fileName = fileName.toLowerCase(); //将所有的字母都小写 //1.2 获取图片的类型 int index = fileName.lastIndexOf("."); String fileType = fileName.substring(index); //.jpg if(!imageTypeSet.contains(fileType)){ //如果类型不匹配 return ImageVO.fail(); //图片上传失败. } //2.如何判断文件是否为恶意程序? 文件是否有图片的特有属性!!!! //2.1将上传的文件类型利用图片的API进行转化 如果转化不成功则一定不是图片. try { BufferedImage bufferedImage = ImageIO.read(uploadFile.getInputStream()); //2.2校验是否有图片的特有属性 高度/宽度 int width = bufferedImage.getWidth(); int height = bufferedImage.getHeight(); //2.3校验宽度和高度是否有值. if(width == 0 || height == 0){ return ImageVO.fail(); } } catch (IOException e) { e.printStackTrace(); return ImageVO.fail(); //返回失败即可 } //3.实现分目录存储 // 方案1: 利用hash之后每隔2-3位截取之后拼接 // 方案2: 以时间为单位进行分隔 /yyyy/MM/dd/ //3.1 利用工具API将时间转化为指定的格式 String datePath = new SimpleDateFormat("/yyyy/MM/dd/").format(new Date()); //3.2 动态生成文件目录 2部分=根目录+时间目录 String localDir = localDirPath + datePath; //3.3判断目录是否存在, 如果不存在则新建目录 File dirFile = new File(localDir); if(!dirFile.exists()){ dirFile.mkdirs(); //如果不存在,则新建目录 } //4. 防止文件重名,需要自定义文件名称 UUID //4.1生成uuid String uuid = UUID.randomUUID().toString().replace("-", ""); //4.2动态生成文件名称 uuid +.jpg 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.实现路径拼接 //图片存储的根目录 D:\JT-SOFT\images\2020\08\07\0e2ee0014382423b93c53d9b2decc5ec.jpg //拼接指定的虚拟路径. 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.正向代理保护的是客户端信息,是客户端代理
正向代理是客户端代理,用户清楚的知道访问的服务器是谁. 保护了客户端信息 反向代理是服务器端代理.用户不清楚访问的真实服务到底是谁. 保护了服务端信息\
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安装目录 不要装到C盘,并且路径不要有中文 空格 及系统目录.
说明:双击nginx.exe 之后检查系统的启动项, 访问网址: localhost:80
内存占用大的是主进程.
手动关闭Nginx 方式:先关闭守护,之后关闭主
命令执行位置: 执行命令时需要在nginx的根目录中执行.
之后地址栏中 键入 cmd进入dos命令创建中.
启动命令 start nginx重启命令 nginx -s reload关闭命令 nginx -s stop1.url地址: http://image.jt.com/2020/08/07/cc10f60491234317adf800aeafc6af1f.png 2.本地磁盘地址: D:\JT-SOFT\images/2020/08/07/cc10f60491234317adf800aeafc6af1f.png 目的:通过域名访问真实的磁盘地址. 可以利用nginx的反向代理完成配置.
现象: nginx -s reload指令 可以展现报错信息. start nginx 无论启动是否成功 ,都不能展现报错.
习惯: 启动nginx之后,最好执行重启指令.
# 配置图片服务器 server { listen 80; server_name image.jt.com; ##通过网址转向指定的目录 注意/的写法 location / { root D:/JT-SOFT/images; } }说明:通过hosts文件可以配置域名与IP地址的映射.那么在本机中可以实现反向代理,如果将来想要在公网中进行反向代理.则必须购买域名.
说明: 每个操作系统针对开发人员,在本地都会有一个hosts文件可以编辑. windows: C:\Windows\System32\drivers\etc
利用工具软件管理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方式1:
方式2: 以超级管理员的方式运行Switch hosts软件
方式3: 添加指定的用户权限 步骤 1.获取当前计算机的名称 PC 2.添加用户信息. 注意事项: 计算机名称不要写中文.
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.com2.检查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-SOFT\images/2020/08/07/cc10f60491234317adf800aeafc6af1f.png要求:用户通过http://manager.jt.com的方式 访问localhost:8091的服务器. 利用反向代理的方式实现该功能.
说明: 要求启动3台服务器,运行jt-manager项目 端口号分别为8081/8082/8083, 通过/getPort请求,获取当前服务器端口号信息并且字符串返回.
目的:为了能够在以后的负载均衡访问时看到自己访问的服务器到底是谁.
package com.jt.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class PortController { //考点:动态复制操作 @Value("${server.port}") private Integer port; @RequestMapping("/getPort") public String getPort(){ return "当前访问的端口号:"+port; } }要求端口号:8081/8082/8083. 步骤: 1.将项目打包 将项目先clean- build----install
2.准备部署路径,之后将war包上传
3.利用命令运行服务器
4.访问测试
说明: 根据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; } } #配置集群 1.默认方式 轮询策略 upstream jtWindows { server localhost:8081; server localhost:8082; server localhost:8083; }说明: 性能越高的服务器,则承担的压力也就越高.
#配置集群 1.默认方式 轮询策略 2.权重策略 upstream jtWindows { server localhost:8081 weight=6; server localhost:8082 weight=3; server localhost:8083 weight=1; }需求: 有时在访问时可能会固定的访问某台服务器. 将用户与服务器进行绑定. 以后用户只能访问该服务器. 算法: IPHASH算法.
配置:
#配置集群 1.默认方式 轮询策略 2.权重策略 3.IPhash策略 upstream jtWindows { ip_hash; server localhost:8081 weight=6; server localhost:8082 weight=3; server localhost:8083 weight=1; }弊端:
用户与服务器进行绑定,当服务器宕机时则可能影响用户的使用.由于访问是通过算数计算的结果,可能导致严重的负载不均的现象.说明: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; }说明:当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; }配置说明: 如果nginx访问某台服务器时,如果该服务器访问失败,失败的次数达到最大失败次数时.在60秒之内,nginx不会再次访问故障机.直到下一个周期.