第二十章 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。

注意:服务注册的时候需要给出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

时间: 2024-10-23 22:58:27

第二十章 springboot + consul(1)的相关文章

JavaScript高级程序设计:第二十章

第二十章 一.语法 JSON的语法可以表示以下三种类型的值: (1)简单值 (2)对象 JSON的对象与javascript字面量有一些不同.例如,在javascript中,前面的对象字面量可以写成下面这样: var  object = { “name” : “Nicholas” , “age” : 29 } ; JSON表示上述对象的方式如下: { “name” : “Nicholas” , “age” : 29 } 不同之处:首先,没有声明变量,其次,没有末尾的分号.最后,对象的属性必须加双

第二十章 内存等空间管理类的实现

                   第二十章   内存等空间管理类的实现      空间.时间对我来说,或许永远是一个迷.即使我曾经深入到原子的最深处,即使人类科学家是自欺欺人,即使我了解到的最深层次的部分真理是正确的:那又能怎样?那都是过去式,在那光明与黑暗一体之地.我的灵魂受伤了:我不得不回到电脑这块充满垃圾的地方修心养性. 或许我的论述方法不好,要完全理解本章是有点难度:你要对简单的空间概念需要一定的理解,即使只是论述1D的线性平面空间中的2个基本方法:分配与释放,但也很复杂.要知道LI

“全栈2019”Java异常第二十章:自定义异常详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异常第二十章:自定义异常详解 下一章 "全栈2019"Java异常第二十一章:finally不被执行的情况 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学

第二十章

唯与呵,其相去几何?美与恶,其相去何若?人之所畏,亦不可以不畏人.望呵,其未央哉!众人熙熙,若飨于太牢,而春登台.我泊焉未兆,若婴儿未咳.纍(léi)呵,如无所归.众人皆有余,而我独遗.我愚人之心也,沌沌呵.俗人昭昭,我独若昏.俗人察察,我独闷闷.沕呵,其若海.望呵,其若无所止.众人皆有以,我独顽以鄙.我欲独异于人,而贵食母. 第二十章1 人为啥会喜欢八卦新闻? 各位朋友大家好,我们今天接着来聊<道德经>,看看老子带给我们什么样的启发. 看大家后面的留言,我发现好多小朋友坚持在听.我记得一两个

【WPF学习】第二十章 内容控件

原文:[WPF学习]第二十章 内容控件 内容控件(content control)是更特殊的控件类型,它们可包含并显示一块内容.从技术角度看,内容控件时可以包含单个嵌套元素的控件.与布局容器不同的是,内容控件只能包含一个子元素,而布局容器主要愿意可以包含任意多个牵头元素. 正如前面所介绍,所有WPF布局容器都继承自抽象类Panel,该类提供了对包含多个元素的支持.类似地,所有内容控件都继承自抽象类ContentControl.下图显示了ContentControl类的层次结构. 图 Conten

C#高级编程第11版 - 第二十章

导航 C# 全版本特性一览 全书目录 第二十章 Dependency Injection 20.1 依赖注入的概念 439 20.1.1 使用没有依赖注入的服务 440 20.1.2 使用依赖注入 441 20.2 使用.NET Core DI 容器 442 20.3 服务的生命周期 443 20.3.1 使用单例和临时服务 445 20.3.2 使用Scoped 服务 446 20.3.3 使用自定义工厂 448 20.4 使用选项初始化服务 449 20.5 使用配置文件 450 20.6

第二章 第二个spring-boot程序

上一节的代码是spring-boot的入门程序,也是官方文档上的一个程序.这一节会引入spring-boot官方文档推荐的方式来开发代码,并引入我们在spring开发中service层等的调用. 1.代码结构如下 2.pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi

springboot第二天--SpringBoot 基本web应用开发

1.SpringBoot json支持 1.1创建实体bean  Car Lombok使用: 1.导入依赖库 <dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId>    <version>1.18.6</version></dependency> 2.安装插件  继续: 3.在实体bean使

第二十章json

语法 支持三种类型的值:简单值        字符串.数值.布尔值.null,不支持undef 对象        是一种复杂数据类型表示无序的键值对儿,值可以为简单值,也可以是复杂类型 数组        复杂数据类型,值可为任意类型 不支持变量.函数或对像实例 简单值 即为简单数据形式.字符串必须使用双引号. 对象(复杂数据类型) 没有声明变量.没有末尾{}的分号.属性要加双引号.同一个对象中不能出现两个同名属性 数组(复杂数据类型) 没有变量和分号 json对象 stringify()把J