一、背景
需要使用acl_token读取consul上的服务列表,主要使用的api为/v1/catalog/services和/v1/catalog/service/$serviceName
二、命令访问
curl \
--header "X-Consul-Token: 323dsf5t-3ed5-4a36-77ae-5f370e9f54rf" \
http://172.16.10.65:8500/v1/catalog/services
以及
curl \
--header "X-Consul-Token: 323dsf5t-3ed5-4a36-77ae-5f370e9f54rf" \
http://172.16.10.65:8500/v1/catalog/service/user-service
踩坑::
访问/v1/agent/service没有返回值,但是访问/v1/agent/members有值。这个时候却没去思考权限的问题,一直盯着acl_token是最高权限。
/v1/catagory/services访问不报错,只是返回空。坑啊,catagory我是哪里抄来的。
很需要参考网址https://www.cnblogs.com/sshcy/articles/10592734.html,/v1/agent/ 不能使用。
-
catalog endpoints:catalog endpoints用来注册/注销nodes、services、checks
-
agent endpoints:agent endpoints用来和本地agent进行交互,一般用来服务注册和检查注册。
三、程序访问
这里主要采用java语言下的sdk包,
<dependency>
<groupId>com.orbitz.consul</groupId>
<artifactId>consul-client</artifactId>
<version>1.5.3</version>
</dependency>
详细的java示例代码见下:
Consul client = Consul.builder()
.withHostAndPort(HostAndPort.fromString(HOST_AND_PORT))
.withTokenAuth(ACL_TOKEN)
.build();
CatalogClient catalogClient = client.catalogClient();
ConsulResponse<Map<String, List<String>>> response = catalogClient.getServices();
Map<String, List<String>> map = response.getResponse();
for (Map.Entry<String, List<String>> entry : map.entrySet()) {
// entry.getKey() 就是服务名称,比如user-service
// 使用明细接口查询一个服务有多少个节点
ConsulResponse<List<CatalogService>> consulResponse = catalogClient.getService(entry.getKey());
List<CatalogService> catalogServices = consulResponse.getResponse();
for (CatalogService catalogService : catalogServices) {
// catalogService.getServiceName()
// catalogService.getAddress() + ":" + catalogService.getServicePort()
}
}
Consul类除了成员变量catalogClient,还有需要其他的,对应不同的endpoints。如果你使用AgentClient试图获取服务列表的话,那么返回的列表是空,也不会有报错提示。这一点需要特别注意。
private final AgentClient agentClient;
private final AclClient aclClient;
private final HealthClient healthClient;
private final KeyValueClient keyValueClient;
private final CatalogClient catalogClient;
private final StatusClient statusClient;
private final SessionClient sessionClient;
private final EventClient eventClient;
private final PreparedQueryClient preparedQueryClient;
private final CoordinateClient coordinateClient;
private final OperatorClient operatorClient;
private final SnapshotClient snapshotClient;
四、acl_token在哪,担心会不会取错了
image.pngacl_token没错,client的jar包也说已支持token机制了,需要核实的是consul api接口用得对不对。
网友评论