本文介绍TPP方案代码SDK的使用方法。
概况
这里的SDK只给出了方案开发必须的最小集合,例如:
方案执行的入口XXXSolution.java
方案执行的上下文XXXContext.java
方案执行的结果XXXResult.java
方案生命周期配置LifeCycleConfig.java
常用的Java类 lombok, commons-lang等
那么需要别的jar包怎么办?tpp方案插件会提供一些其它jar包,比如:jedis、eas、httpClient、fastjson、abfs、be等)。
安装sdk
<!--
sdk
-->
<dependency>
<groupId>com.alibaba.airec.faassdk</groupId>
<artifactId>cloud-sdk</artifactId>
<version>0.1-SNAPSHOT</version>
</dependency>
使用样例
/**
* author: oe
* date: 2021/9/6
* comment:最简单的solution
*/
package com.alibaba.tpp.solution.hello;
import com.alibaba.glaucus.protocol.solution.GeneralSolution;
import com.alibaba.glaucus.protocol.solution.LifeCycleConfig;
import com.alibaba.glaucus.protocol.solution.SolutionContext;
import com.alibaba.glaucus.protocol.solution.SolutionResult;
import com.taobao.recommendplatform.protocol.solution.RecommendResultSupport;
import java.util.*;
public class HelloSolution implements GeneralSolution {
@Override
public void init(LifeCycleConfig lifeCycleConfig) {
}
@Override
public SolutionResult execute(SolutionContext solutionContext) throws Exception {
Map<String,String> abConfigMap = new LinkedHashMap<>();
solutionContext.abConfigKeySet().forEach(key->{
String value = solutionContext.getAbConfig(key);
abConfigMap.put(key,value);
});
SolutionResult result = new RecommendResultSupport();
Map<String,Object> map = new TreeMap<>();
map.put("requestParams",solutionContext.getRequestParamsMapCopy());
map.put("abConfigs",abConfigMap);
List<Map<String,Object>> solutionResult= new ArrayList<>();
solutionResult.add(map);
result.setSolutionResult(solutionResult);
result.setAttribute("HelloSolution", "hello hello hello");
return result;
}
@Override
public void destroy(LifeCycleConfig lifeCycleConfig) {
}
}
核心类列表
class | 说明 |
GeneralSolution.java | 方案类。用户的方案都继承自此类。 有3个抽象方法:
方案初始化,方案加载的时候执行,整个生命周期执行一次。
方案销毁,方案卸载的时候执行,整个生命周期执行一次。
每来一个请求执行一次,整个生命周期执行多次。 |
RecommendSolution.java | 推荐方案类,继承自GeneralSolution。用户的推荐方案继承此类。 有3个抽象方法:
入参,推荐上下文,每次请求不一样。
出参,推荐结果,每次请求不一样。 |
LifeCycleConfig.java | 方案初始化的入参,记录了一些全生命周期的信息。 @Overridepublic void init(LifeCycleConfig lifeCycleConfig) { lifeCycleConfig.getSolutionId();//方案id lifeCycleConfig.getAppId();//场景id} |
SolutionContext.java | 方案execute入参,方案上下文,每次请求不一样。 此类中可获取ab实验参数、请求参数、保存每一次执行的中间结果。
注意:如果配置项特别大, 重复比较耗时, 建议进行缓存, 定期更新 |
Context.java | 推荐方案入参数,继承自SolutionContext。 用户可以继承此类,构造自己的上下文,只保留需要的数据。例如demo中的RecommendContext.java: |
SolutionResult.java | 方案出参,最终返回给TPP服务调用方。 result.setSolutionResult(list);//核心结果result.setAttribute("HelloSolution", "hello hello hello");//辅助字段 |
RecommendResult.java | 推荐方案出参,继承自SolutionResult。实现了父类的2个方法:
此处变成获取推荐结果
此处变成设置推荐结果 |
RecommendResultSupport.java | 推荐方案出参,继承自RecommendResult,实现了所有父类方法,可以直接使用。最佳实践也是使用此类。 Map<String, Object> models models存储result、attribute、scmid(埋点日志)、trafficLimit(限流)
boolean empty 此次返回是否空结果(非异常导致、就是没有推荐结果or抄底了) |