client
-
client=鉴权信息+通信配置(超时等等)
-
rest api都没有指明用户信息,是怎么区分用户的? 端侧通过userInterceptor,上传用户信息的
-
附件上传
有多个附件字段
附件列表or单个字段 (field.getType()==String.class or )
附件数量上限
按字段压缩,list类型压缩进一个压缩包? 否 每个附件一个包(压缩时间-uploadId.zip)
逐个文件 上传?是 直接上传压缩包和压缩包的json描述文件 -
上传到云端,怎么区分哪个文件是哪个字段的? 将附件的上传地址填充到元数据描述中
Resultful API
- HTTP基础:Request = ReqHeaders +(ReqBody);Respone……
- android Restful:
- 编不编码看消息定义
- JOSNArray格式,重新定义包List对象
1.请求参数形式
![](https://img.haomeiwen.com/i14205804/a646cc50e7125604.png)
1.1.@Query
@POST("agreementservice/user")
Observable<BaseResp> signAgreement(@Query("nsp_svc") String nspSvc,
@Query("access_token") String accessToken,
@Query("request") String request);
不可编码
public Observable<BaseResp> signAgreement(String accessToken, List<Signature> signInfo) {
SignRequestBody signRequestBody = new SignRequestBody(signInfo);
Observable<BaseResp> observable = privacyApi.signAgreement(NSP_SVC_SIGN, accessToken, JSON.toJSONString(signRequestBody));
return observable.compose(new DefaultTransformer<BaseResp>());
}
1.2.@Body
@POST("agreementservice/user")
Observable<BaseResp> signAgreement(@Body RequestBody signRequest );
public Observable<BaseResp> signAgreement(String accessToken, List<Signature\> signInfo) {
SignRequestBody signRequestBody = new SignRequestBody(signInfo);
HashMap<String, String> stringStringHashMap = new HashMap<>();
stringStringHashMap.put("nsp_svc", NSP_SVC_SIGN);
stringStringHashMap.put("access_token", URLEncoder.encode(accessToken));
stringStringHashMap.put("request", URLEncoder.encode(JSON.toJSONString(signRequestBody)));
Observable<BaseResp> observable = privacyApi.signAgreement(getRequestBody(stringStringHashMap
));
return observable.compose(new DefaultTransformer<BaseResp>());
}
public RequestBody getRequestBody(HashMap<String, String> hashMap) {
StringBuffer data = new StringBuffer();
if (hashMap != null && hashMap.size() > 0) {
Iterator iter = hashMap.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
data.append(key).append("=").append(val).append("&");
}
}
String jso = data.substring(0, data.length() - 1);
RequestBody requestBody =
RequestBody.create(MediaType.parse("application/x-www-form-urlencoded; charset=utf-8"), jso);
return requestBody;
}
用编码,输入同@query
1.3.
@POST("agreementservice/user")
@FormUrlEncoded
Observable<BaseResp> signAgreement(@Field("nsp_svc") String nspSvc,
@Field("access_token") String accessToken,
@Field("request") String request); (@FieldMap map )
自动编码
2.请求json格式
![](https://img.haomeiwen.com/i14205804/6d2a7fd9cd877146.png)
2.1.@Body
@POST("agreementservice/user")
Observable<BaseResp> signAgreement(@Body SignRequest signRequest);
不url编码
- ref
(https://blog.csdn.net/xu282934741/article/details/88719734)
(https://www.jianshu.com/p/fceac274afe5)
okhttp&retorfit
- useragent:调用者标识
- call同步;Onservable异步
- 拦截器(&ApiClient)
怎么处理统一的header、封装成Resp exect().body()
处理鉴权(usersession)哪些Api需要加session?处理加入退出本地持久化session?怎么刷新校验? 超期的expireAT,修改本地手机时间怎么办 - Factory的角色是什么?
-Chain如何解析出response和request?(找个拦截器看看)
后端名词解释
-
Nginx:一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,其特点是占有内存少,并发能力强。Nginx 以事件驱动的方式编写,所以有非常好的性能,同时也是一个非常高效的反向代理、负载平衡。
-
Redis:内存数据库,可以做消息队列
-
RDS:阿里的数据库组件
-
CDM:云数据迁移(Cloud Data Migration, 简称CDM),是一种高效、易用的批量数据迁移服务。例如,后台桶里的数据迁移到ES,展示在页面数据表里:cdm任务将全量数据-》kafka-》flink(分布式流式数据处理框架)作业消费kafka将数据-》ES
-
对于海量数据处理,常见的一些方案,大方向就是负载均衡、消息队列和缓存系统、CDN内容分发。
- 负载均衡:协调多台服务器应对网络连接和请求的压力,各种调度策略
- 消息队列:异步处理机制,避免耗时的等待。Kafka、RabbitMQ
- 缓存系统:加速数据读写,Redis、Memcached
- 数据库:分库、分表,借助数据库中间件实现关联查询、主键避免重复、分页查询和事务一致性等功能。分布式关系型数据库、时序数据库
-
Apache Flink:流处理,对实时数据进行一些预处理,处理之后再存储起来。一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。动态输入的流式数据的实时处理,延迟低,也叫实时计算,主要用于实时监控、趋势预测、实时推荐等场景。Storm、Spark Streaming、Flink
-
Apache Spark:批处理,分而治之。专为大规模数据处理而设计的快速通用的计算引擎。海量静态数据的非实时处理,延迟比较高,也叫离线计算,主要用于离线报表、历史数据汇总等场景。Hadoop MapReduce、Spark
-
DLI:数据湖探索服务,是完全兼容Apache Spark和Apache Flink生态, Serverless大数据计算分析服务,企业仅需使用SQL或程序就可轻松完成异构数据源的批处理、流处理、内存计算、机器学习等,挖掘和探索数据价值。
在开发中,如果数据源是DLI,则首先推荐DLI Spark;如果数据源是MRS集群中的hive,则首先推荐MRS Spark(简单配置数据连接后就可以直接访问hive)。 -
Docker:虚拟技术的一种,可以解决在不同机器上使用同一个软件的依赖、环境、配置问题。
- 虚拟机实现一个新系统,占用的资源较多。容器是一个被包装的进程,启动也快。进程接触到的文件系统和网络接口都是虚拟的,与本机的文件系统和网络接口是隔离的,因此需要定义容器与物理机的端口映射(map)。
- 站在 Docker 的角度,软件就是容器的组合:业务逻辑容器、数据库容器、储存容器、队列容器......Docker 使得软件可以拆分成若干个标准化容器,然后像搭积木一样组合起来。这正是微服务(microservices)的思想:软件把任务外包出去,让各种外部服务完成这些任务,软件本身只是底层服务的调度中心和组装层。
- how:将应用程序、依赖、环境,配置文件打包入image文件。Docker根据image文件生成一个个实例。image 文件是通用的,一台机器的 image 文件拷贝到另一台机器,照样可以使用。image 文件生成的容器实例,本身也是一个文件,称为容器文件。也就是说,一旦容器生成,就会同时存在两个文件: image 文件和容器文件。而且关闭容器并不会删除容器文件,只是容器停止运行而已。Dockerfile 文件。它是一个文本文件,用来配置 image。Docker 根据 该文件生成二进制的 image 文件。
-
k8s:K8s是Google开源的容器集群管理系统。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。
-
Eureka:Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。 SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。
- 一般提到的“服务化”更多指的是对RPC的管理。服务化一般关注服务注册,服务协调,服务可用性,服务通讯协议和内容交换等。
-
分布式:一群独立计算机集合共同对外提供服务,但是对于系统的用户来说,就像是一台计算机在提供服务一样。
- 拿电商网站来说,我们一般把一个电商网站横向拆分成商品模块、订单模块、购物车模块、消息模块、支付模块等。然后我们把不同的模块部署到不同的机器上,各个模块之间通过远程服务调用(RPC)等方式进行通信。以一个分布式的系统对外提供服务。
-
TPS :一秒能完整搞定多少次用户操作来回(一次用户操作坑需要多次C/S服务接口的来回交互);QPS :一秒能完成多少次接口的交互。TPS= N* QPS?
-
APIGateway:云平台内部的一些对外开放的模块中,统一一个认证、鉴权模式、统一的大数据统计、统一的健康检查模式等。OAuth 2.0 JWT
- 服务接口所在分为网关opengw和分布式网关apigw两种,对于调用方而言,只有请求URL的不同
-
Scope: 授权作用域,对于用户级的服务,一般需要定义。
- 权限和Scope是什么 关系? 一个Scope可以包含多个权限;一个权限可以给多个Scope依赖。
网友评论