在您开始使用CSB时,可能会遇到一些问题。本文汇总了一些高频问题,帮忙您更顺畅的了解和体验CSB。
Dubbo是否支持ZooKeeper注册中心?
支持。配置ZooKeeper注册中心格式为zookeeper://zkhost:zkport?backup=zk1host:zk1port,zk2host:zk2port
。例如zookeeper://127.0.0.1:2181
。
如何使用CSB SDK命令行发送POST请求?
-
查看SDK命令行帮助信息
#java -jar http-client-1.1.5.8.jar usage: java -jar http-client.jar [options...] -method <arg> 请求类型, 默认get, 可选的值为: get, post, cget和cpost。 -url <arg> 测试:请求地址,例如http://CSB服务地址:8086/CSB?p1=v1。CSB服务地址即创建该实例时绑定的SLB的地址。 -api <arg> 服务名。 -version <arg> 服务版本。 -ak <arg> AccessKey ID, 可选。 -sk <arg> AccessKey Secret, 可选。 -D <arg> 请求参数, 格式: -D "key=value" 可以定义多个-D参数。 -H <arg> HTTP Header, 格式: -H "key:value" 可以定义多个-H参数。 -cbJSON <arg> 以JSON串方式POST发送的请求body, 例如: -cbJSON "{'name':'wiseking'}"。 -cc,--changeCharset 返回值是否需要转换charset。 -h,--help 打印帮助信息。 -d,--debug 打印调试信息。 -nonce 是否做nonce防重放处理,不定义为不做nonce重放处理。 -proxy <arg> 设置代理地址, 格式: proxy_hostname:proxy_port。 -sdkv,--sdk-version SDK版本信息。 -sign,--signImpl <arg> 客户端签名类, 可选。 -verify,--verifySignImpl <arg> CSB服务端验签类, 可选。
-
发送POST的form请求示例
java -jar http-sdk-1.1.5.8.jar -method post -url "https://CSB服务地址:8086/CSB" -api "服务名" -version "版本号" -ak "ak值" -sk "sk值" -D "参数名1=参数值1" -D "参数名2=参数值2"
说明 CSB服务地址即创建该实例时绑定的SLB的地址。 -
发送POST的JSON请求示例
java -jar http-sdk-1.1.5.8.jar -method post -url "http://CSB服务地址:8086/CSB" -api "服务名" -version "版本号" -ak "ak值" -sk "sk值" -cbJSON "{\"name\":\"name1\"}"
说明 CSB服务地址即创建该实例时绑定的SLB的地址。
如何在Java代码中使用CSB SDK发送POST请求?
请参见SDK 使用说明。下一个问题中也有示例代码可以参考。
将后端HSF/Dubbo服务发布为RESTful服务时,HSF/Dubbo入参是必须要在CSB控制台上配置的吗?
是的。
HSF/Dubbo的入参顺序和类型,必须在CSB控制台上配置,且严格与HSF/Dubbo参数匹配。
例如,HSF的方法定义如下:
String echo(com.alibaba.csb.DemoDTO demoDTO, int count);
其中DemoDTO定义如下:
class DemoDTO{
java.lang.String name;
java.lang.Integer age;
}
则在CSB控制台上的参数定义如下:
调用上述服务的Java示例代码如下:
public void testHttp2hsfDto() {
HttpParameters.Builder builder = new HttpParameters.Builder();
builder.requestURL("http://CSB服务地址:8086/CSB") // 设置请求的URL。其中,CSB服务地址即创建该实例时绑定的SLB的地址.
.api("http2hsfDto") // 设置服务名。
.version("1.0.0") // 设置版本号。
.method("post") // 设置调用方式, get或post。
.accessKey("ak值").secretKey("sk值"); // 设置AccessKey ID和AccessKey Secret。
builder.putParamsMap("demoDTO", "{\"name\":\"name1\",\"age\":12}"); //DTO对象,以JSON方式传递。
builder.putParamsMap("count", 2);
try {
String ret = HttpCaller.invoke(builder.build());
System.out.println("------- ret=" + ret);
} catch (HttpCallerException e) {
e.printStackTrace();
}
}
什么场景下必须配置CSB服务参数?客户端应该使用form还是JSON发送请求?
服务出参是可选的,而服务入参配置和访问的规则如下:
对外开放协议 | 后端接入协议 | 入参配置 | 配置要求 | CSB客户端访问要求 |
---|---|---|---|---|
RESTful | RESTful:form表单 | 可选 | 无。 | HTTP GET或POST的form表单请求 |
RESTful | RESTful:POST的application JSON | 无需配置 | 如果配置入参,则必须为可选参数。 | HTTP POST的application JSON请求 |
RESTful | Dubbo | 必须配置 | 参数类型和顺序必须与Dubbo服务方法入参定义严格匹配。 | HTTP form表单请求 |
RESTful | HSF | 必须配置 | 参数类型和顺序必须与HSF服务方法入参定义严格匹配。 | HTTP form表单请求 |
RESTful | SOAP WebService | 必须配置 | 参数类型和顺序必须与WS服务方法入参定义严格匹配。 | HTTP form表单请求 |
WebService | Dubbo | 必须配置 | 参数类型和顺序必须与Dubbo服务方法入参定义严格匹配。 | 无 |
WebService | HSF | 必须配置 | 参数类型和顺序必须与HSF服务方法入参定义严格匹配。 | 无 |
WebService | SOAP WebService | 无需配置 | 无。 | 无 |
如何使用Postman等工具发送CSB服务请求?
由于需要对发送CSB的服务请求进行签名,故需要使用CSB SDK生成HTTP请求信息(HTTP Header、HTTP Body),然后再使用Postman等工具发送。
生成以HTTP GET方式发送CSB请求串的示例命令如下:
java -jar http-client-1.1.5.8.jar cget "http://CSB服务地址:8086/CSB?参数kv值" "CSB服务名" "CSB服务版本号" "访问凭证ak" "访问凭证sk"
说明 CSB服务地址即创建该实例时绑定的SLB的地址。
生成以HTTP POST方式发送CSB请求串的示例命令如下:
java -jar http-client-1.1.5.8.jar cpost "http://CSB服务地址:8086/CSB?参数kv值" "CSB服务名" "CSB服务版本号" "访问凭证ak" "访问凭证sk" -D "参数1=参数值1"
说明 CSB服务地址即创建该实例时绑定的SLB的地址。
如何让CSB对外开放的服务支持HTTPS?
假设CSB前面一定有负载均衡(如SLB或其它硬件负载均衡等),在此负载均衡上配置HTTPS监听即可。
服务访问报错“access permission deny”
- 请确认使用的凭证AK值正确。
- 请确认使用的凭证已订购指定服务,且服务拥有者审批通过。
服务访问报错“[503]service not registed”
通常有以下几种可能原因及解决办法:
原因 | 解决办法 | 说明 |
---|---|---|
CSB的服务地址或端口不正确 | 使用正确的CSB服务地址和端口 | CSB服务地址即部署CSB Broker的ECS实例的IP地址。如果Broker部署了多个ECS实例,并绑定了SLB,则CSB服务地址为SLB的地址。 |
CSB服务名错误 | 使用正确的CSB服务名 | 大小写敏感 |
CSB服务版本号错误 | 使用正确的服务版本号 | 无 |
服务刚发布 | 发布完成后,过1分钟后再试 | 服务发布后,需要最多1分钟延迟才能生效。 |
服务访问报错“required parameter is missing”
请确认发起的CSB服务调用的请求中,包含了CSB控制台上配置的所有服务入参。