- 使用 Spotify 的 Java 客户端库,在项目中添加以下依赖:
com.spotify
docker-client
8.16.0
- 创建一个服务发现类,该类负责查询 Docker Swarm 集群中运行的服务:
import com.spotify.docker.client.DockerClient;
import com.spotify.docker.client.DockerClient.ListServicesParam;
import com.spotify.docker.client.DockerClient.ListTasksParam;
import com.spotify.docker.client.DockerClient.ListTasksParamBuilder;
import com.spotify.docker.client.exceptions.DockerCertificateException;
import com.spotify.docker.client.exceptions.DockerException;
import com.spotify.docker.client.messages.swarm.Service;
import com.spotify.docker.client.messages.swarm.Task;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class DockerSwarmServiceDiscovery {
private final DockerClient dockerClient;
public DockerSwarmServiceDiscovery() throws DockerCertificateException {
this.dockerClient = DefaultDockerClient.fromEnv().build();
}
public List getServiceEndpoints(String serviceName) {
try {
final List services = this.dockerClient.listServices(ListServicesParam.create().serviceName(serviceName)).stream().filter(s -> s.spec().name().equals(serviceName)).collect(Collectors.toList());
final List endpoints = new ArrayList<>();
for (Service service : services) {
final ListTasksParamBuilder tasksParamBuilder = ListTasksParam.builder().serviceId(service.id());
final List tasks = this.dockerClient.listTasks(tasksParamBuilder.build());
for (Task task : tasks) {
endpoints.add(String.format("%s:%d", task.status().containerStatus().containerId(), task.status().containerStatus().ports().get(0).publicPort()));
}
}
return endpoints;
} catch (DockerException | InterruptedException e) {
throw new RuntimeException("Error providing service endpoints", e);
}
}
}
- 在需要使用服务的代码中,实例化上述服务发现类并查询指定服务的 IP 和端口:
final DockerSwarmService