本节示例代码在: 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文件)
file

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

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

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

file

到这一步,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,可以看到两个服务已经注册成功:

file

下面测试一下接口:

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

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


这里有一个问题,当使用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

恰饭广告,如觉得文章对你有所可帮博主点击一下

Last modification:December 25th, 2019 at 11:11 pm
请作者喝杯肥宅快乐水吧!