发表于: 2021-10-16 23:08:09

1 954


一,今天完成的事情

任务七。

1,把项目部署到Linux云。

/usr/local/jarwar 上传包

url地址/register_upload/ 可以访问


2,导出sql,但是表内信息不导出,只导出创建数据库,创建表相关语句。

mysql> show tables;

+---------------------------+

| Tables_in_register_upload |

+---------------------------+

| user                      |

+---------------------------+


3,测试Linux云上的包。

1)email注册。成功。


2)用1)中的用户名和email依次登录。2种都成功。

3)手机号注册。成功。


4)用3)中的用户名和手机号依次登录。2种都成功。


5) 测试上传图片功能,上传本地图片。成功。


4,任务七深度思考

1.什么是Annotation,怎么自定义AnnotationAnnotationXML的优缺点各是什么?   

1,在Java中,注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 java.lang.annotation 包中。

2,自定义Annotation的问题,一定涉及元注解来描述其它注解。元注解的作用就是用来描述其他注解的。Java5.0定义了4个标准的元数据类型,它们用来对提供注解类型做说明。@Target@Retetion@Documented@Inherited 这四个。参考例子,定义注解。

3AnnotationXML的优缺点

(1)xml的优点:

xml 作为可扩展标记语言最大的优势在于开发者能够为软件量身【定制】适用的标记,使代码更加通俗易懂。

利用 xml 配置能使软件更具扩展性。例如 Spring class 间的依赖配置在 xml 中,最大限度地提升应用的可扩展性。

具有成熟的验证机制确保程序正确性。利用 Schema DTD 可以对 xml 的正确性进行验证,避免了非法的配置导致应用程序出错。

修改配置而无需变动现有程序。

(2)xml的缺点:

需要解析工具或类库的支持。

解析 xml 势必会影响应用程序性能,占用系统资源。

配置文件过多导致管理变得困难。

编译期无法对其配置项的正确性进行验证,或要查错只能在运行期。

IDE 无法验证配置项的正确性。

查错变得困难,往往配置的一个手误导致莫名其妙的错误。

开发人员不得不同时维护代码和配置文件,开发效率变得低下。

配置项与代码间存在潜规则。改变了任何一方都有可能影响另外一方。

(3)Annotation 的优点:

保存在 class 文件中,降低维护成本。

无需工具支持,无需解析。

编译期即可验证正确性,查错变得容易。

提升开发效率。

(4)Annotation的缺点:

若要对配置项进行修改,不得不修改 Java 文件,重新编译打包应用。

配置项编码在 Java 文件中,可扩展性差。

(5)总结,优缺点互补

 

2.如何调用第三方API实现图片上传

1API是接口,是通道,负责一个程序和其他软件的沟通,本质是预先定义的函数。第三方图片上传的API,把图片上传的逻辑写在自己里面,就是隐藏细节。给别的地方调用的。

2,如果要调用第三方API,需要通读对方的文档,知道API的名称,需要的jar包导入依赖,请求参数要求,返回数据要求,调用具体方法等。仔细看API提供者的例子。

3,常常用到SDKSDK是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等创建应用软件的开发工具的集合。它可以简单的为某个程序设计语言提供应用程序接口API的一些文件,但也可能包括能与某种嵌入式系统通讯的复杂的硬件。SDK还经常包括示例代码、支持性的技术注解或者其他的为基本参考资料澄清疑点的支持文档。

4,在springmvc中,使用jsp+controller实现图片上传的基本思路是:

1)使用MultipartFile类接收上传的图片;

2)将图片存储在选定的云服务器,返回一个图片路径;

3)图片路径存储在用户信息中以供调用。

5,一般过程是:发送请求(向第三方发送请求,传递参数)——收到数据(收到第三方的返回数据)——数据处理(数据解析)——返回前端——前端处理(前端展示封装数据)。

 

3.怎么用Python写一个图片迁移脚本?   

1,迁移图片,就是图片从原来存储的地方A,挪到存储的地方B。不管A上的是否删除。

2,脚本语言可以选python,shell等。多语言本来就在计算机里没问题。这里要求的是python

3,不管是用什么语言,都需要连接。A可能是多台,B也可能是多台。但是AB肯定要想一个办法连接,甚至中间考虑中转。

4AB的数据都有属性,有id,有地址等。要写model层,要写Amodel也要写Bmodel

