Go&Java使用SDK连接引擎服务

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

本文介绍如何使用SDK连接到已经在EAS部署好的引擎服务。

前提准备

已经成功在PAI- EAS上部署完成引擎。

获取服务信息

点击 查看调用信息

585405B1-7AAE-4C49-89CD-1267B983FEA6

查询服务的调用地址以及token

ADC26EF5-04E9-4857-B7FF-FE042B5FB63C

Go连接SDK

SDK地址:GoSDK地址

go get github.com/pai-eas/eas-golang-sdk

公网请求

将查询到的引擎服务中的公网的调用地址和token进行替换。

eas.NewPredictClient中第一个参数传入调用地址,第二个参数传入服务名称。

SetToken中传入获取到的token。

推荐接口请求示例

对于自定义Processor用户而言,通常采用字符串的方式去调用PAI-Rec的引擎服务,具体的demo程序如下:

package main

import (
	"fmt"

	"github.com/pai-eas/eas-golang-sdk/eas"
)

func main() {
        // NewPredictClient(调用地址,服务名称) 两个参数缺一不可
	client := eas.NewPredictClient("1730760139076263.cn-shanghai.pai-eas.aliyuncs.com", "lizhuo_prepub")
	// SetRequestPath(接口路径) 根据具体的需要填写
	client.SetRequestPath("/api/rec/feed")
	// SetToken(token) 填写token
	client.SetToken("**********************")
	err := client.Init()
	if err != nil {
		fmt.Println(err)
		return
	}
	// 具体的请求参数
	req := "{\"scene_id\":\"home_feed\",\"size\":10,\"uid\":\"1234\"}"
	for i := 0; i < 10; i++ {
		resp, err := client.StringPredict(req)
		if err != nil {
			fmt.Printf("failed to predict: %v \n", err)
		} else {
			fmt.Println(resp)
		}
	}
}

通过VPC网络直连的方式调用服务

重要

网络直连方式仅支持部署在EAS公共云控制台中购买专用资源组的服务,且需要在控制台上为该资源组与用户指定的vswitch打通网络后才可使用。调用方法与普通调用方式相比,增加一句 client.SetEndpointType(eas.EndpointTypeDirect) 即可,非常适合大流量高并发的服务。

package main

import (
	"fmt"

	"github.com/pai-eas/eas-golang-sdk/eas"
)

func main() {
        // NewPredictClient(调用地址,服务名称) 两个参数缺一不可
	client := eas.NewPredictClient("pai-eas-vpc.cn-shanghai.aliyuncs.com", "lizhuo_prepub")
	// SetRequestPath(接口路径) 根据具体的需要填写
	client.SetRequestPath("/api/rec/feed")
	// SetToken(token) 填写token
	client.SetToken("**********************")
	// 设置使用直连网络请求
	client.SetEndpointType(eas.EndpointTypeDirect)
	err := client.Init()
	if err != nil {
		fmt.Println(err)
		return
	}
	// 具体的请求参数
	req := "{\"scene_id\":\"home_feed\",\"size\":10,\"uid\":\"1234\"}"
	for i := 0; i < 10; i++ {
		resp, err := client.StringPredict(req)
		if err != nil {
			fmt.Printf("failed to predict: %v \n", err)
		} else {
			fmt.Println(resp)
		}
	}
}

Java连接SDK

SDK地址:JavaSDK地址

添加依赖包

编写Java客户端代码使用Maven管理项目,用户需在pom.xml文件中添加客户端所需的依赖包,名为eas-sdk,目前最新release版本的具体代码如下:

<dependency>
  <groupId>com.aliyun.openservices.eas</groupId>
  <artifactId>eas-sdk</artifactId>
  <version>2.0.26</version>
</dependency>

推荐接口请求示例

对于自定义Processor用户而言,通常采用字符串的方式去调用PAI-Rec的引擎服务,具体的demo程序如下:

package org.example;

import com.aliyun.openservices.eas.predict.http.PredictClient;
import com.aliyun.openservices.eas.predict.http.HttpConfig;

public class Main {
    public static void main(String[] args) throws Exception {
        // 启动并初始化客户端, client对象需要共享,千万不可每个请求都创建一个client对象。
        PredictClient client = new PredictClient(new HttpConfig());
        client.setToken("**************************");
        // 如果要使用网络直连功能,需使用setDirectEndpoint方法
        // 如 client.setDirectEndpoint("pai-eas-vpc.cn-shanghai.aliyuncs.com");
        // 网络直连需打通在EAS控制台开通,提供用于访问EAS服务的源vswitch,打通后可绕过网关以软负载的方式直接访问服务的实例,以实现更好的稳定性和性能
        // 注:普通网关访问时请使用以用户uid为开头的endpoint,在eas控制台服务的调用信息中可查到。直连访问时请使用如上的pai-eas-vpc.{region_id}.aliyuncs.com的域名进行访问。
        client.setEndpoint("1730760139076263.cn-shanghai.pai-eas.aliyuncs.com");
        // 设置服务名
        client.setModelName("lizhuo_prepub");
        // 设置请求路径
        client.setRequestPath("/api/rec/feed");

        //输入字符串定义
        String request = "{\"scene_id\":\"home_feed\",\"size\":10,\"uid\":\"1214\"}";
        System.out.println(request);

        //通过eas返回字符串
        try {
            String response = client.predict(request);
            System.out.println(response);
        } catch (Exception e) {
            e.printStackTrace();
        }

        //关闭客户端
        client.shutdown();
        return;
    }
}
说明
  • 通过PredictClient创建客户端服务对象,如需在程序中使用多个服务,可创建多个client对象;

  • 在建立了PredictClient对象之后,需为其设置Token、Endpoint以及ModelName;

  • 采用String类型的request作为输入,通过client.predict发送http请求,并返回response;

  • shutdown方法关闭客户端client;

