consul Ops
consul client
通过下面的命令可以创建consul client
nohup consul agent -data-dir /tmp/consul -node=liaokailin -bind=192.168.21.48 -join=120.76.145.187 &
node
指定client节点名称bind
client绑定的ipjoin
指定加入到的consul server
ip地址
启动后访问 http://120.76.145.187:8500/ui 得到:
通过执行
consul members --rpc-addr=120.76.145.187:8400
得到
Node Address Status Type Build Protocol DC
iZ94235juoyZ 120.76.145.187:8301 alive server 0.6.4 2 dc1
liaokailin 192.168.21.48:8301 alive client 0.5.2 2 dc1
``
可以看出一个为`server` 一个为`client`
##service register
在consul中实现服务发现的前提是进行服务注册
###命令实现
执行如下命令构建一个服务
mkdir /etc/consul.d
vim /etc/consul.d/first-service.json
输入以下内容
{“service”: {“name”: “first-service”, “tags”: [“dev”], “port”: 8081}}
以上信息定义一个名称为`first-service`,tag为`dev`的`service`,一个服务可以有多个tag用以区别在不同的环境,因此在进行服务发现时要精准发现
一个服务需要`tag`和`name`两个条件
配置完成后指定如下脚本
consul agent -data-dir /tmp/consul -node=liaokailin -bind=192.168.21.48 -join=120.76.145.187 -config-dir /etc/consul.d
“
访问http://120.76.145.187:8500/v1/catalog/services获取所有的服务,得到结果:
{
consul: [ ],
first-service: [
"dev"
]
}
通过dns
dig @120.76.145.187 -p 8600 first-service.service.consul SRV
得到
penAccoutIntrs
; <<>> DiG 9.8.3-P1 <<>> @120.76.145.187 -p 8600 first-service.service.consul SRV
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26100
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;first-service.service.consul. IN SRV
;; ANSWER SECTION:
first-service.service.consul. 0 IN SRV 1 1 8081 liaokailin.node.dc1.consul.
;; ADDITIONAL SECTION:
liaokailin.node.dc1.consul. 0 IN A 192.168.21.48
;; Query time: 44 msec
;; SERVER: 120.76.145.187#8600(120.76.145.187)
;; WHEN: Thu Jun 2 15:52:29 2016
;; MSG SIZE rcvd: 162
java实现
pom.xml
<dependencies>
<dependency>
<groupId>com.orbitz.consul</groupId>
<artifactId>consul-client</artifactId>
<version>0.12.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
<repositories>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>bintray</name>
<url>http://jcenter.bintray.com</url>
</repository>
</repositories>
创建一个单元测试
package com.lkl.consul;
import com.google.common.net.HostAndPort;
import com.orbitz.consul.AgentClient;
import com.orbitz.consul.Consul;
import org.junit.Test;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
/**
* 服务注册
* Created by liaokailin on 16/6/2.
*/
public class ServiceRegister {
@Test
public void registerServiceForConsul() throws Exception {
Consul consul = Consul.builder().withHostAndPort(HostAndPort.fromParts("127.0.0.1", 8500)).build();
AgentClient agentClient = consul.agentClient();
String serviceId = UUID.randomUUID().toString();
String serviceName = "java-consul-service";
String serviceTag = "test";
long ttl = 3l;
agentClient.register(9090, ttl, serviceName, serviceId, serviceTag);
agentClient.pass(serviceId);
System.out.println("succ.");
TimeUnit.MINUTES.sleep(2);
}
}
首先通过builder
构建consul
对象,通过agent
注册一个服务.
通过web-ui
可以发现服务成功注册.
健康检查
命令实现
vim /etc/consul.d/first-service.json
结果:
cat first-service.json | json_pp
{
"service" : {
"check" : {
"script" : "curl localhost:8080 >/dev/null 2>&1",
"interval" : "3s"
},
"name" : "first-service",
"tags" : [
"dev"
],
"port" : 8081
}
}
增加了check,表示间隔3秒访问一次localhost:8080,如果成功表示service
为passing
否则为critical
由于localhost:8080
不能访问,所以通过web-ui
发现状态为critical
,如果本地启动一个tomcat监听8080
端口,则服务状态为passing
java实现
package com.lkl.consul;
import com.google.common.net.HostAndPort;
import com.orbitz.consul.AgentClient;
import com.orbitz.consul.Consul;
import com.orbitz.consul.HealthClient;
import org.junit.Test;
import java.net.URI;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
/**
* 健康检查
* Created by liaokailin on 16/6/2.
*/
public class HealthCheck {
@Test
public void doHealthCheck() throws Exception {
Consul consul = Consul.builder().withHostAndPort(HostAndPort.fromParts("127.0.0.1", 8500)).build();
AgentClient agentClient = consul.agentClient();
String serviceName = "health-check-service";
String serviceTag = "test";
agentClient.register(9090, HostAndPort.fromParts("127.0.0.1", 8080), 3l, serviceName, "service-id", serviceTag);
TimeUnit.MINUTES.sleep(2);
}
}
这种方式为client agent
间隔3秒会自动ping http://localhost:8080来进行将康检查,还可以通过agentClient.pass()
让service
主动
向agent
报告健康
key-value
命令方式
输入key
curl -X PUT -d 'test' http://localhost:8500/v1/kv/web/key1
查询所有值
curl http://localhost:8500/v1/kv/?recurse
查询指定key对应值
curl http://localhost:8500/v1/kv/web/key1
java方式
package com.lkl.consul;
import com.google.common.base.Optional;
import com.google.common.net.HostAndPort;
import com.orbitz.consul.Consul;
import com.orbitz.consul.KeyValueClient;
import com.orbitz.consul.model.kv.Value;
import org.apache.commons.codec.binary.Base64;
import org.junit.Test;
import sun.misc.BASE64Decoder;
import java.util.List;
import java.util.Set;
/**
* key-value操作
* Created by liaokailin on 16/6/3.
*/
public class KeyValues {
/**
* 新增一个key
*/
@Test
public void pubKey() {
Consul consul = Consul.builder().withHostAndPort(HostAndPort.fromParts("127.0.0.1", 8500)).build();
KeyValueClient keyValueClient = consul.keyValueClient();
keyValueClient.putValue("/web/key3","test");
}
/**
* 按key获取值
*/
@Test
public void getValueByKey(){
Consul consul = Consul.builder().withHostAndPort(HostAndPort.fromParts("127.0.0.1", 8500)).build();
KeyValueClient keyValueClient = consul.keyValueClient();
Optional<String> result = keyValueClient.getValueAsString("/web/key3");
System.out.println(result.get());
}
/**
* 获取values
*/
@Test
public void getValues(){
Consul consul = Consul.builder().withHostAndPort(HostAndPort.fromParts("127.0.0.1", 8500)).build();
KeyValueClient keyValueClient = consul.keyValueClient();
List<Value> values = keyValueClient.getValues("/web");
for(Value value : values){
System.out.println(value.getKey()+","+ new String(Base64.decodeBase64(value.getValue().get())) );
}
}
}
consul架构
相关术语
Agent
长期运行在后台的守护进程,通过consul agent
运行,不论是客户端还是服务端都是一个agentClient
转发所有的RPC到服务端的agent,client
是相对无状态的,主要与service以及通过局域网的gossip pool
与server通信,对资源消耗少Server
负责参数Raft
选举、维护集群状态、响应RPC、通过广域网gossip pool
与其他数据中心通信Datacenter
数据中心,可以理解为一个私有的、低延迟的网络环境Consensus
一致性,集群状态下多个服务器在状态上达成一致,为了以容错方式达成一致,一般有超过半数一致则可以认为整体一致
consul使用Raft
实现一致性,进行leader选举,在consul中的使用bootstrap
时,可以进行自选,其他server加入进来后bootstrap
就可以取消Gossip
consul通过Serf
提供基于Gossip协议通信,Serf是去中心化的服务发现和编制的解决方案,节点失败侦测与发现,具有容错、轻量、高可用的特点。LAN Gossip
同一网络或者数据中心节点通信协议WAN Gossip
不同网络或不同数据中心中server通信协议
图表说明
利用官网给出的图片
通过以上图片可以发现:
1.同一数据中心Client
与Server
通过LAN Gossip
通信,service
与server
不会直接通信,其通信流程为service
–>client
–>server
2.server
通过Raft
算法进行选举
3.不同数据中心通过WAN Gossip
通信
ok ~ it’s work ! more about is here
转载请注明
http://blog.csdn.net/liaokailin/article/details/51612247
欢迎关注,您的肯定是对我最大的支持