consul api读取服务列表

2021-09-09  本文已影响0人  天草二十六_简村人

一、背景

需要使用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/ 不能使用。

三、程序访问

这里主要采用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.png

acl_token没错,client的jar包也说已支持token机制了,需要核实的是consul api接口用得对不对。

上一篇下一篇

猜你喜欢

热点阅读