Featured image of post Spring Cloud微服务注册中心Consul入门使用(上)

Spring Cloud微服务注册中心Consul入门使用(上)

一、Consul安装使用

1.1 what’s the consul?

Consul是Go语言编写的一个分布式高可用的服务网格解决方案,提供包括服务发现、配置和分段功能在内的全功能控制平面。它的每个功能都可以单独使用,也可以用它来构建完整的服务网格。

为什么要用它呢?因为Eureka很早之前已经宣布不再维护了,但是还有很多替代Eureka的注册中心,例如Nacos、Zookeeper以及接下来要介绍的Consul。

Consul使用Go语言编写,通过HTTP的方式向外提供服务;支持多数据中心;一致性协议使用的是Raft。这些年来Consul一直在活跃更新中,社区活跃度上很可靠。

1.2 Consul的功能

服务发现:

调用的客户端可以通过DNS或HTTP找到要调用的服务

健康检查:

Consul提供了健康检查机制,从简单的服务端是否可以返回200的响应码到较为复杂的内存使用率是否低于90%

使用Key/value进行存储信息:

接入Consul的应用可以根据需要使用Key/Value进行存储信息。提供了易用的HTTP接口来满足用户的动态配置、特征标记、协调和leader选举等功能

多数据中心:

Consul原生就支持多数据中心。这样用户就不用自己来实现多数据中心

1.3 Consul和Consul UI的安装使用

Consul的安装很简单,因为是用Go语言写的,最后是编译完成是一个可执行的文件。支持Window、macOS、Linux等平台。在官网上选择下载的版本即可:https://developer.hashicorp.com/consul/downloads

下载完成后,解压缩,然后执行,例如下面以开发者模式启动。正常启动Consul集群需要至少启动三个Consul

consul agent -dev

$ ./consul agent -dev ==> Starting Consul agent… Version: ‘1.15.2’ Build Date: ‘2023-03-30 17:51:19 +0000 UTC’ Node ID: ‘cd2c39c3-341c-6478-5daf-ab06807d30a8’ Node name: ‘DESKTOP-ILEN9BL’ Datacenter: ‘dc1’ (Segment: ‘’) Server: true (Bootstrap: false) Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: 8502, gRPC-TLS: 8503, DNS: 8600) Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302) Gossip Encryption: false Auto-Encrypt-TLS: false HTTPS TLS: Verify Incoming: false, Verify Outgoing: false, Min Version: TLSv1_2 gRPC TLS: Verify Incoming: false, Min Version: TLSv1_2 Internal RPC TLS: Verify Incoming: false, Verify Outgoing: false (Verify Hostname: false), Min Version: TLSv1_2

==> Log data will now stream in as it occurs:

2023-04-16T20:57:55.312+0800 [DEBUG] agent.grpc.balancer: switching server: target=consul://dc1.cd2c39c3-341c-6478-5daf-ab06807d30a8/server.dc1 from= to= 2023-04-16T20:57:55.370+0800 [INFO] agent.server.raft: initial configuration: index=1 servers="[{Suffrage:Voter ID:cd2c39c3-341c-6478-5daf-ab06807d30a8 Address:127.0.0.1:8300}]" 2023-04-16T20:57:55.370+0800 [INFO] agent.server.raft: entering follower state: follower=“Node at 127.0.0.1:8300 [Follower]” leader-address= leader-id= 2023-04-16T20:57:55.371+0800 [INFO] agent.server.serf.wan: serf: EventMemberJoin: DESKTOP-ILEN9BL.dc1 127.0.0.1 2023-04-16T20:57:55.371+0800 [INFO] agent.server.serf.lan: serf: EventMemberJoin: DESKTOP-ILEN9BL 127.0.0.1 2023-04-16T20:57:55.371+0800 [INFO] agent.router: Initializing LAN area manager 2023-04-16T20:57:55.371+0800 [DEBUG] agent.grpc.balancer: switching server: target=consul://dc1.cd2c39c3-341c-6478-5daf-ab06807d30a8/server.dc1 from= to=dc1-127.0.0.1:8300

…..

然后浏览器可以访问:http://localhost:8500/ui/dc1/services。进入Consul的web界面

二、Spring Cloud Consul入门使用

2.1 what’s the Spring Cloud Consul?

Spring Cloud是Spring Cloud社区通过Spring Boot自动配置,实现的一套连接Consul使用的服务发现客户端功能。只需要简单的注解便可接入Consul,构建分布式系统。

2.2 Consul在Spring Cloud生态的作用

  • 服务发现与注册,Spring Boot应用可以像Consul注册服务,通过Spring Cloud的服务发现标准DiscoveryClient(spring-cloud-common模块)来发现其他的服务。
  • 支持Ribbon,实现客户端负载均衡
  • 分布式配置中心,通过key/Value存储配置
  • 控制总线,通过Consul events实现总线

2.3 Spring Cloud Consul入门

2.3.1 创建服务提供者(cloud-registry-consul-provider)

引入依赖:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-consul-all</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <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
@RestController
@RequestMapping("provider")
public class ProviderController {

    @Value("${server.port}")
    private String port;
    @Value("${spring.application.name}")
    private String appName;

    @GetMapping("info")
    public String info() {
        return "provider name: " + appName + ", port: " + port;
    }
}

启动类:

1
2
3
4
5
6
7
@SpringBootApplication
@EnableDiscoveryClient
public class ConsulConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsulConsumerApplication.class, args);
    }
}

配置文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
server:
  port: 8666
spring:
  application:
    name: cloud-registry-consul-provider
  cloud:
    consul:
      host: 127.0.0.1
      port: 8500
      config:
        enabled: false
      discovery:
        heartbeat:
          enabled: true

2.3.2 创建消费者(cloud-registry-consul-consumer)

引入依赖:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-consul-all</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>

创建feign客户端接口:

1
2
3
4
5
6
@FeignClient("cloud-registry-consul-provider")
public interface ConsulProviderFeignClient {

    @GetMapping(value = "provider/info")
    String getProviderInfo();
}

编写接口:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
@RestController
@RequestMapping("consumer")
public class ConsumerController {
    
    @Autowired
    private ConsulProviderFeignClient providerFeignClient;

    @GetMapping("getProviderInfo")
    public String getInfo() {
        return providerFeignClient.getProviderInfo();
    }
}

启动类:

1
2
3
4
5
6
7
8
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsulConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsulConsumerApplication.class, args);
    }
}

配置文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
server:
  port: 8080
spring:
  application:
    name: cloud-registry-consul-consumer
  cloud:
    consul:
      host: 127.0.0.1
      port: 8500
      config:
        enabled: false
      discovery:
        heartbeat:
          enabled: true

2.3.3 启动测试

1、启动consul

2、启动服务提供者:cloud-registry-consul-provider

3、启动消费者:cloud-registry-consul-consumer

4、启动完成后,可以看到服务成功注册到Consul

5、可在浏览器调用

http://localhost:8080/consumer/getProviderInfo

可看到响应:

provider name: cloud-registry-consul-provider, port: 8666