Consul 使用手册 - 服务注册与发现

Consul 简化了分布式环境中的服务的注册和发现流程,通过 HTTP 或者 DNS 接口发现。支持外部 SaaS 提供者等。

安装单机版Consul

下载Consul

Consul需要的端口

Use Default Ports
DNS: The DNS server (TCP and UDP) 8600
HTTP: The HTTP API (TCP Only) 8500
HTTPS: The HTTPs API disabled (8501)*
gRPC: The gRPC API disabled (8502)*
LAN Serf: The Serf LAN port (TCP and UDP) 8301
Wan Serf: The Serf WAN port TCP and UDP) 8302
server: Server RPC address (TCP Only) 8300
Sidecar Proxy Min: Inclusive min port number to use for automatically assigned sidecar service registrations. 21000
Sidecar Proxy Max: Inclusive max port number to use for automatically assigned sidecar service registrations. 21255

检查端口是否被占用的方法

Windows

netstat -ano| findstr "8500"

Linux

netstat -antp |grep 8500

macOS

netstat -ant | grep 8500lsof -i:8500

安装 & 启动

解压文件到你指定的文件夹

在控制台中cd到刚才解压到的文件夹

输入启动指令

./consul agent -server -bootstrap -ui -client 0.0.0.0 -data-dir /mnt/c/Users/winmj/Program/consul_1.8.4_linux_amd64/data

PS: pwd 查看当前路径
PS:ip addr 查看当前ip

再开一个控制台看启动成功了没有

./consul -v

访问Consul首页

localhost:8500

现在只有一个服务注册在Consul上,就是它自己。

启动参数

-ui: 开启ui页面
-client: 让consul server拥有client的功能,允许接受服务注册;0.0.0.0表示允许使用任意IP连接Consul,如果不指定,那么只能用loalhost去连接。
-dev: 表示以开发模式运行Consul

为项目添加 Spring Cloud Consul 依赖

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-consul-discovery</artifactId>
  <version>2.2.4.RELEASE</version>
</dependency>

编写配置文件。

spring:
  application:
    name: micro-class
  cloud:
    consul:
      host: localhost
      port: 8500

然而Consul却显示红叉叉,这是怎么回事?

健康检查

Spring Boot Actuator

Spring Boot 官方出品的一个监控组件,开箱即用。

Spring Boot Actuator 常用端点

端点 描述 HTTP方法
conditions 显示自动配置的信息 GET
beans 显示应用程序上下文所有的 Spring Bean GET
configprops 显示所有的 @ConfigurationProperties 的配置属性列表 GET
dump 显示线程活动的快照 GET
env 显示环境变量,包含系统环境变量以及应用环境变量 GET
health 显示应用程序的健康指标,值由 HealthIndicator 的实现类提供;结果有 UP、DOWN、OUT_OF_SERVICE、UNKNOWN;如需查看详情,需配置:management.endpoint.health.show-details GET
healthdump 堆dump GET
info 显示应用的信息,可使用 info.* 属性自定义info端点公开的数据 GET
loggers GET:显示日志级别,POST:动态修改日志级别 GET/POST
mappings 显示所有的URL路径 GET
metrics 显示应用的度量标准信息 GET

整合 Spring Boot Actuator

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

http://localhost:8081/actuator

访问 http://localhost:8081/actuator/health ,可以看到

{
"status": "UP"
}

Consul就是通过这个端点来进行健康检查。

启动项目

这时候我们发现,健康检查都通过了。

查看更多的端点

‘*’ 的意思就是开启所有端点

management:
  endpoints:
    web:
      exposure:
        include: '*'

查看更详细的健康信息

management:
  endpoint:
    health:
      show-details: always

将 Spring Boot Actuator 与 Consul 整合

spring:
  cloud:
    consul:
      discovery:
        health-check-path: /actuator/health

其实不配置,默认的值也是这个。

Consul 健康检查配置

编写代码

在 micro-class 中编写代码实时获取 micro-user 中的所有实例。

package cn.sbx0.micro.classes.controller;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

  @Autowired
  private DiscoveryClient discoveryClient;

  @GetMapping("/test")
  public List<ServiceInstance> test() {
    return discoveryClient.getInstances("micro-user");
  }
}

服务发现

元数据

spring: 
  cloud:
    consul:
      discovery:
        tags: engineRoom=local

使用元数据可以给微服务贴标签,比如给同一个机房的几个微服务贴上相同的标签,在调用的时候优先调用本机房的微服务。

多网卡环境的IP选择

spring: 
  cloud:
    consul:
      discovery:
        prefer-ip-address: true

如何指定注册到Consul上的IP地址

【推荐】方式一、忽略指定名称的网卡【通用】

spring:
  cloud:
    inetutils:
      ignored-interfaces:
        - docker0
        - veth.*
    consul:
      discovery:
        prefer-ip-address: true

【推荐】方式二、指定想要的网段【通用】

spring:
  cloud:
    inetutils:
      preferred-networks:
        - 192.168
        - 10.0
    consul:
      discovery:
        prefer-ip-address: true

【不推荐】方式三、只使用站点本地地址【通用】

spring:
  cloud:
    inetutils:
      use-only-site-local-interfaces: true
    consul:
      discovery:
        prefer-ip-address: true

【不推荐】方式四、手动指定IP【Consul专用】

spring:
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        prefer-ip-address: true
        ip-address: 127.0.0.1

其他

./consul agent -dev -ui -client 0.0.0.0

参考文献

BAT架构师带你从零打造微服务项目