你的位置:首页 > Java教程

[Java教程]第二十章 springboot + consul(1)


consul的具体安装与操作查看博客的consul系列。

一、启动consul

(1个server+1个client,方便起见,client使用本机):查看:http://www.cnblogs.com/java-zhao/p/5375132.html

1、开启虚拟机-->切换到vagrantFile中配置的节点

  • vagrant up
  • vagrant ssh n110

2、启动server(n110)

  • consul agent -server -bootstrap-expect=1  -data-dir=/tmp/consul -node=server-110 -bind=192.168.21.110 -dc=zjgdc1 -client 0.0.0.0 -ui

说明:-client 0 0 0 0 -ui-->使得客户端可以直接通过url访问服务端的consul ui

3、启动client(local)

  • consul agent -data-dir=/tmp/consul -node=client-my -bind=xxx -dc=zjgdc1

说明:xxx代表本机IP

4、client加入server

  • consul join 192.168.21.110

二、java部分

1、pom.

    <!-- consul-client -->    <dependency>      <groupId>com.orbitz.consul</groupId>      <artifactId>consul-client</artifactId>      <version>0.10.0</version>    </dependency>    <!-- consul需要的包 -->    <dependency>      <groupId>org.glassfish.jersey.core</groupId>      <artifactId>jersey-client</artifactId>      <version>2.22.2</version>    </dependency>

说明:consul的java客户端有两个:consul-client和consul-api。

consul-client的github地址:https://github.com/OrbitzWorldwide/consul-client

2、ConsulService

 1 package com.xxx.firstboot.service; 2  3 import java.net.MalformedURLException; 4 import java.net.URI; 5 import java.util.List; 6  7 import org.springframework.stereotype.Service; 8  9 import com.orbitz.consul.AgentClient;10 import com.orbitz.consul.Consul;11 import com.orbitz.consul.HealthClient;12 import com.orbitz.consul.KeyValueClient;13 //import com.orbitz.consul.NotRegisteredException;14 import com.orbitz.consul.StatusClient;15 import com.orbitz.consul.model.health.ServiceHealth;16 17 @Service18 public class ConsulService {19   20   /**21    * 注册服务22    * 并对服务进行健康检查23    * servicename唯一24    * serviceId:没发现有什么作用25   */26   public void registerService(String serviceName, String serviceId) {27     Consul consul = Consul.builder().build();      //建立consul实例28     AgentClient agentClient = consul.agentClient();    //建立AgentClient29     30     try {31       /**32        * 注意该注册接口:33        * 需要提供一个健康检查的服务URL,以及每隔多长时间访问一下该服务(这里是3s)34       */35       agentClient.register(8080, URI.create("http://localhost:8080/health").toURL(), 3, serviceName, serviceId, "dev");36     } catch (MalformedURLException e) {37       e.printStackTrace();38     }39 //    try {40 //      agentClient.pass(serviceId);//健康检查41 //    } catch (NotRegisteredException e) {42 //      e.printStackTrace();43 //    }44   }45   46   /**47    * 发现可用的服务48   */49   public List<ServiceHealth> findHealthyService(String servicename){50     Consul consul = Consul.builder().build();51     HealthClient healthClient = consul.healthClient();//获取所有健康的服务52     return healthClient.getHealthyServiceInstances(servicename).getResponse();//寻找passing状态的节点53   }54   55   /**56    * 存储KV57   */58   public void storeKV(String key, String value){59     Consul consul = Consul.builder().build();60     KeyValueClient kvClient = consul.keyValueClient();61     kvClient.putValue(key, value);//存储KV62   }63   64   /**65    * 根据key获取value66   */67   public String getKV(String key){68     Consul consul = Consul.builder().build();69     KeyValueClient kvClient = consul.keyValueClient();70     return kvClient.getValueAsString(key).get();71   }72   73   /**74    * 找出一致性的节点(应该是同一个DC中的所有server节点)75   */76   public List<String> findRaftPeers(){77     StatusClient statusClient = Consul.builder().build().statusClient();78     return statusClient.getPeers();79   }80   81   /**82    * 获取leader83   */84   public String findRaftLeader(){85     StatusClient statusClient = Consul.builder().build().statusClient();86     return statusClient.getLeader();87   }88   89 }