通过VPC网络直连的方式调用服务

package org.example;

import com.aliyun.openservices.eas.predict.http.PredictClient;
import com.aliyun.openservices.eas.predict.http.HttpConfig;

public class Main {
    public static void main(String[] args) throws Exception {
        // 启动并初始化客户端, client对象需要共享,千万不可每个请求都创建一个client对象。
        PredictClient client = new PredictClient(new HttpConfig());
        client.setToken("**************************");
        // 如果要使用网络直连功能,需使用setDirectEndpoint方法
        // 如 client.setDirectEndpoint("pai-eas-vpc.cn-shanghai.aliyuncs.com");
        // 网络直连需打通在EAS控制台开通,提供用于访问EAS服务的源vswitch,打通后可绕过网关以软负载的方式直接访问服务的实例,以实现更好的稳定性和性能
        // 注:普通网关访问时请使用以用户uid为开头的endpoint,在eas控制台服务的调用信息中可查到。直连访问时请使用如上的pai-eas-vpc.{region_id}.aliyuncs.com的域名进行访问。
        
        // 使用vpc网络直连,需要用setDirectEndpoint()并且使用vpc地址
        client.setDirectEndpoint("pai-eas-vpc.cn-shanghai.aliyuncs.com");
        // 设置服务名
        client.setModelName("lizhuo_prepub");
        // 设置请求路径
        client.setRequestPath("/api/rec/feed");

        //输入字符串定义
        String request = "{\"scene_id\":\"home_feed\",\"size\":10,\"uid\":\"1214\"}";
        System.out.println(request);

        //通过eas返回字符串
        try {
            String response = client.predict(request);
            System.out.println(response);
        } catch (Exception e) {
            e.printStackTrace();
        }

        //关闭客户端
        client.shutdown();
        return;
    }
}

通过请求压缩调用服务

目前引擎接口支持zstd、lz4、gzip 三种解压方式。

警告

必须使用eas-sdk2.0.26以上版本。

  1. 使用zstd压缩请求示例

除了上述文档的client 设置,需要额外设置如下:

  • setCompressor eas sdk 采用哪种压缩方式

  • Content-Encoding 设置请求header头。高速引擎使用对应的值进行压缩。

client.setCompressor(Compressor.Zstd);
Map<String, String> header = new HashMap<String, String>();
header.put("Content-Encoding", "zstd");
client.addExtraHeaders(header);
  1. 使用lz4压缩请求示例

 client.setCompressor(Compressor.LZ4Frame);
 Map<String, String> header = new HashMap<String, String>();
 header.put("Content-Encoding", "lz4");
 client.addExtraHeaders(header);
  1. 使用gzip压缩请求示例

  client.setCompressor(Compressor.Gzip);
  Map<String, String> header = new HashMap<String, String>();
  header.put("Content-Encoding", "gzip");
  client.addExtraHeaders(header);

支持返回数据压缩

如果推荐接口返回的数据比较大,也可以告诉引擎进行返回数据的压缩。目前引擎接口支持zstd、lz4、gzip 三种压缩方式。

警告

必须使用eas-sdk2.0.26以上版本。

  1. 使用zstd解压示例

除了上述文档的client 设置,需要额外设置如下:

  • setDecompressor eas-sdk 使用哪种方式进行解压返回的数据

  • Accept-Encoding 请求头设置这个,告诉引擎采用哪种方式进行压缩返回的数据

  client.setDecompressor(Compressor.Zstd);
  Map<String, String> header = new HashMap<String, String>();
  header.put("Accept-Encoding", "zstd");
  client.addExtraHeaders(header);
  1. 使用lz4解压示例

 client.setDecompressor(Compressor.LZ4Frame);
 Map<String, String> header = new HashMap<String, String>();
 header.put("Accept-Encoding", "lz4");
 client.addExtraHeaders(header);
  1. 使用gzip 解压示例

  client.setDecompressor(Compressor.Gzip);
  Map<String, String> header = new HashMap<String, String>();
  header.put("Accept-Encoding", "gzip");
  client.addExtraHeaders(header);