5,交换数据的方法。一一对照,在A复制,在B粘贴。这样可以达到要求。图片传的快的方式可能有其它。A有关的属性也要复制到BB中的图片地址需要修改,等等。也可以只用一张表,A的图片迁移到B后,要返回新的图片地址。修改表中的图片地址,更新时间等需要更新的属性。

cursor.executemany(sql_str,values) 语句执行python脚本中的sql语句执行,一般效率是最高的。

 

4.第三方的服务可靠吗,如果出现错误该怎么处理?   

1第三方Api是很容易出问题的如果总体不够可靠,换别的,或者自己写。

2出现异常的时候,记录错误日志每天晚上跑脚本,看看当天的邮件,短信,图片上传等功能的失败率有多少。

 

5.怎么快速集成第三方服务组件,APISDK的区别是什么?   

1,最好通过简单的配置来完成,不要考虑太多包依赖的问题。可能通过搜索关键字,快速找到可能需要的第三方服务组件中的特定API

2,两者互相关联,没有绝对值得对比的区别。

SDKSoftware Development Kit,是软件包,提供软件功能。很多功能函数的集合体,一个工具包。SDK覆盖面相当广泛的名词辅助开发某一类软件的相关文档、范例和工具的集合都可以叫做SDK

API Application Programming Interface。一般是指一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。所以它提供的是一个进出的门。

3API接口对接过程中需要的环境需要自己提供,自己可能需要配置编写代码的地方比较多。SDK不仅提供开发环境,还提供很多API

 

6.上传图片应该由前端或客户端直接上传到第三方存储服务,还是应该先上传到服务器,再由服务器上传到第三方?   

1,两种方式都可以使用。直接上传到服务器的webapp目录下,或者直接上传服务的一个指定的文件夹下面。这种方式对于简单的单机应用确实是很方便、简单,出现的问题也会比较少。但是对于分布式项目,直接上传到项目路径的方式显然是不可靠的,而且随着业务量的增加,文件也会增加,对服务器的压力自然就增加了。

2,既然最终是需要上传到第三方,直接上传到第三方能减轻服务器压力:服务器少一次接收,少一次上传。而且前端或客户端直接上传,也还是要处理url,而且只处理一次。我一般选择直接上传到第三方存储服务。

3,服务器上传肯定可以处理配置。如果云存储支持客户端上传可以用客户端上传,但需要服务器做好安全相关配置。

 

7.怎么实现图片防盗链,缩略图,水印等功能?

1,(1)防盗链是为了防止别人通过不是自己的网站使用或者下载资源。盗链是指在自己的页面上展示一些并不在自己服务器上的一些内容, 获取别人的资源地址,绕过别人的资源展示页面,直接在自己的页面上向最终用户提供此内容。 一般被盗链的都是图片、 音乐、视频、软件等资源。通过盗链的手段可以减轻自己服务器的负担。

2)通过Refer或者签名,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以追踪到显示他的网页地址 一旦检测到来源不是本站,即进行阻止或者返回指定的页面。

3)可以使用Nginx模块, ngx_http_referer_module用于阻挡来源非法域名的请求 nginx指令valid_refers,看一下这个的范例。这是传统的防盗链。

4)但是refer是可以伪造的,所以可以使用加密签名的方式来解决这个问题。请求一个图片的时候,带一些签名过去,然后返回图片的时候我们判断下签名是否正确,相当于对一个暗号。第三方模块HttpAccessKeyModule就是利用这个思路。

2,缩略图:根据希望生成的缩略图方式,给出缩略图格式。比如:指定宽高按比例:这种模式下,宽度即为需要生成的图片宽度,高度为需要生成的缩略图的宽度与原图宽度的比再乘以需要生成的缩略图的高度。指定高宽按比例。按照指定的尺寸生成缩略图。指定高,把两边的宽裁剪掉。

总之首先要有一个策略。缩略图不止可能是图片的缩略图,也可能是视频的缩略图。

如果涉及算法,我可以采取ffmpeg的思路:对视频前几秒的颜色分布直方求平均,再找出和平均值最相近的一帧作为缩略图。只用前几秒是为了节省计算时间。

可以参考不同的软件或视频网站,比如YouTube可以使用神经网络自动生成缩略图。有些实现采用了动作识别和人脸识别。

这些算法写出来不算容易。尤其如果涉及计算机视觉处理。

3,生成水印,问的也是算法。可以涉及计算机视觉研究,对抗学习。当然,只是在图片上加上人能认识的字,放的位置都一样,说明是XXX的作品也可以了。

