Consul介绍

Consul介绍

简介

Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。Consul是分布式的、高可用的、 可横向扩展的。它具备以下特性:

  • 服务发现: Consul提供了通过DNS或者HTTP接口的方式来注册服务和发现服务。一些外部的服务通过Consul很容易的找到它所依赖的服务。
  • 健康检测: Consul的Client提供了健康检查的机制,可以通过用来避免流量被转发到有故障的服务上。
  • Key/Value存储: 应用程序可以根据自己的需要使用Consul提供的Key/Value存储。 Consul提供了简单易用的HTTP接口,结合其他工具可以实现动态配置、功能标记、领袖选举等等功能。
  • 多数据中心: Consul支持开箱即用的多数据中心. 这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域。

Consul的架构

Consul架构

  • Consul Cluster由部署和运行了Consul Agent的节点组成。在Cluster中有两种角色:Server和 Client。
  • Server和Client的角色和Consul Cluster上运行的应用服务无关, 是基于Consul层面的一种角色划分.
  • Consul Server: 用于维护Consul Cluster的状态信息。 官方建议是: 至少要运行3个或者3个以上的Consul Server。 多个server之中需要选举一个leader, 这个选举过程Consul基于Raft协议实现. 多个Server节点上的Consul数据信息保持强一致性。在局域网内与本地客户端通讯,通过广域网与其他数据中心通讯。
  • Consul Client: 只维护自身的状态, 并将HTTP和DNS接口请求转发给服务端。

Consul示例

我们用一个简单的项目,看看Consul能做什么。

首先先新建一个maven项目,其pom依赖为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>

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

<dependencies>
<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>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-all</artifactId>
</dependency>
</dependencies>

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

然后删除src目录,新建三个子模块,分别为consul-provider、consul-consumer和consul-config。

  • consul-provider:主要提供基础REST服务,开放一个/sayHello接口,供consul-consume使用,另外提供一个/actuator/health接口,供consul调用,做健康检查使用
  • consul-consume:主要提供一个对外的REST接口,/hello。该接口内部调用了consul-provider的/sayHello接口。另外,也提供了一个/actuator/health接口,供consul调用,做健康检查使用
  • consul-config:演示consul的k/v相关功能

consul-provider

可直接使用父项目的pom依赖,不需要额外添加依赖。

启动类为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@RestController
@SpringBootApplication
public class ConsulProviderApplication {

public static void main(String[] args) {
SpringApplication.run(ConsulProviderApplication.class, args);
}

// 新版Spring Cloud Consul默认注册健康检查接口为/actuator/health
@RequestMapping("/actuator/health")
public String health() {
return "SUCCESS";
}

@GetMapping("/sayHello")
public String sayHello(String name) {
return "Hello, " + name;
}

}

配置文件为:

1
2
3
4
5
6
7
8
9
server:
port: 8081
spring:
application:
name: consul-provider
cloud:
consul:
host: 127.0.0.1
port: 8500

consul-consume

pom依赖为:

1
2
3
4
5
6
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>

启动类为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@RestController
@SpringBootApplication
@EnableFeignClients
public class ConsulConsumerApplication {

@Autowired
private HelloService helloService;

@GetMapping("/actuator/health")
public String health() {
return "SUCCESS";
}

@GetMapping("/hello")
public String helloName(String name) {
return helloService.sayHello(name);
}

public static void main(String[] args) {
SpringApplication.run(ConsulConsumerApplication.class, args);
}
}

启动类内部使用了HelloService的方法,而HelloService是一个Feign的client,它会向consul请求获取被调用服务的地址,而后向被调用的服务发起调用,得到结果。

HelloService

1
2
3
4
5
6
@FeignClient("consul-provider")
public interface HelloService {
@RequestMapping(value = "/sayHello", method = RequestMethod.GET)
String sayHello(@RequestParam("name") String name);
}

启动

按照如下顺序启动

  1. consul:如果是在windows下,可以使用命令:consul agent -dev -ui 启动带界面的consul
  2. consul-provider
  3. consul-consume

启动完成之后,在浏览器中输入如下地址:http://localhost:8500,就能看到已经注册的两个服务的状态。

接着在,浏览器中输入http://localhost:8082/hello?name=huhansan,就能看到如下结果:

k/v功能概览

consul-cofig的依赖和父项目的一致,不需要再新增。

启动类为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@SpringBootApplication
@RestController
@RefreshScope
public class ConsulConfigApplication {

public static void main(String[] args) {
SpringApplication.run(ConsulConfigApplication.class, args);
}

@Value("${foo.bar.name}")
private String name;

@GetMapping("/getName")
public String getName() {
return name;
}

}

使用@Value注解,限定name的值。该值从consul获取,如果consul中没有新建该值的话,consul-config就会启动失败。

配置文件为:

1
2
3
4
5
6
7
8
9
server:
port: 8083 # 因为本地启动,防止端口冲突
spring:
application:
name: consul-config
cloud:
consul:
host: 127.0.0.1 # consul 启动地址
port: 8500 # consul 启动端口

在consul的ui上,按照如下的步骤,新建一个键值对

然后,启动consu-config,在浏览器中访问:http://localhost:8083/getName

参考资料

Consul 入门

重新定义Spring Cloud实战

0%