华为云用户手册

  • 响应参数 状态码: 200 表2 响应Body参数 参数 参数类型 描述 [数组元素] Array of ShowGroupResp objects 查询实例集群的消费组信息成功。 表3 ShowGroupResp 参数 参数类型 描述 group Array of ShowGroupEntity objects 消费组信息。 表4 ShowGroupEntity 参数 参数类型 描述 group_id String 消费组的名称。 state String 消费组状态。包含以下状态: Dead:消费组内没有任何成员,且没有任何元数据。 Empty:消费组内没有任何成员,存在元数据。 PreparingRebalance:准备开启rebalance。 CompletingRebalance:所有成员加入group。 Stable:消费组内成员可正常消费。 coordinator_id Integer 协调器编号。 members Array of MemberEntity objects 消费者列表。 group_message_offsets Array of GroupMessageOffsetsEntity objects 消费进度。 assignment_strategy String 分区分配策略。 表5 MemberEntity 参数 参数类型 描述 host String 消费组consumer地址。 assignment Array of AssignmentEntity objects consumer分配到的分区信息。 member_id String 消费组consumer的ID。 client_id String 客户端ID。 表6 AssignmentEntity 参数 参数类型 描述 topic String topic名称。 partitions Array of integers 分区列表。 表7 GroupMessageOffsetsEntity 参数 参数类型 描述 partition Integer 分区编号。 lag Integer 剩余可消费消息数,即消息堆积数。 topic String topic名称。 message_current_offset Integer 当前消费进度。 message_log_end_offset Integer 最大消息位置(LEO)。
  • 请求示例 创建一个设备,协议类型为MQTT,产品类型为普通产品,设备状态为启用 { "parent_device_id" : 10001, "product" : { "product_id" : 10001, "product_name" : "testproduct", "manufacturer_id" : "test", "model" : "mate30pro", "protocol_type" : 0, "product_type" : 0 }, "password" : "Testpassword@1", "device_name" : "device", "node_id" : "D32145A100FF", "app_id" : "ef3845be-091a-4ab5-869a-9de0025e2165", "status" : 0, "description" : "device", "tags" : [ "tag1", "tag2" ] }
  • 响应示例 状态码: 201 Created { "msg" : "SENDMESSAGE_SUCCESS.", "code" : "iot.api.device.command.post.service.sendMessage.success" } 状态码: 400 Bad Request { "error_code" : "SCB.00000000", "error_msg" : "Parameter is not valid for operation [romalink.link-device.save]. Parameter is [parent_device_id]. Processor is [body].", "request_id" : "cb39e78a-afd3-4e04-901d-70468b1c23dc-1619602712496-cnnorth7a-P-romalink-service01" } 状态码: 404 Not Found { "error_code" : "ROMA.00110006", "error_msg" : "The resource does not exist. Check whether the resource ID ff38023c-0854-4779-847d-72528e1f5da1 is correct.", "request_id" : "624c8be1-39b6-47b7-941d-c159aced368a-1619602544650-cnnorth7a-P-romalink-service01" } 状态码: 500 Internal Server Error { "error_code" : "ROMA.00110002", "error_msg" : "The instance does not exist. project_id: 397cd10b30544c588b2f4a56d83856c4, instance_id: f3bb386a-23ec-47aa-9943-4c60ac658611", "request_id" : "c8c06d0a-be92-4fdf-9d10-bc20131ab158-1619593104919-cnnorth7a-P-romalink-service01" }
  • 响应参数 状态码: 201 表5 响应Body参数 参数 参数类型 描述 code String 下发命令响应状态码 最小值:1 最大值:200 msg String 下发命令具体信息 最小长度:0 最大长度:200 状态码: 400 表6 响应Body参数 参数 参数类型 描述 error_code String 系统错误码,针对4xx和5xx类HTTP错误码的详细错误码 最小长度:0 最大长度:64 error_msg String 错误描述 最小长度:0 最大长度:200 request_id String 消息ID 最小长度:0 最大长度:64 状态码: 404 表7 响应Body参数 参数 参数类型 描述 error_code String 系统错误码,针对4xx和5xx类HTTP错误码的详细错误码 最小长度:0 最大长度:64 error_msg String 错误描述 最小长度:0 最大长度:200 request_id String 消息ID 最小长度:0 最大长度:64 状态码: 500 表8 响应Body参数 参数 参数类型 描述 error_code String 系统错误码,针对4xx和5xx类HTTP错误码的详细错误码 最小长度:0 最大长度:64 error_msg String 错误描述 最小长度:0 最大长度:200 request_id String 消息ID 最小长度:0 最大长度:64
  • 请求参数 表3 请求Header参数 参数 是否必选 参数类型 描述 X-Auth-Token 是 String 用户Token。通过调用IAM服务获取用户Token接口获取(响应消息头中X-Subject-Token的值)。 最小长度:1 最大长度:100000 表4 请求Body参数 参数 是否必选 参数类型 描述 SendCustomizeCommandRequestBody 否 String 自定命令下发Body
  • 代码示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 import numpy as np import time import json from concurrent.futures import ThreadPoolExecutor, wait from elasticsearch import Elasticsearch from elasticsearch import helpers endpoint = 'http://xxx.xxx.xxx.xxx:9200/' # 构建es客户端对象 es = Elasticsearch(endpoint) # 索引mapping信息 index_mapping = ''' { "settings": { "index": { "vector": "true" } }, "mappings": { "properties": { "my_vector": { "type": "vector", "dimension": 128, "indexing": true, "algorithm": "GRAPH", "metric": "euclidean" } } } } ''' # 创建索引 def create_index(index_name, mapping): res = es.indices.create(index=index_name, ignore=400, body=mapping) print(res) # 删除索引 def delete_index(index_name): res = es.indices.delete(index=index_name) print(res) # 刷新索引 def refresh_index(index_name): res = es.indices.refresh(index=index_name) print(res) # 索引段合并 def merge_index(index_name, seg_cnt=1): start = time.time() es.indices.forcemerge(index=index_name, max_num_segments=seg_cnt, request_timeout=36000) print(f"在{time.time() - start}秒内完成merge") # 加载向量数据 def load_vectors(file_name): fv = np.fromfile(file_name, dtype=np.float32) dim = fv.view(np.int32)[0] vectors = fv.reshape(-1, 1 + dim)[:, 1:] return vectors # 加载ground_truth数据 def load_gts(file_name): fv = np.fromfile(file_name, dtype=np.int32) dim = fv.view(np.int32)[0] gts = fv.reshape(-1, 1 + dim)[:, 1:] return gts def partition(ls, size): return [ls[i:i + size] for i in range(0, len(ls), size)] # 写入向量数据 def write_index(index_name, vec_file): pool = ThreadPoolExecutor(max_workers=8) tasks = [] vectors = load_vectors(vec_file) bulk_size = 1000 partitions = partition(vectors, bulk_size) start = time.time() start_id = 0 for vecs in partitions: tasks.append(pool.submit(write_bulk, index_name, vecs, start_id)) start_id += len(vecs) wait(tasks) print(f"在{time.time() - start}秒内完成写入") def write_bulk(index_name, vecs, start_id): actions = [ { "_index": index_name, "my_vector": vecs[j].tolist(), "_id": str(j + start_id) } for j in range(len(vecs)) ] helpers.bulk(es, actions, request_timeout=3600) # 查询索引 def search_index(index_name, query_file, gt_file, k): print("Start query! Index name: " + index_name) queries = load_vectors(query_file) gt = load_gts(gt_file) took = 0 precision = [] for idx, query in enumerate(queries): hits = set() query_json = { "size": k, "_source": False, "query": { "vector": { "my_vector": { "vector": query.tolist(), "topk": k } } } } res = es.search(index=index_name, body=json.dumps(query_json)) for hit in res['hits']['hits']: hits.add(int(hit['_id'])) precision.append(len(hits.intersection(set(gt[idx, :k]))) / k) took += res['took'] print("precision: " + str(sum(precision) / len(precision))) print(f"在{took / 1000:.2f}秒内完成检索,平均took大小为{took / len(queries):.2f}毫秒") if __name__ == "__main__": vec_file = r"./data/sift/sift_base.fvecs" qry_file = r"./data/sift/sift_query.fvecs" gt_file = r"./data/sift/sift_groundtruth.ivecs" index = "test" create_index(index, index_mapping) write_index(index, vec_file) merge_index(index) refresh_index(index) search_index(index, qry_file, gt_file, 10)
  • 约束限制 变更规格操作不支持修改“节点数量”和“节点存储容量”。增加“节点数量”和“节点存储容量”请执行扩容操作。减少“节点数量”请执行缩容操作。 若将大规格更改为小规格,集群的处理性能将会降低,将会影响业务能力,请谨慎操作。 当集群包含多种节点类型时,一次只支持变更一种类型的节点规格,且变更完成后只生效所选类型的节点规格。 变更规格过程中,Kibana不可用。 变更规格过程中,会依次对节点进行关机,完成更改后依次开机。是一个滚动的变更过程。
  • SecuredHttpClientConfigCallback代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 import org.apache.http.client.CredentialsProvider; import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.common.Nullable; import java.util.Objects; class SecuredHttpClientConfigCallback implements RestClientBuilder.HttpClientConfigCallback { @Nullable private final CredentialsProvider credentialsProvider; /** * The {@link SSLIOSessionStrategy} for all requests to enable SSL / TLS encryption. */ private final SSLIOSessionStrategy sslStrategy; /** * Create a new {@link SecuredHttpClientConfigCallback}. * * @param credentialsProvider The credential provider, if a username/password have been supplied * @param sslStrategy The SSL strategy, if SSL / TLS have been supplied * @throws NullPointerException if {@code sslStrategy} is {@code null} */ SecuredHttpClientConfigCallback(final SSLIOSessionStrategy sslStrategy, @Nullable final CredentialsProvider credentialsProvider) { this.sslStrategy = Objects.requireNonNull(sslStrategy); this.credentialsProvider = credentialsProvider; } /** * Get the {@link CredentialsProvider} that will be added to the HTTP client. * * @return Can be {@code null}. */ @Nullable CredentialsProvider getCredentialsProvider() { return credentialsProvider; } /** * Get the {@link SSLIOSessionStrategy} that will be added to the HTTP client. * * @return Never {@code null}. */ SSLIOSessionStrategy getSSLStrategy() { return sslStrategy; } /** * Sets the {@linkplain HttpAsyncClientBuilder#setDefaultCredentialsProvider(CredentialsProvider) credential provider}, * * @param httpClientBuilder The client to configure. * @return Always {@code httpClientBuilder}. */ @Override public HttpAsyncClientBuilder customizeHttpClient(final HttpAsyncClientBuilder httpClientBuilder) { // enable SSL / TLS httpClientBuilder.setSSLStrategy(sslStrategy); // enable user authentication if (credentialsProvider != null) { httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); } return httpClientBuilder; } }
  • ESSecuredClientWithCerDemo代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 import org.apache.commons.io.IOUtils; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.HttpHost; import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.builder.SearchSourceBuilder; import java.io.FileInputStream; import java.io.IOException; import java.security.KeyStore; import java.security.SecureRandom; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManagerFactory; public class ESSecuredClientWithCerDemo { private static final String KEY_STORE_PWD = ""; private static final String TRUST_KEY_STORE_PWD = ""; private static final String CA_JKS_PATH = "ca.jks"; private static final String CLIENT_JKS_PATH = "client.jks"; private static final String ELB_ADDRESS = "127.0.0.1"; private static final int ELB_PORT = 9200; private static final String CSS_USERNAME = "user"; private static final String CSS_PWD = ""; public static void main(String[] args) { // 建立客户端 RestHighLevelClient client = initESClient(ELB_ADDRESS, CSS_USERNAME, CSS_PWD); try { // 查询 match_all,相当于 {\"query\": {\"match_all\": {}}} SearchRequest searchRequest = new SearchRequest(); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.matchAllQuery()); searchRequest.source(searchSourceBuilder); // query SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); System.out.println("query result: " + searchResponse.toString()); SearchHits hits = searchResponse.getHits(); for (SearchHit hit : hits) { System.out.println(hit.getSourceAsString()); } System.out.println("query success"); Thread.sleep(2000L); } catch (InterruptedException | IOException e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(client); } } private static RestHighLevelClient initESClient(String clusterAddress, String userName, String password) { final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password)); SSLContext ctx = null; try { KeyStore ks = getKeyStore(CLIENT_JKS_PATH, KEY_STORE_PWD, "JKS"); KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); kmf.init(ks, KEY_STORE_PWD.toCharArray()); KeyStore tks = getKeyStore(CA_JKS_PATH, TRUST_KEY_STORE_PWD, "JKS"); TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); tmf.init(tks); ctx = SSLContext.getInstance("SSL", "SunJSSE"); ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), new SecureRandom()); } catch (Exception e) { e.printStackTrace(); } SSLIOSessionStrategy sessionStrategy = new SSLIOSessionStrategy(ctx, new HostnameVerifier() { @Override public boolean verify(String arg0, SSLSession arg1) { return true; } }); SecuredHttpClientConfigCallback httpClientConfigCallback = new SecuredHttpClientConfigCallback(sessionStrategy, credentialsProvider); RestClientBuilder builder = RestClient.builder(new HttpHost(clusterAddress, ELB_PORT, "https")) .setHttpClientConfigCallback(httpClientConfigCallback); RestHighLevelClient client = new RestHighLevelClient(builder); return client; } private static KeyStore getKeyStore(String path, String pwd, String type) { KeyStore keyStore = null; FileInputStream is = null; try { is = new FileInputStream(path); keyStore = KeyStore.getInstance(type); keyStore.load(is, pwd.toCharArray()); } catch (Exception e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(is); } return keyStore; } }
  • 调用API 构造API请求,示例如下: POST https://{Address}/{Path}?{Query} {Header} { {Body} } POST:请求方法,需替换为获取API的请求信息中获取的请求方法。 {Address}:请求地址,需替换为获取API的请求信息中获取的域名地址。您也可以使用IP地址访问API, API调用场景 API请求参数配置 使用域名调用API ROMA Connect允许使用分组分配的子域名或分组绑定的域名调用API,无需另外配置。 使用IP调用DEFAULT分组的API ROMA Connect允许使用IP地址调用DEFAULT分组下的API,无需另外配置。 使用IP调用非DEFAULT分组的API ROMA Connect的实例配置参数“app_route”已设置为“on”,允许通过IP访问API。 ROMA Connect不允许使用IP地址直接调用非DEFAULT分组下的API,需要在请求消息中添加Header参数“X-HW-ID”,参数值为API所授权集成应用的Key或客户端的AppKey。 {Path}:请求路径,需替换为获取API的请求信息中获取的请求路径。 {Query}:查询参数,可选,格式为“参数名=参数取值”,例如limit=10,多个查询参数之间使用“&”隔开。需根据获取API的请求信息中获取的请求参数进行设置。 {Header}:请求头参数,格式为“参数名: 参数取值”,例如Content-Type: application/json。需根据获取API的请求信息中获取的请求参数进行设置。 {Body}:请求消息体,JSON格式。需根据获取API的请求信息中获取的请求体内容描述进行设置。 为API请求添加认证信息。 API认证方式 API请求参数配置 APP认证(签名认证) 使用获取的SDK对API请求进行签名,具体请参考APP认证开发。 APP认证(简易认证) 在API请求中添加Header参数“X-Apig-AppCode”,参数值为获取API的认证信息中获取到的AppCode。 APP认证(绿色通道白名单) 在API请求中添加Header参数“X-HW-ID”,参数值为API所授权集成应用的Key或客户端的AppKey。 APP认证(app_secret认证) ROMA Connect的实例配置参数“app_secret”已设置为“on”,开启app_secret认证。 在API请求中添加Header参数“X-HW-ID”,参数值为API所授权集成应用的Key或客户端的AppKey。 在API请求中添加Header参数“X-HW-AppKey”,参数值为获取API的认证信息中获取到的Secret或AppSecret。 APP认证(app_basic认证) ROMA Connect的实例配置参数“app_basic”已设置为“on”,开启app_basic认证。 在API请求中添加Header参数“Authorization”,参数值为"Basic "+base64(appkey+":"+appsecret),其中appkey和appsecret分别为获取API的认证信息中获取到的Key和Secret(或AppKey和AppSecret)。 APP认证(双重认证) 在API请求中同时携带APP认证和自定义认证的认证信息。 IAM认证(Token认证) 先获取云服务平台的认证Token,然后在API请求中添加Header参数“X-Auth-Token”,参数值为认证Token,具体请参考IAM认证开发(Token)。 IAM认证(AK/SK认证) 使用获取的SDK对API请求进行签名,具体请参考IAM认证开发(AK/SK)。 IAM认证(双重认证) 在API请求中同时携带IAM认证和自定义认证的认证信息。 自定义认证 根据自定义认证的定义,在API请求参数中携带相关认证信息进行认证。 无认证 无需认证,可直接调用API。 Site实例中不支持华为IAM认证。
  • 前提条件 在调用API前,确保您的业务系统所在网络与API的访问域名或地址互通。 若业务系统与ROMA Connect实例在相同VPC内时,可直接访问API。 若业务系统与ROMA Connect实例在同一区域的不同VPC内时,可通过创建VPC对等连接,将两个VPC的网络打通,实现同一区域跨VPC访问API。具体步骤请参考VPC对等连接说明。 若业务系统与ROMA Connect实例在不同区域的不同VPC内时,可通过创建云连接实例并加载需要互通的VPC,将两个VPC的网络打通,实现跨区域跨VPC访问API。具体步骤请参考跨区域VPC互通。 若业务系统与ROMA Connect实例通过公网互通,请确保ROMA Connect实例已绑定弹性IP。
  • 为租户绑定流控策略 如果希望对某个租户进行流量控制,可以通过在流控策略中添加特殊租户实现。把租户添加到流控策略中后,该租户的用户流量限制受特殊租户的阈值限制,API流量限制和应用流量限制受流控策略限制。 在“策略管理”页签右上角的过滤条件中选择“流量控制”。 在页面中单击流控策略的名称,进入策略详情页面。 在“特殊租户”页签下,单击“添加特殊租户”。 在添加特殊租户弹窗中配置租户相关信息。 表3 特殊租户配置 参数 说明 租户ID 填写要绑定该流控策略的租户ID。 使用APP认证方式调用API时,租户ID为使用的集成应用所属用户的项目ID。 使用IAM认证方式调用API时,租户ID为调用者的账号ID。 您可以单击控制台右上角的用户名,选择“我的凭证”,在我的凭证页面获取用户的项目ID和账号ID。 阈值 填写单位时间内,该租户调用API的次数上限。参数值不能大于流控策略的“API流量限制”值。 单击“确定”,完成租户与流控策略的绑定。
  • 为应用绑定流控策略 如果希望对某个集成应用进行流量控制,可以通过在流控策略中添加特殊应用实现。把集成应用添加到流控策略中后,该集成应用的凭据流量限制受特殊应用的阈值限制,API流量限制和用户流量限制受流控策略限制。 在“策略管理”页签右上角的过滤条件中选择“流量控制”。 在页面中单击流控策略的名称,进入策略详情页面。 在“特殊凭据”页签下,单击“添加特殊应用”。 在添加特殊应用弹窗中配置应用相关信息。 表2 特殊应用配置 参数 说明 选择应用 选择集成应用的类型。 已有应用:用户自己创建的集成应用。 其他:其他用户创建的集成应用,需要填写当前实例下其他用户创建的集成应用ID。 应用名称 仅当“选择应用”选择“已有应用”时需要配置。 选择要绑定该流控策略的集成应用。 阈值 填写单位时间内,该集成应用调用API的次数上限。参数值不能大于流控策略的“API流量限制”值。 单击“确定”,完成集成应用与流控策略的绑定。
  • 概述 流量控制可限制单位时间内API的被调用次数,保护后端服务。为了提供持续稳定的服务,您可以创建流控策略,对绑定策略的API进行流量控制。 流量控制策略和API本身是相互独立的,只有将API绑定流量控制策略后,流量控制策略才对API生效。 同一个API在同一个环境中只能绑定一个流控策略,一个流控策略可以绑定多个API。 若API被触发流量控制,则流控期间该API的所有调用请求都将被丢弃,并向调用方返回失败响应。
  • 业务场景 ROMA Connect支持把实例的应用和任务以资产文件形式导出,也可以把资产文件导入ROMA Connect,实现集成资产的快速恢复或迁移,资产文件的导入导出操作请参见导入导出资产。 资产恢复:从ROMA Connect实例导出集成资产进行数据备份,若后续因实例故障或数据丢失需要恢复资产数据,可将备份的资产文件再导入实例进行资产恢复。 建议定期导出资产文件进行数据备份(如按月导出资产文件),以供数据恢复使用。 资产迁移:把其他ROMA Connect实例导出的集成资产文件导入新建的实例,实现集成资产的快速部署和使用。 ROMA Connect的资产导入功能仅支持集成资产数据导入,不支持资产相关的实例配置数据导入。在完成集成资产的导入后,还需要完成资产相关的实例配置。 表1 实例配置 分类 数据项 说明 处理方式 实例公共 集成应用的Secret 集成应用的Secret为非资产数据。 资产导入后系统自动生成新的Secret,需要通知业务应用更新Secret。 集成应用的授权信息 集成应用的用户授权信息为非资产数据。 资产导入后重新配置用户授权。 数据集成 数据源的连接信息 数据源的连接信息包括地址、账号和密码,为非资产数据。 资产导入后重新为对应数据源配置连接信息。 服务集成 未发布RELEASE环境的API 未发布RELEASE环境的API包括未发布的API和发布在非RELEASE环境的API,为非资产数据。 资产导入后根据需要重新创建和发布API。 API的环境类信息 API的环境类信息包括独立域名、环境变量、负载通道的云服务器信息、非默认的环境,为非资产数据。 资产导入后需重新配置环境类信息。 API的控制策略信息 API的控制策略信息包括流量控制策略、访问控制策略、客户端访问控制策略和客户端配额策略,为非资产数据。 资产导入后重新配置控制策略信息。 API的密钥类信息 API的密钥类信息包括签名密钥、客户端的AppCode、自定义后端的密码和证书类型配置值,为非资产数据。 资产导入后: 系统自动为签名密钥生成新的Key和Secret,需要通知后端服务更新Key和Secret。 重新配置客户端的AppCode。 重新为自定义后端配置项配置密码和证书的值。 API授权的黑白名单 API授权的黑白名单信息为非资产数据。 资产导入后重新配置黑白名单信息。 设备集成 设备信息 设备信息非资产数据。 资产导入后重新创建设备信息。 设备的规则信息 设备的规则信息非资产数据。 资产导入后重新创建设备的规则信息。
  • 业务流程 集成资产的恢复/迁移流程如下表所示。 表2 业务流程 序号 操作 说明 1 准备工作 获取集成资产包,并收集周边系统(如数据源、后端服务、业务应用)的对接信息。 2 修改实例配置 修改待恢复或新实例的安全组、配置参数等配置。 3 导入集成资产 在待恢复或新实例中导入集成资产包。 4 修改集成应用配置 修改集成应用的授权配置。 5 修改数据源配置 修改数据源的连接配置。 6 修改API配置 修改API的环境、控制策略、密钥、黑白名单等配置。 7 修改设备配置 批量创建设备和规则。 8 业务对接适配和验证 周边业务系统的对接适配和业务验证。
  • 概述 资产市场是一个基于ROMA Connect构建的生态社区,用户可以把自己在ROMA Connect服务中创建的FDI集成任务(业务流)、集成应用下的资源和连接器作为资产发布到资产市场,供其他用户获取使用。用户可以基于获取到的资产,快速完成应用和数据集成业务的构建,减少了业务的部署时间。 资产市场提供了资产的生命周期管理相关操作,用户可以作为资产发布方,把ROMA Connect服务中的资源发布和上架到资产市场,也可以作为资产使用方,从资产市场订阅资产,然后把资产部署到自己的ROMA Connect服务中使用。 图1 资产生命周期管理
  • 转换证书为PEM格式 格式类型 转换方式(通过OpenSSL工具进行转换) CER/CRT 将“cert.crt”证书文件直接重命名为“cert.pem”。 PFX 提取私钥命令,以“cert.pfx”转换为“key.pem”为例。 openssl pkcs12 -in cert.pfx -nocerts -out key.pem 提取证书命令,以“cert.pfx”转换为“cert.pem”为例。 openssl pkcs12 -in cert.pfx -nokeys -out cert.pem P7B 证书转换,以“cert.p7b”转换为“cert.cer”为例。 openssl pkcs7 -print_certs -in cert.p7b -out cert.cer 将“cert.cer”证书文件直接重命名为“cert.pem”。 DER 提取私钥命令,以“privatekey.der”转换为“privatekey.pem”为例。 openssl rsa -inform DER -outform PEM -in privatekey.der -out privatekey.pem 提取证书命令,以“cert.cer”转换为“cert.pem”为例。 openssl x509 -inform der -in cert.cer -out cert.pem
  • 概述 通过在ROMA Connect中创建数据集成任务,您可以实现不同数据源之间的数据集成转换。ROMA Connect根据您在数据集成任务中的配置,决定如何将指定的源端的一个数据表中的数据集成到目标端的一个数据表中。 数据集成任务的配置分为任务基本信息、制定计划(可选)、源端信息、目标端信息、Mapping信息和异常数据存储(可选)、任务完成后执行(可选)几个部分,本节及接下来的几个小节将对这几部分分别进行介绍。本节主要提供数据集成任务基本信息和任务计划的配置说明。
  • (可选)配置任务计划 如果任务的“集成模式”选择了“定时”,则您还需要为定时任务配置任务计划,告知ROMA Connect何时执行任务。 在创建数据集成任务后,如需修改任务计划,请先停止任务。 如果要集成同步的数据量较大,且任务的执行时间间隔较短,会出现上一次任务调度还没有执行完,下一次任务调度时间点已到的情况。此时ROMA Connect会暂停执行新的调度,等待上一次调度执行完成。 在创建任务页面中配置任务计划。ROMA Connect提供了两种配置任务计划的方式: 简单界面配置 界面配置当前仅支持配置简单的周期循环计划,例如每隔几分钟、几小时或几天执行一次。 图1 简单界面配置 表2 简单界面配置 参数 配置说明 QuartZ Cron表达式 选择“不使用”。 单位 任务执行周期的单位,与“调度周期”配合使用,可设置为“分”、“时”、“日”、“周”或“月”。 调度周期 任务执行周期,根据“单位”选择的不同,可设置值的范围不同。 例如“单位”选择“日”,“调度周期”设置为“1”,则表示数据集成任务每天执行一次。 生效时间 任务的开始执行时间。 描述 填写任务计划的描述信息。 QuartZ Cron表达式配置 QuartZ Cron表达式支持配置灵活多样的任务计划,例如每天凌晨1点到凌晨4点之间,每隔15分钟执行一次任务。这种计划,简单界面配置无法实现,必须通过QuartZ Cron表达式实现。 0 0/15 1-4 * * ? 图2 QuartZ Cron表达式配置 表3 QuartZ Cron表达式配置 参数 配置说明 QuartZ Cron表达式 选择“使用”。 表达式 任务计划对应的QuartZ Cron表达式,ROMA Connect当前仅支持分钟级的计划,故表达式中的“秒”固定为“0”。关于QuartZ Cron表达式的使用详解,请参考附录:QuartZ Cron表达式配置说明。 例如每天凌晨1点到凌晨4点之间,每隔15分钟执行一次任务,该计划对应的QuartZ Cron表达式为: 0 0/15 1-4 * * ? 生效时间 任务的开始执行时间。 描述 填写任务计划的描述信息。 完成任务计划配置后,继续进行下一部分配置,配置源端数据信息。
  • 概述 ROMA Connect对用户资源实现了严格的权限管理,在同一实例内,非管理员权限(Tenant Administrator权限)的IAM用户只能查看和管理自己创建的集成应用和资源,默认不能查看其他IAM用户创建的集成应用和资源。ROMA Connect支持通过集成应用授权的方式,把集成应用下的资源共享给同一账号下的其他IAM用户来查看和使用。 集成应用的授权管理功能,仅能解决同一账号下其他用户间共享的权限,对应用对象进行操作的权限仍然由IAM统一控制。
  • 配置集成应用授权 登录ROMA Connect控制台,在“实例”页面单击具体实例上的“查看控制台”,进入实例控制台。 在左侧的导航栏选择“集成应用”,在页面中找到要授权的集成应用,单击该集成应用后的“应用授权管理”进行授权配置。 管理员权限(Tenant Administrator权限)的用户可以对所有用户创建的集成应用进行授权配置,非管理员权限的用户只能对自己创建的集成应用进行授权配置。 在“应用授权管理”弹窗中为IAM用户授权。 在“用户列表”处勾选要授权的IAM用户。 在“已选择”处为已选择的IAM用户配置集成应用的管理权限。 可为每个用户单独配置权限,也可以单击“权限”右侧的“”为所有已选择用户批量配置权限。 图1 配置应用授权参数 表1 应用权限说明 权限 FDI APIC MQS LINK read 可查看授权应用的数据源。 可查看、调试和导出授权应用的API。 可查看和导出授权应用的Topic。 可查看授权应用的设备、产品和规则,可导出授权应用的设备、产品和规则,并调试设备。 modify 可在授权应用下创建和编辑数据源。 可在授权应用下创建、编辑、发布、下线和导入API。 可在授权应用下创建和编辑Topic。 可在授权应用下创建和编辑设备、产品和规则,可导入设备、产品和规则,可重置设备和产品的密码。 delete 可删除授权应用的数据源。 可删除授权应用的API。 可删除授权应用的Topic。 可删除授权应用的设备、产品和规则,可删除产品属性、Topic类、规则数据源端、规则数据目的端。 access 不涉及。 可对授权应用的API进行授权、访问控制、流量控制、签名密钥绑定API配置。 可对授权应用的Topic进行应用权限配置。 可对设备进行命令下发和强制下线,并且可以对协议为OPC UA和Modbus的设备进行插件配置。 admin 应用管理员权限。 单击“确认”,完成集成应用的授权配置。 您可以在集成应用列表中,单击集成应用左侧的“”,查看该集成应用已授予权限的IAM用户以及授予的权限范围。 使用3中被授权的IAM用户登录ROMA Connect控制台并进入对应的ROMA Connect实例,查看该用户是否具备该集成应用资源的相关管理权限。
  • 前提条件 ROMA Connect与负载通道中服务器之间的网络互通。 若ROMA Connect实例与服务器在相同VPC内时,可直接访问服务器。 若ROMA Connect实例与服务器在同一区域的不同VPC内时,可通过创建VPC对等连接,将两个VPC的网络打通,实现同一区域跨VPC访问服务器。具体步骤请参考VPC对等连接说明。 若ROMA Connect实例与后端服务在不同区域的不同VPC内时,可通过创建云连接实例并加载需要互通的VPC,将两个VPC的网络打通,实现跨区域跨VPC访问服务器。具体步骤请参考跨区域VPC互通。 若ROMA Connect实例与服务器通过公网互通,请确保ROMA Connect实例已绑定弹性IP。 用户账号需要具备VPC Administrator角色权限。
  • 脚本配置示例 { "scope": "basic", "default_interval": 60, "default_time_unit": "second", "api_limit": 100, "app_limit": 50, "user_limit": 50, "ip_limit": 20, "specials": [ { "type": "app", "policies": [ { "key": "e9230d70c749408eb3d1e838850cdd23", "limit": 10 } ] }, { "type": "user", "policies": [ { "key": "878f1b87f71c40a7a15db0998f358bb9", "limit": 10 } ] } ], "algorithm": "counter", "parameters": [ { "id": "3wuj354lpptv0toe0", "value": "reqPath", "type": "path", "name": "reqPath" }, { "id": "53h7e7j11u38l3ocp", "value": "method", "type": "method", "name": "method" }, { "id": "vv502bnb6g40td8u0", "value": "Host", "type": "header", "name": "Host" } ], "rules": [ { "match_regex": "[\"Host\",\"==\",\"www.abc.com\"]", "rule_name": "u8mb", "time_unit": "second", "interval": 2, "limit": 5 } ] }
  • 操作步骤 进入购买ROMA Connect实例页面。 在购买ROMA Connect实例页面中填写实例配置信息,系统会根据您选择的“实例规格”和“购买时长”自动计算费用,然后单击“立即购买”。 表1 实例配置参数 参数 配置说明 计费模式 选择实例的计费模式,可选择“包年/包月”。 区域 选择实例所在的区域,不同区域的实例之间内网互不相通,请选择您的业务就近区域购买实例,以减少网络时延,提高访问速度。 可用区 选择实例所在的可用区,不同可用区之间物理隔离,但内网互通。 如果您需要提高ROMA Connect运行的可靠性,建议您将实例创建在不同的可用区内。 如果您需要较低的网络时延,建议您将实例创建在相同的可用区内。 CPU架构 根据当前环境所支持的CPU架构,可选择项有所不同,选择“x86计算”或“鲲鹏计算”。 实例规格 选择实例的容量规格,请根据您的业务需要选择,实例创建后规格不可修改。 入门版:支持10个连接数,一般适用于5个以下系统的集成。入门版规格不支持设备集成能力。 基础版:支持25个连接数,一般适用于5~10个系统的集成。 专业版:支持80个连接数,一般适用于10~20个系统的集成。 企业版:支持200个连接数,一般适用于20~30个系统的集成。 铂金版:支持800个连接数,一般适用于30个以上系统的集成。 说明: 连接数和系统数仅用于ROMA Connect实例的规格选择参考,并非对实例内的资源数量(如集成任务数、API数和消息Topic数)的限制,与实例的资源配额之间并没有直接关联关系。 系统数说明:系统指的是用户的业务系统,系统数指ROMA Connect实例集成对接的业务系统数量。一个业务系统与ROMA Connect实例之间可以有多个连接。 连接数说明:业务系统和ROMA Connect的交互即为连接,使用不同功能所占用的连接数不同,具体的资源和连接数换算关系如下。 数据集成:2个运行状态的数据集成任务占用1个连接。 服务集成:10个托管类API(非自定义后端发布生成的API)占用1个连接;5个函数API或数据API占用1个连接。 消息集成:3个消息Topic占用1个连接。 设备集成:1000个设备占用1个连接。 例如,某企业的业务系统需要使用ROMA Connect进行业务集成:其中需要创建50个数据集成任务进行数据同步,但并行运行的数据集成任务最多为20个,则数据集成所需要使用的连接数为20/2=10;需要创建200个托管类API和20个数据API用于业务功能和数据的开放,则服务集成所需要使用的连接数为200/10+20/5=24;需要创建30个Topic用于系统间消息的连接,则消息集成需要使用的连接数为30/3=10;需要创建5000个设备,用于企业内资产的联网管理,则设备集成需要使用的连接数为5000/1000=5。因此,业务集成所需要使用的连接数总共为10(FDI)+24(APIC)+10(MQS)+5(LINK)=49,应选择“专业版”及以上规格的实例才能满足业务使用需要。 增强功能 仅当“实例规格”选择“基础版”及以上规格时可配置。 选择实例要包含的增强功能,可选择“应用业务模型(ABM)”。 企业项目 选择对应的企业项目,可将实例和企业项目关联。仅企业账号可见此配置项。 实例名称 填写实例的名称,根据规划自定义。 描述 填写实例的描述信息。 虚拟私有云 选择实例所关联的VPC和子网,VPC和子网须在准备资源中提前创建。 安全组 选择实例所关联的安全组,安全组须在准备资源中提前创建。 公网访问 是否开启公网访问ROMA Connect,请根据您的业务需要选择。 弹性IP地址 仅当“公网访问”开启时需要配置。 选择实例所关联的弹性公网IP,弹性公网IP须在准备资源中提前申请。 引擎版本号 选择实例所使用的Kafka服务端版本号,当前支持1.1.0、2.7版本,根据实际情况选择。 消息集成(MQS)容量阈值策略 实例中MQS消息存储达到容量阈值时(存储空间的95%)的处理策略,请根据您的业务需要选择。 生产受限:拒绝消息生产请求,直到有消息到达老化时间被删除,腾出存储空间后(剩余存储空间大于5%),才能接收新的消息生产请求。此策略适用于消息消费处理较慢,或者对存量消息需要反复消费,不能提前删除的场景。 自动删除:自动删除最老的消息(消息总量的10%),腾出存储空间,以接收新的消息生产请求,消息生产业务不受影响。此策略适用于消息消费处理较快,不存在长时间未处理消息的场景。 数据加密传输 SASL_SSL 选择是否开启消息传输的SASL认证和SSL加密,建议您开启SASL认证和SSL加密,提高数据传输的安全性。 数据加密传输 SASL_SSL一旦开启后将无法修改,请根据实际业务需要选择是否启用。 VPC内网明文访问 仅当“数据加密传输 SASL_SSL”开启时可配置。 选择VPC内部是否使用明文访问。 若开启了VPC内网明文访问,则VPC内无法使用SASL方式连接消息集成的Topic,即连接Topic时无需使用证书。 购买时长 实例的购买时长,最短1个月。 您可根据需要选择勾选自动续费,按月购买的自动续费周期为1个月,按年购买的自动续费周期为1年。 在规格确认界面勾选同意协议的选项,然后单击“去支付”,在支付页面付费成功后开始创建实例。 实例创建大概需要18-25分钟,请耐心等待。实例创建成功后,在控制台的“实例”页面可看到该实例的状态为“运行中”。 如果创建实例失败,可删除创建失败的实例,然后重新创建实例。如果重新创建仍然失败,请联系技术支持。
  • 前提条件 在调用API前,确保您的业务系统所在网络与API的访问域名或地址互通。 若业务系统与ROMA Connect实例在相同VPC内时,可直接访问API。 若业务系统与ROMA Connect实例在同一区域的不同VPC内时,可通过创建VPC对等连接,将两个VPC的网络打通,实现同一区域跨VPC访问API。具体步骤请参考VPC对等连接说明。 若业务系统与ROMA Connect实例在不同区域的不同VPC内时,可通过创建云连接实例并加载需要互通的VPC,将两个VPC的网络打通,实现跨区域跨VPC访问API。具体步骤请参考跨区域VPC互通。 若业务系统与ROMA Connect实例通过公网互通,请确保ROMA Connect实例已绑定弹性IP。
  • 调用API 构造API请求,示例如下: POST https://{Address}/{Path}?{Query} {Header} { {Body} } POST:请求方法,需替换为获取API的请求信息中获取的请求方法。 {Address}:请求地址,需替换为获取API的请求信息中获取的域名地址。您也可以使用IP地址访问API, API调用场景 API请求参数配置 使用域名调用API ROMA Connect允许使用分组分配的子域名或分组绑定的域名调用API,无需另外配置。 使用IP调用DEFAULT分组的API ROMA Connect允许使用IP地址调用DEFAULT分组下的API,无需另外配置。 使用IP调用非DEFAULT分组的API ROMA Connect的实例配置参数“app_route”已设置为“on”,允许通过IP访问API。 ROMA Connect不允许使用IP地址直接调用非DEFAULT分组下的API,需要在请求消息中添加Header参数“X-HW-ID”,参数值为API所授权凭据的Key。 {Path}:请求路径,需替换为获取API的请求信息中获取的URL。 {Query}:查询参数,可选,格式为“参数名=参数取值”,例如limit=10,多个查询参数之间使用“&”隔开。需根据获取API的请求信息中获取的请求参数进行设置。 {Header}:请求头参数,格式为“参数名: 参数取值”,例如Content-Type: application/json。需根据获取API的请求信息中获取的请求参数进行设置。 {Body}:请求消息体,JSON格式。需根据获取API的请求信息中获取的请求体内容描述进行设置。 为API请求添加认证信息。 Site实例中不支持华为IAM认证。 API认证方式 API请求参数配置 APP认证(签名认证) 使用获取的SDK对API请求进行签名,具体请参考APP认证开发。 APP认证(简易认证) 在API请求中添加Header参数“X-Apig-AppCode”,参数值为获取API的认证信息中获取到的AppCode。 APP认证(绿色通道白名单) 在API请求中添加Header参数“X-HW-ID”,参数值为获取API的认证信息中获取到的Key。 APP认证(app_secret认证) ROMA Connect的实例配置参数“app_secret”已设置为“on”,开启app_secret认证。 在API请求中添加Header参数“X-HW-ID”,参数值为获取API的认证信息中获取到的Key。 在API请求中添加Header参数“X-HW-AppKey”,参数值为获取API的认证信息中获取到的Secret。 APP认证(app_basic认证) ROMA Connect的实例配置参数“app_basic”已设置为“on”,开启app_basic认证。 在API请求中添加Header参数“Authorization”,参数值为"Basic "+base64(appkey+":"+appsecret),其中appkey和appsecret分别为获取API的认证信息中获取到的Key和Secret。 APP认证(双重认证) 在API请求中同时携带APP认证和自定义认证的认证信息。 IAM认证(Token认证) 先获取云服务平台的认证Token,然后在API请求中添加Header参数“X-Auth-Token”,参数值为认证Token,具体请参考IAM认证开发(Token)。 IAM认证(AK/SK认证) 使用获取的SDK对API请求进行签名,具体请参考IAM认证开发(AK/SK)。 IAM认证(双重认证) 在API请求中同时携带IAM认证和自定义认证的认证信息。 自定义认证 根据自定义认证的定义,在API请求参数中携带相关认证信息进行认证。 无认证 无需认证,可直接调用API。
  • 转换证书为PEM格式 格式类型 转换方式(通过OpenSSL工具进行转换) CER/CRT 将“cert.crt”证书文件直接重命名为“cert.pem”。 PFX 提取私钥命令,以“cert.pfx”转换为“key.pem”为例。 openssl pkcs12 -in cert.pfx -nocerts -out key.pem 提取证书命令,以“cert.pfx”转换为“cert.pem”为例。 openssl pkcs12 -in cert.pfx -nokeys -out cert.pem P7B 证书转换,以“cert.p7b”转换为“cert.cer”为例。 openssl pkcs7 -print_certs -in cert.p7b -out cert.cer 将“cert.cer”证书文件直接重命名为“cert.pem”。 DER 提取私钥命令,以“privatekey.der”转换为“privatekey.pem”为例。 openssl rsa -inform DER -outform PEM -in privatekey.der -out privatekey.pem 提取证书命令,以“cert.cer”转换为“cert.pem”为例。 openssl x509 -inform der -in cert.cer -out cert.pem
  • 概述 如果您需要对您所拥有的ROMA Connect进行精细的权限管理,您可以使用统一身份认证服务(Identity and Access Management,简称IAM),通过IAM,您可以: 根据企业的业务组织,在您的华为云账号中,给企业中不同职能部门的员工创建IAM用户,让员工拥有唯一安全凭证,并使用ROMA Connect资源。 根据企业用户的职能,设置不同的访问权限,以达到用户之间的权限隔离。 将ROMA Connect资源委托给更专业、高效的其他华为云账号或者云服务,这些账号或者云服务可以根据权限进行代运维。 如果华为云账号已经能满足您的要求,不需要创建独立的IAM用户,您可以跳过本章节,不影响您使用ROMA Connect服务的其它功能。
  • 新增用户组并授权 创建用户组并授权 在IAM控制台创建用户组,并授予ROMA Connect服务只读权限“ROMA ReadOnlyAccess”。 创建用户并加入用户组 在IAM控制台创建用户,并将其加入1中创建的用户组。 用户登录并验证权限 使用新创建的用户登录控制台,切换至授权区域,验证权限: 在“服务列表”中选择应用与数据集成平台,进入ROMA Connect主界面,单击右上角“购买ROMA Connect实例”,尝试购买ROMA Connect实例,如果无法购买ROMA Connect实例(假设当前权限仅包含ROMA ReadOnlyAccess),表示“ROMA ReadOnlyAccess”已生效。 在“服务列表”中选择除ROMA Connect外(假设当前权限仅包含ROMA ReadOnlyAccess)的任一服务,若提示权限不足,表示“ROMA ReadOnlyAccess”已生效。
共100000条