一般生成水印可以给指定图片文件或者目录添加水印,水印功能支持自定义文本、位置、颜色、大小。可以给图片网页视频添加水印。

NodeJS可以用于给图片加水印。

水印生成常常考虑使用CanvasCanvasMutationObserver防止利用浏览器的开发者工具来动态更改DOM的属性或者结构可以去掉勇canvas生成的水印。

如果仅仅是普通的合成,例如一个底图和一个PNG水印图片合成,直接使用canvasdrawImage()方法即可,语法如下:

context.drawImage(img,x,y);

context.drawImage(img,x,y,width,height);

context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height);

PNG水印图片的合成,直接连续在使用drawImage()把对应的图片绘制到canvas画布上就可以。

 

8.为什么要使用第三方图片存储服务,好处是什么?   

1服务器自己存储会有容量问题,硬盘容量不足。服务器硬盘可能比第三方贵。

2服务器自己存储不利于扩展成集群,多台机器需要每台都存一份文件全部放在第三方,处理数据库的服务器容易扩展。服务器用第三方存图片不需要考虑扩容问题,一般都是第三方系统自动处理存储逻辑,自带物理目录优化方案,对外维持同一种访问路径。

3服务器自己存储会占用本机带宽,一个图片的大小抵得过好多个页面文本,不利于优化打开速度服务器的带宽可能比第三方存储的带宽贵,同样的速度,用便宜的。分担 Web 服务器的 I/O 负载。将耗费资源的图片服务分离出来,提高服务器的性能和稳定性。

4,直接符合动静分离设计,便于针对性优化加速。参考阿里云 OSS 自带 CDN 配置入口。能够专门对图片服务器进行优化。为图片服务设置有针对性的缓存方案,减少带宽成本,提高访问速度。服务器自己存储单一目录文件过大会有效率问题,如果一个文件夹下上千个文件,图片文件夹容易打不开。

5,图片在第三方解耦可扩展其他功能,例如加水印,裁剪,压缩等

 

9.怎么样将短信发送服务抽像成公共代码,可以在多个项目中复用?   

1,不止是短信发送,还有邮件发送等功能可以抽象成公共代码,在项目中复用。可能写成一个静态的util类。

2,为了完成功能,代码肯定需要指定接收号。指定短信内容。接收号码作为必选传入参数。短信内容,包括短信验证码自己代码定制。任务七需要设置验证码。

3,任务七给出的验证码,自己需要存,可以设置过期时间,拼接进短信内容中。

4,和其它util一样,也是抽取共性,想到发短信的各种需求,需要传入的参数。选择合适的生成验证码的算法。

 

10.点对点短信和群发短信的通道区别是什么,怎么支持多种短信通道?   

1,点对点短信业务是指手机对手机的短信传送。点对点短信的表现形式包括网内短信、网间短信、国际短信等。每个移动电话都是一个移动发射接受机,既一个终端。

2,短信群发通道一般是通过装载在电脑上的短信群发软件,现在也可以用网页,但是是预先设定好的程序。它们一般具有短信的单发、 群发、分组等功能。商务短信喜欢用群发短信。市场上的短信群发分为两种形式,第一种是通过短信卡或短信猫发送(俗称卡发);第二种是通过运营商网关发送。

3,短信走的都是运营商通道。点对点短信和群发短信的区别是:点对点短信理论上是通过手机发送;群发短信可以通过手机,也可以通过软件网页接入短信通道,发送用的号码可能是群发专用的号码,能看出不是个人接打电话使用的。

4,支持多种短信通道。

三大运营商的短信通道,由中国移动、联通、电信运营商直接提供的短信发送接口,实现与客户指定号码进行短信批量发送和自定义发送的目的其中国内短信通道市场主干是由中国移动、中国联通、中国电信所组成的

国内短信通道主要分为:106通道、电信虚拟短信通道:电话区号(类似021)的、1069三网合一企业实名制通道。

10690三网合一,所以这个号码开头才支持发送给所有三大运营商的号码。支持多种,就是三大运营商的号码。



任务小结

任务小结

1,任务七要求用最常用的两种方式发送验证码。一种是email,一种是短信。

2email发送验证码更多的是用javax.mail包下的方法,填入需要填入的邮箱相关信息,打开SMTP接口,可以从外部用代码发邮件。

