转载

SpringCloud系列教程03-服务注册之Consul

本节示例代码在: https://github.com/laolunsi/spring-boot-stack

一、概述

在第一节 SpringCloud服务注册与发现之Eureka 中,讲述了基于Eureka的服务中心的构建,为什么还需要Consul呢?

当然是因为它更好用、更好看了!

Consul官网: https://www.consul.io/

Spring官网关于consul的描述: https://spring.io/projects/spring-cloud-consul

Spring Cloud Consul provides Consul integrations for Spring Boot apps through autoconfiguration and binding to the Spring Environment and other Spring programming model idioms....The patterns provided include Service Discovery, Distributed Configuration and Control Bus.

Consul提供了一个快速开发SpringCloud的集成环境,支持服务注册、Ribbon与负载均衡、Zuul、分布式配置、控制总线。

这一篇文章将详细描述使用consul作为服务注册中心、使用Feign来做服务调用的案例。

要使用consul作为服务注册中心,首先需要下载它。

二、安装和配置consul

从官网下载consul: https://www.consul.io/

支持macOs/FreeBSD/Linux/Solaris/Windows,下载压缩包并解压后,会得到一个可执行文件(在win系统下是consul.exe文件)

SpringCloud系列教程03-服务注册之Consul

选择对应版本,下载,解压,然后将它的地址添加到系统环境变量中(这一步自行百度即可)

然后使用命令 consul agent -dev 运行开发环境:

SpringCloud系列教程03-服务注册之Consul

打开浏览器,输入consul默认的可视化地址 localhost:8500 :

SpringCloud系列教程03-服务注册之Consul

到这一步,consul已经启动成功了。

下一步,我们更改在上一篇文章 服务调用之Feign 中的项目,将eureka的依赖和配置改成consul的即可。其他信息在此就不予赘述了。

三、创建服务提供者

这里我们修改一下上一篇文章 服务调用之Feign 中的项目。

引入 consul-discovery 依赖,代替 eureka-server

<properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>

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

        <!-- 服务治理 consul -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>

        <!-- 健康检查 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <!-- 省略... -->
    </dependencyManagement>

修改application.yml配置文件:

server:
  port: 8505

spring:
  application:
    name: service-producer
  cloud:
    consul:
      host: localhost
      port: 8500 # consul默认端口
      discovery:
        register: true
        instance-id: ${spring.application.name}:${server.port}
        service-name: ${spring.application.name}
        port: ${server.port}

然后在启动类上,只能使用 @EnableDiscoveryClient 注解来启用服务发现。

四、创建服务调用者

与服务提供者相同,引入consul配置即可。具体可以到git上看项目代码示例。

五、测试

分别启动consul,service-producer, service-consumer,可以看到两个服务已经注册成功:

SpringCloud系列教程03-服务注册之Consul

下面测试一下接口:

首先单独测试一下服务 service-producer :

SpringCloud系列教程03-服务注册之Consul

然后测试一下 service-consumer 去调用 service-producer :

SpringCloud系列教程03-服务注册之Consul

这里有一个问题,当使用Consul来进行服务治理时,如果SpringBoot和SpringCloud版本不匹配,可能会出现服务注册没有执行的情况,但是控制台不会有错误信息。

比如SpringBoot采用2.1.7.RELEASE版本,而SpringCloud采用Finchley.RELEASE版本,就会出现这个问题。

必须看到Spring项目控制台出现以下信息,才说明服务注册被启动了:

2019-08-28 15:33:52.881  INFO 11392 --- [           main] o.s.c.c.s.ConsulServiceRegistry          : Registering service with consul: NewService{id='service-consumer-8506', name='service-consumer', tags=[secure=false], address='DESKTOP-V748F38', port=8506, enableTagOverride=null, check=Check{script='null', interval='10s', ttl='null', http='http://DESKTOP-V748F38:8506/actuator/health', tcp='null', timeout='null', deregisterCriticalServiceAfter='null', tlsSkipVerify=null, status='null'}, checks=null}

六、总结

从上面的示例可以看出,consul比eureka更加方便,功能更加复杂。而eureka的使用必须要创建一个eureka服务,并且需要手动进行配置。

参考资料

  1. SpringCloud构建微服务架构-服务注册与发现(Eureka、Consul)【Dalston版】: http://blog.didispace.com/spring-cloud-starter-dalston-1/
  2. 纯洁的微笑-SpringCloud专栏13-注册中心 Consul使用详解: http://www.ityouknow.com/springcloud/2018/07/20/spring-cloud-consul.html
原文  http://www.eknown.cn/index.php/springcloud/consul.html
正文到此结束
Loading...