zoukankan      html  css  js  c++  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.xml

            <!-- 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 @Service
    18 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();        //建立AgentClient
    29         
    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      * 存储KV
    57      */
    58     public void storeKV(String key, String value){
    59         Consul consul = Consul.builder().build();
    60         KeyValueClient kvClient = consul.keyValueClient();
    61         kvClient.putValue(key, value);//存储KV
    62     }
    63     
    64     /**
    65      * 根据key获取value
    66      */
    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      * 获取leader
    83      */
    84     public String findRaftLeader(){
    85         StatusClient statusClient = Consul.builder().build().statusClient();
    86         return statusClient.getLeader();
    87     }
    88     
    89 }

    列出了常用API。

    注意:

    • 服务注册的时候不需要传递IP
    • 服务注册的时候需要给出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: 1
    23 },
    24 myTestDb2DataSource: - {
    25 status: "UP",
    26 database: "MySQL",
    27 hello: 1
    28 },
    29 dataSource: - {
    30 status: "UP",
    31 database: "MySQL",
    32 hello: 1
    33 }
    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 @RestController
    19 @RequestMapping("/consul")
    20 public class ConsulController {
    21     @Autowired
    22     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

  • 相关阅读:
    安装GitLab出现ruby_block[supervise_redis_sleep] action run
    docker tag根据镜像id做标签,用于应用的回滚
    Jenkenis报错:该jenkins实例似乎已离线
    kubernetes-批量删除Evicted Pods
    阿里云k8s构建镜像时设置版本号用于版本回滚
    Java虚拟机6:内存溢出和内存泄露、并行和并发、Minor GC和Full GC、Client模式和Server模式的区别
    Java虚拟机5:Java垃圾回收(GC)机制详解
    Java虚拟机4:内存溢出
    Java虚拟机3:常用JVM命令参数
    Java虚拟机2:Java内存区域及对象
  • 原文地址:https://www.cnblogs.com/java-zhao/p/5527779.html
Copyright © 2011-2022 走看看