3,使用发送验证码给手机号功能,如果要完成一般要使用第三方SDKAPI。尽量快速学习,快速理解第三方的说明和范例,完成发送手机验证码的功能。

4,需要发送的随机码如何生产不是难点。随机码是要传给第三方,加入到信息中才发送。

5,验证码的发送,需要保护自己的系统,通过次数,时间限制,防止太多调用。验证码适合存储在NoSQL,容易设置过期时间能很好配合验证码需要的逻辑,本来就只有一个value,不需要从关系型数据库中查找。

6,上传文件到云存储。云存储的设计理念互相比较像,是把存储这个工作交给专业的地方来做。上传文件也是用到第三方,按照别人的要求传入合适的参数,包括鉴权,最终能够使用。

7,不同品牌云存储之间的数据迁移。如果是AB,就是找到A的下载,B的上传。如果是BA,那么就是要了解A的上传,B的下载。双方的copy,和传数据有关的都了解,就能迁移。

8,文件访问,如果访问文件夹下所有文件夹一直到文件,一直递归即可。

 

问题,困惑,疑难:

使用相对简单。

做第三方工具才相对困难。阿里云是好组。

AWS世界占有率第一。

希望在我的未来,能做出好工具或者为好工具做贡献。提升效率。这个问题怎么切入,我觉得长得帅的老大有看法。

  

二,今天问题

1,有一家公司最近Block & Object Storage Services等类似组招人,而且招得很多。HR为了搭话,说了一位女性工程师的感想:being customer obsessed means.客户至上。产品优秀,竞争力强,世界独一份。这么好的工具一个人是做不出的。我也希望参与一个复杂工具。

2,任务七要求记录错误日志,我就是加入Logger,大部分用info级别。

3,任务七验收标准要求:追踪短信的发送进度,了解第三方的返回值的含义。

以腾讯云为例,它的文档告知我

3. 输出参数

参数名称类型描述
SendStatusSetArray of SendStatus短信发送状态。
RequestIdString唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。

还给出了输出示例,比较好找寻到。在代码中使用SendStatusSet即可。


4,务七验收标准要求:做好短信通道的防攻击策略,邮箱的防攻击策略。

我的代码在controller层防止传入空,用Regex防止传入明显不可能是email或者手机号码的输入。

判断是不是用户已经注册过。

验证码设置几到十几小时内只能发5条。验证码有效期不能太长也不能太短。key value的信息,验证码,验证码过期需要设置过期时间,用Redis处理。

主要参考别人的处理方法,这一部分写得不错,我应该写不了更好,所以基本参考别人验证用Redis的代码。


5,任务七验收标准要求:了解第三方图片存储如何做缩略图,防盗链等。

我把这个写在深度思考的“7.怎么实现图片防盗链,缩略图,水印等功能?”中。


6,任务七验收标准要求:写出来两种不同的云存储API的功能对比。

我选择对比阿里云OSS和腾讯云COS。

阿里云OSS 的API概览,增删改查都有。https://help.aliyun.com/document_detail/31948.html

腾讯云COS也有API操作列表,当然增删改查都有。https://cloud.tencent.com/document/product/436/10111

这两个云的API都有许多针对Bucket,Object的操作。功能不同,我发现腾讯云存储还有“人体人脸-人脸特效接口”API。


7,任务七验收标准要求:能够通过配置文件快速切换使用哪种图片存储。

可以考虑多Profile使用与切换以及与 maven profile 结合使用。Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境。

还是阿里云OSS和腾讯云COS为例子。我为它们两个建立两个.properties文件,如果我在xml里面配置,希望用哪个就取消注解哪个并且把另一个注解起来。比如我要上传,我用interface里面有Upload的方法,OSS和COS代码中分别implements出upload方法。我建立实例的时候,会知道我是OSS还是COS,自动调用OSS或者COS种的方法。

yml多文档块中,我使用以下设置。

server:

  port: 8082

spring:

  profiles:

    active: dev

---

spring:

  profiles: dev

server:

  port: 8083

---

spring:

  profiles: prod

server:

  port: 8084

---

spring:

  profiles: default

server:

  port: 80

---


激活的时候使用配置spring.profiles.active=dev

激活相应的环境。


三,今天的收获

提交任务7。提交代码到github,但是删除后缀 .properties文件。Linux云上的包最近7天可以注册,登录,测试上传。目前只开通了+86的手机号码。


四,明天的计划

任务八





返回列表 返回列表
评论

    分享到