发表于: 2020-09-05 23:50:45

1 1447


今日完成:深度思考

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

注解,可以看作是对 一个 类/方法 的一个扩展的模版,每个 类/方法 按照注解类中的规则,来为 类/方法 注解不同的参数,在用到的地方可以得到不同的 类/方法 中注解的各种参数与值,从JDK5开始,java增加了对元数据(描述数据属性的信息)的支持。其实说白就是代码里的特殊标志,这些标志可以在编译,类加载,运行时被读取,并执行相应的处理,以便于其他工具补充信息或者进行部署。

自定义注解步骤: 

1.定义注解格式

修饰符 @interface 注解名 {   

    注解元素的声明1 

    注解元素的声明2   

}

 2. 配置元注解

3.定义参数

自定义的参数类型只能为以下类型:

所有的基本类型:byte、short、char、int、long、float、double

String类型

Class类型

enum类型

Annotation类型

以上类型的数组

参数可以使用default 定义默认值,如下:

修饰符 @interface 注解名 {   

    String name() default "";

    注解元素的声明2   

}

 4.定义注解逻辑

需要先确定代码的执行范围,然后拦截代码并通过反射获取注解的内容执行特定的代码逻辑,再通过反射执行方法(常见的是aop+反射)。

xml的优点:

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

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

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

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


xml的缺点:

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

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

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

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

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

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

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

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


Annotation 的优点:

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

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

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

提升开发效率。


Annotation的缺点:

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

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


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

步骤:

1)使用springMVC的MultipartFile来获取上传的图片路径,名称等。

2往OSS的sdk中的上传方法(putObject)传入一个文件输入流和路径完成图片上传。

3再调用generatePresignedUrl()方法获取图片存储在OSS中的url。

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

这个还不会.

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

https://www.cnblogs.com/lbser/p/4753112.html

不可靠。

有兜底,制定好业务降级方案。

遵循快速失败原则,一定要设置超时时间。

  某服务调用的一个第三方接口正常响应时间是50ms,某天该第三方接口出现问题,大约有15%的请求响应时间超过2s,没过多久服务load飙高到10以上,响应时间也非常缓慢,即第三方服务将我们服务拖垮了。

  为什么会被拖垮?没设置超时!我们采用的是同步调用方式,使用了一个线程池,该线程池里最大线程数设置了50,如果所有线程都在忙,多余的请求就放置在队列里中。如果第三方接口响应时间都是50ms左右,那么线程都能很快处理完自己手中的活,并接着处理下一个请求,但是不幸的是如果有一定比例的第三方接口响应时间为2s,那么最后这50个线程都将被拖住,队列将会堆积大量的请求,从而导致整体服务能力极大下降。

  正确的做法是和第三方商量确定个较短的超时时间比如200ms,这样即使他们服务出现问题也不会对我们服务产生很大影响。


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

集成第三方组件,根据自己需要的功能,结合第三方服务的帮助文档的内容,找到需要的传参,和响应,调用第三方的API,或者SDK。

API和SDK的区别

API即应用编程接口,是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。

SDK软件开发工具包,软件开发工具包一般都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合。软件开发工具包括广义上指辅助开发某一类软件的相关文档、范例和工具的集合。

为了便于理解,我们就再举个不完全恰当的例子。你想吃面包,而你家对街有一家面包店卖面包和烤面包机。API方式是你经过马路去这家面包店买了一个面包。API就是买面包。而SDK方式是,你向面包店买了一个烤面包机,在自己家里安装好,然后烤了一个面包。SDK是这个面包机和配料。

选择API

优势:API开发成本低,对接比较简单,可以快速验证商业模式和用户体验。

劣势:API会经过对接平台,厂商可以获取对接平台相关数据信息。

选择SDK

优势:SDK对接后的功能比较稳定,响应速度快,而且对接平台相关数据不会被获取。

劣势:需要开发的环节较多,开发工作量大,对接周期略长。

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

两种方式都可以完成上传,但是后者还需占用服务端的带宽来上传文件,然后再由服务端上传;而前者仅占用客户端的资源,这样可以减轻服务端的压力。

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

防盗链功能通过设置Referer白名单以及是否允许空Referer,限制仅白名单中的域名可以访问您Bucket内的资源。OSS支持基于HTTP和HTTPS header中表头字段Referer的方法设置防盗链。

控制台:

sdk的方式:

/**
    * 设置防盗链
    */
   public void setDoorChain(){
// 创建OSSClient实例。
       OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

       List<String> refererList = new ArrayList<String>();
// 添加Referer白名单。Referer参数支持通配符星号(*)和问号(?)。
       refererList.add("http://www.aliyun.com");
       refererList.add("http://www.*.com");
       refererList.add("http://www.?.aliyuncs.com");
// 设置存储空间Referer列表。设为true表示Referer字段允许为空。
       BucketReferer br = new BucketReferer(true, refererList);
       ossClient.setBucketReferer(bucketName, br);
// 关闭OSSClient
       ossClient.shutdown();
   }

水印和缩略图可以在后台设置

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

第三方存储能保证安全、低成本、高可靠的云存储服务

对比项第三方存储自建服务器存储
可靠性多重冗余架构设计,为数据持久存储提供可靠保障。同时,基于高可用架构设计,消除单节故障,确保数据业务的持续性。
  • 规模自动扩展,不影响对外服务。
  • 数据自动多重冗余备份。
  • 受限于硬件可靠性,易出问题,一旦出现磁盘坏道,容易出现不可逆转的数据丢失。
  • 人工数据恢复困难、耗时、耗力。
安全
  • 提供企业级多层次安全防护,包括服务端加密、客户端加密、防盗链、IP黑白名单、细粒度权限管控、日志审计、WORM特性等。
  • 多用户资源隔离机制,支持异地容灾机制。
  • 需要另外购买清洗和黑洞设备。
  • 需要单独实现安全机制。
成本
  • 多线BGP骨干网络,带宽资源充足,上行流量免费。
  • 无需运维人员与托管费用,0成本运维。
  • 存储受硬盘容量限制,需人工扩容。
  • 单线或双线接入速度慢,有带宽限制,峰值时期需人工扩容。
  • 需专人运维,成本高。
智能存储提供多种数据处理能力,如图片处理、视频截帧、文档预览、图片场景识别、人脸识别、SQL就地查询等,并无缝对接Hadoop生态、以及函数计算、EMR、DataLakeAnalytics、BatchCompute、MaxCompute、DBS等产品,满足企业数据分析与管理的需求。需要额外采购,单独部署

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

1.把密钥等关键信息放在.properties文件中。

2.在spring的xml文件中引入.properties文件,扫描工具类所在的包。

3.在这个工具类上加上@Component注解,然后用@Value注解注入关键信息。

4.用@Autowired注入,就可以使用发送短信的方法了。

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

阿里云直接支持群发的,区别在于单发短信时,直接输入某个手机号,群发短信时,输入的是所有号码构成的集合。

明天的计划:

springRMI Demo

遇到的问题:null

收获:null


返回列表 返回列表
评论

    分享到