发表于: 2021-04-11 23:22:10
1 1285
今天完成的事情:
图片迁移
深度思考
了解SpringRMI
明天计划的事情:
做一个SpringRMI demo
遇到的问题:
收获:
1.什么是Annotation,怎么自定义Annotation,Annotation和XML的优缺点各是什么?
Annotation就是注解
Annotation其实是一种接口。通过Java的反射机制相关的API来访问annotation信息。
自定义Annotation
@Target( { FIELD })
@Retention(RUNTIME)
public @interface Resource {
public String id() default "";
}
Annotation的优点:简洁,不像XML需要配置很多很多东西。编译期的时候可验证正确性,查错变得容易。
缺点:如果不项目不了解,可能给开发和维护带来麻烦
Xml优点:把类与类之间松解偶;修改方便;容易扩展。容易和其他系统进行数据交互。对象之间的关系一目了然
缺点:
配置冗长,需要额外维护;影响开发效率
类型不安全,校验不出来,出错不好排查
注解简单概括:写起来比较简单、方便,看起来也简洁,但是修改麻烦
Xml配置概括:写起来比较灵活、修改方便,但是写和维护麻烦
总结:xml 的强项是 Annotation 所不具备的,而 Annotation 的优势也是 xml 所欠缺的。 这也正是时下流行的 xml + Annotation 配置的原因所在。
2.如何调用第三方API实现图片上传?
1.导入依赖
2.参考官方文档写一个demo
3.根据自己的要求进行修改
3.怎么用Python写一个图片迁移脚本?
还没学Python
4.第三方的服务可靠吗,如果出现错误该怎么处理?
阿里云和腾讯云的第三方还是比较可靠的,一个第三方错误,换另一个第三方不就行了。当然第三方出现错误,首先检查自己是否有问题,发现自己没问题,找第三方的客服,提交工单。
5.怎么快速集成第三方服务组件,API和SDK的区别是什么?
API就是接口,SDK就是工具包
举个例子: 你想吃面包,而你家对街有一家面包店卖面包和烤面包机。API方式是你经过马路去这家面包店买了一个面包。API就是买面包。而SDK方式是,你向面包店买了一个烤面包机,在自己家里安装好,然后烤了一个面包。SDK是这个面包机和配料。
选择API
优势:API开发成本低,对接比较简单,可以快速验证商业模式和用户体验。
劣势:API会经过对接平台,厂商可以获取对接平台相关数据信息。
选择SDK
优势:SDK对接后的功能比较稳定,响应速度快,而且对接平台相关数据不会被获取。
劣势:需要开发的环节较多,开发工作量大,对接周期略长。
6.上传图片应该由前端或客户端直接上传到第三方存储服务,还是应该先上传到服务器,再由服务器上传到第三方?
两种方式都可以完成上传,但是前者还需占用服务端的带宽来上传文件,然后再由服务端上传;而后者仅占用客户端的资源,这样可以减轻服务端的压力。
7.怎么实现图片防盗链,缩略图,水印等功能?
这三个,第三方都有功能实现。
防盗链功能:通过设置Referer白名单,限制仅白名单中的域名可以访问您Bucket内的资源。OSS支持基于HTTP和HTTPS header中表头字段Referer的方法设置防盗链。
仅当通过签名URL或者匿名访问Object时,进行防盗链验证;当请求的Header中包含Authorization字段,不进行防盗链验证。
8.为什么要使用第三方图片存储服务,好处是什么?
1.节省自己服务器的空间。
2.服务器不用处理静态图片,提升服务器性能。
3.生成第三方url,可存入数据库调用方便
4.第三方帮你做防盗链,缩略图,水印, 太省事了。
5.唯一缺点可能就是要花钱了
9.怎么样将短信发送服务抽像成公共代码,可以在多个项目中复用?
/**
* 密钥
*/
@Value("${TxSMS.secretId}")
private String secretId;
@Value("${TxSMS.secretKey}")
private String secretKey;
/**
* 短信业务
*/
@Value("${TxSMS.sign}")
private String sign;
@Value("${TxSMS.smsSdkAppId}")
private String smsSdkAppId;
@Value("${TxSMS.TemplateID}")
private String TemplateID;
/**
* 验证码
*/
public String getCode() {
String str="0123456789";
StringBuilder st=new StringBuilder(4);
for(int i=0;i<4;i++){
char ch=str.charAt(new Random().nextInt(str.length()));
st.append(ch);
}
String code=st.toString().toLowerCase();
return code;
}
public void sendSMS(String telephone,String code) {
System.out.println("电话号码"+telephone);
System.out.println("验证码"+code);
// 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,见《创建secretId和secretKey》小节
Credential cred = new Credential(secretId, secretKey);
// 实例化要请求产品(以cvm为例)的client对象
ClientProfile clientProfile = new ClientProfile();
clientProfile.setSignMethod(ClientProfile.SIGN_TC3_256);
//第二个ap-chongqing 填产品所在的区
SmsClient smsClient = new SmsClient(cred, "ap-guangzhou");
SendSmsRequest sendSmsRequest = new SendSmsRequest();
//appId ,见《创建应用》小节
sendSmsRequest.setSmsSdkAppid(smsSdkAppId);
//发送短信的目标手机号,可填多个。
String[] phones={telephone};
sendSmsRequest.setPhoneNumberSet(phones);
//模版id,见《创建短信签名和模版》小节
sendSmsRequest.setTemplateID(TemplateID);
//模版参数,从前往后对应的是模版的{1}、{2}等,见《创建短信签名和模版》小节
String [] templateParam={code,"1"};
sendSmsRequest.setTemplateParamSet(templateParam);
//签名内容,不是填签名id,见《创建短信签名和模版》小节
sendSmsRequest.setSign(sign);
SendSmsResponse sendSmsResponse = null;
try {
sendSmsResponse= smsClient.SendSms(sendSmsRequest); //发送短信
} catch (TencentCloudSDKException e) {
e.printStackTrace();
}
if (SendSmsResponse.toJsonString(sendSmsResponse) != null) {
logger.info("发送成功");
logger.info("短信接口返回的数据----------------");
logger.info("StatusSet=" +SendSmsResponse.toJsonString(sendSmsResponse));
logger.info("RequestId=" + sendSmsResponse.getRequestId());
} else {
logger.error("发送失败");
logger.info("短信接口返回的数据----------------");
logger.info("StatusSet=" + SendSmsResponse.toJsonString(sendSmsResponse));
logger.info("RequestId=" + sendSmsResponse.getRequestId());
}
}
10.点对点短信和群发短信的通道区别是什么,怎么支持多种短信通道?
点对点短信: 是用户通过手机或其他电信终端直接发送或接收的文字或数字信息。点对点短信是指在手机与手机之间发送和接收的端到端的文本信息业务形式。
群发短信: 在运营商申请一个公共的号码,向大量手机发短信。 群发短信是指在系统向多个手机发送文本信息业务形式。
群发需要申请短信通道:
短信通道是由中国移动、联通、电信等运营商直接提供的短信发送接口,实现与客户指定号码进行短信批量发送和自定义发送的目的。
怎么支持多种短信通道?选择三网合一通道,显示号码为1069。
大公司可以根据业务需求储备多个短信通道,比如注册一个,通知一个,触发一个,验证码一个。
了解SpringRMI:
远程方法调用(RMI)顾名思义是一台机器上的程序调用另一台机器上的方法。这样可以大致知道RMI是用来干什么的,但是这种理解还不太确切。RMI是Java支撑分布式系统的基石,例如著名的EJB组件。
一、RMI(远程方法调用)的组成
一个正常工作的RMI系统由下面几个部分组成:
·远程服务的接口定义
·远程服务接口的具体实现
·桩(Stub)和框架(Skeleton)文件
·一个运行远程服务的服务器
·一个RMI命名服务,它允许客户端去发现这个远程服务
·类文件的提供者(一个HTTP或者FTP服务器)
·一个需要这个远程服务的客户端程序
二、RMI(远程方法调用)原理示意图
三、RMI远程调用步骤:
1,客户对象调用客户端辅助对象上的方法
2,客户端辅助对象打包调用信息(变量,方法名),通过网络发送给服务端辅助对象
3,服务端辅助对象将客户端辅助对象发送来的信息解包,找出真正被调用的方法以及该方法所在对象
4,调用真正服务对象上的真正方法,并将结果返回给服务端辅助对象
5,服务端辅助对象将结果打包,发送给客户端辅助对象
6,客户端辅助对象将返回值解包,返回给客户对象
7,客户对象获得返回值
编程实现
实现 RMI 所需的 API几乎都在 :
1> java.rmi : 提供客户端需要的类、接口和异常
2> java.rmi.server : 提供服务端需要的类、接口和异常
3> java.rmi.registry : 提供注册表的创建以及查找和命名远程对象的类、接口和异常
其实在 RMI 中的客户端和服务端并没有绝对的界限,与Web应用中的客户端和服务器还是有区别的。这两者其实是平等的,客户端可以为服务端提供远程调用的方法,这时候,原来的客户端就是服务器端
参考网址:
评论