列出了常用API。

注意:服务注册的时候需要给出health check的url和时间间隔。该url是一个服务(要提供该服务,需要使用spring boot actuator,具体操作如下:)。

直接在pomx.ml中加入:

1     <dependency>2       <groupId>org.springframework.boot</groupId>3       <artifactId>spring-boot-starter-actuator</artifactId>4     </dependency>

此时重启应用后,访问http://localhost:8080/health,得到如下结果一个json串:

 1 { 2 status: "UP", 3 diskSpace: - { 4 status: "UP", 5 total: 249769230336, 6 free: 182003318784, 7 threshold: 10485760 8 }, 9 rabbit: - {10 status: "UP",11 version: "3.6.1"12 },13 mongo: - {14 status: "UP",15 version: "3.2.6"16 },17 db: - {18 status: "UP",19 myTestDbDataSource: - {20 status: "UP",21 database: "MySQL",22 hello: 123 },24 myTestDb2DataSource: - {25 status: "UP",26 database: "MySQL",27 hello: 128 },29 dataSource: - {30 status: "UP",31 database: "MySQL",32 hello: 133 }34 },35 _links: - {36 self: - {37 href: "http://localhost:8080/health"38 }39 }40 }41 Format online

说明:status

  • UP:服务器正常(以上只要有一个组件DOWN,服务器就处于DOWN,所以我需要启动服务器上的mongo和rabbitmq,这里我之前使用了这两个组件)
  • DOWN:服务器挂了

3、ConsulController

 1 package com.xxx.firstboot.web; 2  3 import java.util.List; 4  5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.web.bind.annotation.PathVariable; 7 import org.springframework.web.bind.annotation.RequestMapping; 8 import org.springframework.web.bind.annotation.RequestMethod; 9 import org.springframework.web.bind.annotation.RestController;10 11 import com.orbitz.consul.model.health.ServiceHealth;12 import com.xxx.firstboot.service.ConsulService;13 14 import io.swagger.annotations.Api;15 import io.swagger.annotations.ApiOperation;16 17 @Api("consul相关API")18 @RestController19 @RequestMapping("/consul")20 public class ConsulController {21   @Autowired22   private ConsulService consulService;23 24   /*******************************服务注册与发现*******************************/25   @ApiOperation("注册服务")26   @RequestMapping(value="/registerService/{servicename}/{serviceid}",method=RequestMethod.POST)27   public void registerService(@PathVariable("servicename") String serviceName, 28                 @PathVariable("serviceid") String serviceId) {29     consulService.registerService(serviceName, serviceId);30   }31   32   @ApiOperation("发现服务")33   @RequestMapping(value="/discoverService/{servicename}",method=RequestMethod.GET)34   public List<ServiceHealth> discoverService(@PathVariable("servicename") String serviceName) {35     return consulService.findHealthyService(serviceName);36   }37   38   /*******************************KV*******************************/39   @ApiOperation("store KV")40   @RequestMapping(value="/kv/{key}/{value}",method=RequestMethod.POST)41   public void storeKV(@PathVariable("key") String key, 42             @PathVariable("value") String value) {43     consulService.storeKV(key, value);44   }45   46   @ApiOperation("get KV")47   @RequestMapping(value="/kv/{key}",method=RequestMethod.GET)48   public String getKV(@PathVariable("key") String key) {49     return consulService.getKV(key);50   }51 52   /*******************************server*******************************/53   @ApiOperation("获取同一个DC中的所有server节点")54   @RequestMapping(value="/raftpeers",method=RequestMethod.GET)55   public List<String> findRaftPeers() {56     return consulService.findRaftPeers();57   }58   59   @ApiOperation("获取leader")60   @RequestMapping(value="/leader",method=RequestMethod.GET)61   public String leader() {62     return consulService.findRaftLeader();63   }64 }

4、测试(通过swagger测试+通过consul UI查看结果)

  • swagger:http://localhost:8080/swagger-ui.html
  • consul UI:http://192.168.21.110:8500/ui/

上图展示了consul UI所展示的所有东西。services、nodes、kv、datacenter