文章目录

  • 简介
  • 和其他服务注册对比
  • 安装准备工作
  • 安装consul
  • windows上安装
  • linux安装
  • docker环境部署
  • **consul常用命令+常用选项**
  • 启动consul
  • springcloud项目中使用consul客户端实现注册
  • 创建项目consul-server
  • application.yml
  • java
  • consul的key/value操作
  • 断电恢复outage recover
  • 源码地址
  • 参考资料


简介

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. Filter注册 spring spring注册服务_consul

  3. 设置环境变量:
    计算机-右键-属性-高级属性-设置环境-变量设置
    在path下加上:D:\opt\consul;
  4. 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

Filter注册 spring spring注册服务_consul_02

打开浏览器地址:http://localhost:8500

Filter注册 spring spring注册服务_ci_03

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

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

Filter注册 spring spring注册服务_Filter注册 spring_04

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命令详解:


断电恢复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/

参考资料

sprngcloud中国提供的翻译
https://springcloud.cc/spring-cloud-consul.html