本文件简要介绍两个 consul 客户端的使用。近期因为使用 consul,学习了解 consul 的客户端,主要用来注册服务发现服务:

添加依赖

pom 文件加入如下依赖。

注意 ecwid 是 spring-cloud-consul-core 的依赖包

  1. <dependency>
  2. <groupId>com.ecwid.consul</groupId>
  3. <artifactId>consul-api</artifactId>
  4. <version>1.4.0</version>
  5. </dependency>

或者 orbitz 的 consul 客户端

  1. <!-- consul-client -->
  2. <dependency>
  3. <groupId>com.orbitz.consul</groupId>
  4. <artifactId>consul-client</artifactId>
  5. <version>0.10.0</version>
  6. </dependency>
  7. <!-- consul's dependency-->
  8. <dependency>
  9. <groupId>org.glassfish.jersey.core</groupId>
  10. <artifactId>jersey-client</artifactId>
  11. <version>2.22.2</version>
  12. </dependency>

示例代码

  1. package com.yq.service.impl;
  2. import com.ecwid.consul.v1.ConsulClient;
  3. import com.ecwid.consul.v1.QueryParams;
  4. import com.ecwid.consul.v1.Response;
  5. import com.ecwid.consul.v1.agent.model.NewService;
  6. import com.ecwid.consul.v1.health.model.HealthService;
  7. import com.ecwid.consul.v1.kv.model.GetValue;
  8. import com.yq.config.ConsulConfig;
  9. import com.yq.service.IConsulService;
  10. import lombok.extern.slf4j.Slf4j;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.stereotype.Component;
  13. import org.springframework.stereotype.Service;
  14. import java.util.Arrays;
  15. import java.util.List;
  16. /**
  17. * Simple to Introduction
  18. * 本代码只是为了说明如何使用consul api,两个serviceImpl都实现了接口 IConsulService
  19. * @version 2018/9/1 10:01
  20. */
  21. @Service
  22. @Slf4j
  23. @Component
  24. public class EcwidConsulServiceImpl implements IConsulService {
  25. @Autowired
  26. private ConsulConfig consulConfig;
  27. private ConsulClient client = null;
  28. public EcwidConsulServiceImpl() {
  29. log.info("consulConfig={}", consulConfig);
  30. //client = new ConsulClient(consulConfig.getConsulIP(), consulConfig.getConsulPort());
  31. client = new ConsulClient("127.0.0.1", 8500);
  32. }
  33. @Override
  34. public void registerService(String serviceName, String serviceId) {
  35. // register new service
  36. NewService newService = new NewService();
  37. newService.setId(serviceId);
  38. newService.setName(serviceName);
  39. newService.setTags(Arrays.asList("EU-West", "EU-East"));
  40. newService.setPort(8080);
  41. NewService.Check serviceCheck = new NewService.Check();
  42. serviceCheck.setHttp("http://127.0.0.1:8080/health");
  43. serviceCheck.setInterval("10s");
  44. newService.setCheck(serviceCheck);
  45. client.agentServiceRegister(newService);
  46. }
  47. @Override
  48. public List<HealthService> findHealthyService(String serviceName) {
  49. Response<List<HealthService>> healthyServices = client.getHealthServices(serviceName, true, QueryParams.DEFAULT);
  50. return healthyServices.getValue();
  51. }
  52. @Override
  53. public void storeKV(String key, String value) {
  54. Response<Boolean> booleanResponse = client.setKVValue(key, value);
  55. }
  56. @Override
  57. public String getKV(String key) {
  58. Response<GetValue> getValueResponse = client.getKVValue(key);
  59. //return getValueResponse.getValue().getValue();
  60. return getValueResponse.getValue().getDecodedValue();
  61. }
  62. @Override
  63. public List<String> findRaftPeers() {
  64. Response<List<String>> listResponse = client.getStatusPeers();
  65. return listResponse.getValue();
  66. }
  67. @Override
  68. public String findRaftLeader() {
  69. Response<String> stringResponse = client.getStatusLeader();
  70. return stringResponse.getValue();
  71. }
  72. }

orbitz 的代码类似,主要区别在 Ecwid 的服务是 HealthService, 而 orbitz 的服务是 ServiceHealth. 以及获取 key/value 的差异。详情可见代码

效果展示


第一个例子,先使用 Ecwid 客户端注册服务,然后通过 Ecwid 和 orbitz 分别获取服务
注册的服务

Consul客户端 (orbitz与ecwid) API介绍 - 图1

分别使用两种客户端获取服务

Consul客户端 (orbitz与ecwid) API介绍 - 图2

第二个例子,我们使用 orbitz 在 consul 上创建 key/value,然后分别通过 orbitz 和 ecwid 获取该 key 的值。

Consul客户端 (orbitz与ecwid) API介绍 - 图3