简介

Consul是强一致性的数据存储,使用gossip形成动态集群。它提供分级键/值存储方式,不仅可以存储数据,而且可以用于注册器件事各种任务,从发送数据改变通知到运行健康检查和自定义命令,具体如何取决于它们的输出。下面两张图是Consul的原理图

Consul是分布式的、高可用、横向扩展的。consul提供的一些关键特性:

  • service discovery:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。
  • health checking:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。
  • key/value storage:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。
  • multi-datacenter:无需复杂的配置,即可支持任意数量的区域。
  • Raft: Raft算法来实现分布式一致性

和其他服务注册对比

Feature Consul zookeeper etcd euerka
服务健康检查 服务状态,内存,硬盘等 (弱)长连接,keepalive 连接心跳 可配支持
多数据中心 支持
kv存储服务 支持 支持 支持
一致性 raft paxos raft
cap ca cp cp ap
使用接口(多语言能力) 支持http和dns 客户端 http/grpc http(sidecar)
watch支持 全量/支持long polling 支持 支持 long polling 支持 long polling/大部分增量
自身监控 metrics metrics metrics
安全 acl /https acl https支持(弱)
spring cloud集成 已支持 已支持 已支持 已支持

stackshare官方提供的使用情况对比统计
https://stackshare.io/stackups/consul-vs-zookeeper-vs-etcd

安装准备工作

其他操作系统的安装包下载地址
https://www.consul.io/downloads.html

安装consul

windows上安装
  1. 解压:
    这里写图片描述

  2. 设置环境变量:
    计算机-右键-属性-高级属性-设置环境-变量设置
    在path下加上:D:\opt\consul;

  3. cmd启动:
    如果环境变量不起 作用则直接cmd进入该目录

D:
cd D:\opt\consul
consul agent -dev

可以看到启动成功。

打开网址:http://localhost:8500 ,可以看到界面,相关服务发现的界面。

linux安装

$ mkdir -p $GOPATH/src/github.com/hashicorp && cd $!
$ git clone https://github.com/hashicorp/consul.git
$ cd consul
$ make bootstrap
$ make bootstrap

docker环境部署

setenforce 0
sed --follow-symlinks -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
yum install docker
systemctl enable docker && systemctl start docker
firewall-cmd --set-default-zone=trusted
firewall-cmd --complete-reload 

consul常用命令+常用选项

-bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0。
-client:consul绑定在哪个client地址上,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1。
-node consul节点ID,集群内唯一
-join  192.168.1.60   节点加入集群(leader 192.168.1.60)
-server agent启用server模式运行。不加入此参数则client模式运行。
-ui   启用web管理页面
-data-dir  指定agent储存状态的数据目录

启动consul

这里写图片描述

打开浏览器地址:http://localhost:8500
这里写图片描述

springcloud项目中使用consul客户端实现注册
创建项目consul-server

这里使用的是DIEA

pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>bamboo</groupId>
    <artifactId>consul-server</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>


    <dependencies>
        <!-- 引入consul-discovery 依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

</project>
application.yml
spring:
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        healthCheckPath: /health
        healthCheckInterval: 5s
        instance-id: consul-server
  application:
    name: consul-server
server:
  port: 8501

  • healthCheckPath:健康检查的REST地址
  • healthCheckInterval:检查的时间间隔

这里说明一下:healthCheckPath中的REST借口需要在代码中实现并可以get方式正常访问,否则健康检查的结果将会一直是critical状态,即不可用严重状态

java
package bamboo;


import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 使用consul作为服务注册发现中心
 *
 * 这里是一个服务启动类
 *
 * Created by xialeme on 2017/11/22.
 */

@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class ConsulServerApplication {

    @RequestMapping("/hi")
    public String home() {
        return "hello ConsulServer ";
    }
	
	//健康检查的实现REST部分
    @RequestMapping("/health")
    public String health() {
        return "hello health ";
    }

    public static void main(String[] args) {
        new SpringApplicationBuilder(ConsulServerApplication.class).web(true).run(args);
    }


}

运行ConsulServerApplication

可以在监控台看到如下信息,说明已经成功了

这里写图片描述

consul的key/value操作

consul还提供了键/值存储的功能。
可以在http://localhost:8500中点击KEY/VALUE按钮进行操作

使用API的方法如下:
如 查询 所有K/V
curl -v http://localhost:8500/v1/kv/?recurse

保存键为web/key2, flags 为42, 值为true的记录。
curl -X PUT -d ‘test’ http://localhost:8500/v1/kv/web/key2?flags=42
true

删除记录:
curl -X DELETE http://localhost:8500/v1/kv/web/sub?recurse

更新值:
curl -X PUT -d ‘newval’ http://localhost:8500/v1/kv/web/key1?cas=97
true

更新index:
curl “http://localhost:8500/v1/kv/web/key2?index=101&wait=5s

结果:[{“CreateIndex”:98,“ModifyIndex”:101,“Key”:“web/key2”,“Flags”:42,“Value”:“dGVzdA==”}]

更详细的consul命令详解:

http://m.oschina.net/blog/353392

断电恢复outage recover

当有一台服务器不可用时,处理的方法有:

  1. 对服务器进恢复,然后重新上线

  2. 用新服务器,替代旧的consul服务器
    这两种方式都需要将服务器ip与原来的ip相同。

  3. 添加新的服务器,而ip无需与原来的相同。步骤: 停掉所有的consul服务器,将损坏的服务器ip从raft/peer.json中移除,重启其他服务器,并将新的服务器加入集群。

源码地址

https://github.com/BambooZhang/spring-cloud/tree/master/chapter9

其他教程的源码请在下面的地址中查找
https://github.com/BambooZhang/spring-cloud/

参考资料

https://www.cnblogs.com/newP/p/6349316.html
sprngcloud中国提供的翻译
https://springcloud.cc/spring-cloud-consul.html

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