发表于: 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.为什么要使用第三方图片存储服务,好处是什么?
第三方存储能保证安全、低成本、高可靠的云存储服务
对比项 | 第三方存储 | 自建服务器存储 |
---|---|---|
可靠性 | 多重冗余架构设计,为数据持久存储提供可靠保障。同时,基于高可用架构设计,消除单节故障,确保数据业务的持续性。
|
|
安全 |
|
|
成本 |
|
|
智能存储 | 提供多种数据处理能力,如图片处理、视频截帧、文档预览、图片场景识别、人脸识别、SQL就地查询等,并无缝对接Hadoop生态、以及函数计算、EMR、DataLakeAnalytics、BatchCompute、MaxCompute、DBS等产品,满足企业数据分析与管理的需求。 | 需要额外采购,单独部署 |
9.怎么样将短信发送服务抽像成公共代码,可以在多个项目中复用?
1.把密钥等关键信息放在.properties文件中。
2.在spring的xml文件中引入.properties文件,扫描工具类所在的包。
3.在这个工具类上加上@Component注解,然后用@Value注解注入关键信息。
4.用@Autowired注入,就可以使用发送短信的方法了。
10.点对点短信和群发短信的通道区别是什么,怎么支持多种短信通道?
阿里云直接支持群发的,区别在于单发短信时,直接输入某个手机号,群发短信时,输入的是所有号码构成的集合。
明天的计划:
springRMI Demo
遇到的问题:null
收获:null
评论