文档章节

[Spring Cloud] 8 Spring Cloud Consul

秋雨霏霏
 秋雨霏霏
发布于 2017/02/15 14:45
字数 2497
阅读 555
收藏 2

Spring Cloud Consul

服务发现

这个项目主要是为了通过Spring Boot自动配置的机制整合Consul,并能够绑定到Spring Environment,以及其他Spring组件中。 通过一些简单的注解就可以在应用中快速的启用以及配置一个通用型Consul组件,并基于此来构建大型分布式系统。 这样就可以提供:服务发现,控制总线以及配置中心等功能。 智能路由(Zuul),客户端负载均衡(Ribbon)以及断路器(Hystrix)这些还是由Spring Cloud Netflix提供。

8.1 Install Consul 安装Consul

如何安装Consul,可以参见其官方文档

8.2 Consul Agent 代理

Consul代理客户端一定要可以兼容所有的Spring Cloud Consul应用。 默认情况下,代理客户端会暴露在localhost:8500。 如何开启客户端以及如何连接到集群服务器可以参见相关文档 在安装完成后,就可以开始开发了,可以通过下列命令启动Consul代理:

./src/main/bash/local_run_consul.sh

这样就可以在8500端口开启一个代理服务器,可以通过http://localhost:8500访问。

8.3 Service Discovery with Consul 服务发现

服务发现是微服务架构的关键概念。手动为每一个客户端配置一些链接是非常非常的繁琐的。 Consul通过HTTP APIDNS 来提供的服务发现功能。

Spring Cloud Consul利用HTTP API来进行服务注册和发现。但这并不妨碍非Spring Cloud应用从DNS来进行注册和发现。

Consul代理服务都是以集群方式运行的,内部通过gossip协议Raft consensus协议进行通讯。

8.3.1 How to activate

要开始使用Consul服务发现,先得加入相应的依赖:group:org.springframework.cloud artifact id : spring-cloud-starter-consul-discovery

8.3.2 Registering with Consul

当一个客户端注册到Consul,它会带上一些关于自身情况的元数据,如:主机地址、端口、id、名字以及一些额外标签。默认情况下Consul会每隔10秒,通过一个HTTP接口/health检测节点的健康情况。 如果健康检测失败,那服务实例就会被标记成critical。

Consul客户端示例:

@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class Application {

    @RequestMapping("/")
    public String home() {
        return "Hello world";
    }

    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }

}

这就是个非常普通的Spring Boot应用,没啥好说的。

如果默认的8500端口被占用,可以手工配置。例如:

application.yml

spring:
  cloud:
    consul:
      host: localhost
      port: 8500

警告: 如果使用了Spring Cloud Consul Config,那上面的值需要配置到bootstrap.yml而不是application.yml

默认服务名、实例ID以及端口,都来自Environment中的${spring.application.name}、Srping Context ID 以及 ${server.port}

@EnableDiscoveryClient会让应用同时作为Consul的服务端和客户端,也即是:同时会注册自己也会在Consul查询别的服务。

8.3.3 HTTP Health Check

Consul实例会默认开启/health接口,对外提供健康检查。可以修改这个路径,无论是使用Actuator接口还是管理接口甚至使用非默认Context Path都行。 检查的间隔时间也可以配置。例如:

application.yml

spring:
  cloud:
    consul:
      discovery:
        healthCheckPath: ${management.contextPath}/health
        healthCheckInterval: 15s

Metadata and Consul tags

Consul 还不支持服务端元数据。Spring Cloud的ServiceInstance有一个Map<String, String> metadata属性。Spring Cloud Consul可以使用Consul标签来模拟元数据。标签是以key=value的形式,另取一个值作为key存放于Map结构中。标签不能使用=进行相等性判断,而是需要同时比较key和value。

application.yml

spring:
  cloud:
    consul:
      discovery:
        tags: foo=bar, baz

如上面的配置,map中将会存放:foo→barbaz→baz两个标签。

Making the Consul Instance ID Unique

默认情况下,Consul实例注册时会使用一个与Spring Application Context ID相同的ID。而默认的Spring Application Context ID是${spring.application.name}:comma,separated,profiles:${server.port}。所以,在大多数情况下,允许同一个服务的多个实例运行在同一个机器上。如果需要保证独立运行,可以使用Spring Cloud的spring.cloud.consul.discovery.instanceId这个配置项,来替代默认值。例如:

application.yml

spring:
  cloud:
    consul:
      discovery:
        instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}

通过这个元数据,本地的多个服务实例,会使用一个随机值来作为实例的唯一ID。在 Cloudfoundry环境中vcap.application.instance_id将会自动配置到Spring Boot应用中,因此,随机值也就不需要了。

8.3.4 Using the DiscoveryClient

Spring Cloud已经支持Feign,也支持Spring的RestTemplate通过一个逻辑服务名来替代物理URL。

可以使用org.springframework.cloud.client.discovery.DiscoveryClient来提供一个简单的API来为非Netflix应用提供服务发现接口。例如:

@Autowired
private DiscoveryClient discoveryClient;

public String serviceUrl() {
    List<ServiceInstance> list = discoveryClient.getInstances("STORES");
    if (list != null && list.size() > 0 ) {
        return list.get(0).getUri();
    }
    return null;
}

8.4 Distributed Configuration with Consul

Consul提供了键值对的方式来存放配置信息和其他元数据。 Spring Cloud Consul Config是一个用于替代Spring Cloud服务端和客户端配置的方案。 配置信息会在某个的"bootstrap"阶段,被加载到Spring Environment中。 配置信息默认存放在/config目录下。 基于应用名字以及Spring Cloud Config的配置文件方式来创建多个PropertySource实例。 例如,一个应用名为:“testApp”,有一个“dev”的环境配置,那就会创建下列配置源:

  • config/testApp,dev/
  • config/testApp/
  • config/application,dev/
  • config/application/

越具体的配置源,越靠上,泛化适配的则靠下。

config/application目录会被所有使用consul配置信息的应用所使用。 config/testApp目录仅会被服务为“testApp”的实例使用。

配置信息是可以在应用启动的时候读取到的。 发送一个HTTP POST请求到/refresh会自动重新加载配置信息。 目前版本还不支持对键值对进行监听(Consul支持),以后版本会加上这个特性。

8.4.1 How to activate

要想使用Consul配置信息,需要加上相应的starter:group :org.springframework.cloud artifact id :spring-cloud-starter-consul-config

这样Spring Cloud Consul Config就会自动配置。

8.4.2 Customizing

Consul Config可以按下列方式进行定制化配置:

bootstrap.yml

spring:
  cloud:
    consul:
      config:
        enabled: true
        prefix: configuration
        defaultContext: apps
        profileSeparator: '::'
  • enabled 设置为“false”,则可以禁用Consul Config
  • prefix 设置配置信息的root目录
  • defaultContext 设置所有应用的配置信息目录
  • profileSeparator 设置一个分隔符,用于配置源中的配置文件分隔

8.4.3 Config Watch

Consul Config Watch功能可以对某个key的配置信息进行监听。 当前应用的某个配置信息改动后,一个Refresh事件会被发布,并且Config Watch会触发阻塞式的HTTP接口调用来。 这等价于手动调用/refresh接口。

Config Watch延迟可以通过spring.cloud.consul.config.watch.delay进行修改。默认为1000,单位:毫秒。

可以设置spring.cloud.consul.config.watch.enabled=false禁用Config Watch。

8.4.4 YAML or Properties with Config

可以方便的使用YAML或者Properties格式来存放数据。 用spring.cloud.consul.config.format来指定YAML或者PROPERTIES。例如,使用YAML:

bootstrap.yml

spring:
  cloud:
    consul:
      config:
        format: YAML

这样在Consul中data的key就必须使用YAML。 就类似上例中那样:

  • config/testApp,dev/data
  • config/testApp/data
  • config/application,dev/data
  • config/application/data

任何一组键值都可以按YAML文档格式来存放。

可以通过spring.cloud.consul.config.data-key来改变data的key值。

8.4.5 git2consul with Config

git2consul是一个Consul社区中的项目,用于从git资源库中加载配置文件到Consul中。 默认情况下,使用文件名作为key值。 YAML和Properties分别对应着.yml以及.properties后缀。 别忘了,设置spring.cloud.consul.config.format为:FILES。 例如:

bootstrap.yml

spring:
  cloud:
    consul:
      config:
        format: FILES

如果对于/configdevelopment环境,应用名foo,那就会产生下列键值:

  • .gitignore
  • application.yml
  • bar.properties
  • foo-development.properties
  • foo-production.yml
  • foo.properties
  • master.ref

同时也会创建下列配置源:

  • config/foo-development.properties
  • config/foo.properties
  • config/application.yml

每一个键值都需要对应的一个YAML或者Properties文件。

8.4.6 Fail Fast

对于Consul配置信息可以方便的在不同的环境中转换(开发环境,测试环境),但是当配置信息不可用时会导致应用启动失败。 默认情况下,是一个Fail Fast机制。

不过,在bootstrap.yml中设置spring.cloud.consul.config.failFast=false,这样会导致配置模块发出一个警告级别的日志,而不是抛出异常。这也将让应用能够正常启动。

8.5 Consul Retry

当应用启动时,如果想要兼容某个consul代理偶尔不可用状态,并想持续一段时间来确认。可以在classpath中引入:spring-retryspring-boot-starter-aop。这样在默认情况下,会重试6次,初始间隔1000毫秒,并每次按照1.1的指数进行时间补偿。

相关参数可以通过spring.cloud.consul.retry.*进行定制化配置。 这些对Spring Cloud Consul的Config和服务发现都起作用。

提示: 如果要完全控制重试,可以自定义一个id为"consulRetryInterceptor"的RetryOperationsInterceptor并进行@Bean注册。Spring还提供一个RetryInterceptorBuilder来简化构建过程。

8.6 Spring Cloud Bus with Consul

8.6.1 How to activate

如果想要整合Consul Bus可以加入下列以来,group :org.springframework.cloud artifact id:spring-cloud-starter-consul-bus

8.7 Circuit Breaker with Hystrix

应用如果在pom.xml中加入了spring-cloud-starter-hystrix,就可以使用Spring Cloud Netflix的Hystrix断路器。 然而,Hystrix并没有依赖Netflix的服务发现机制。 @EnableHystrix可以加在配置类上。然后,带有@HystrixCommand注解的方法就会当作断路器方法被调用。

8.8 Hystrix metrics aggregation with Turbine and Consul

Turbine(由Spring Cloud Netflix提供),汇集多个Hystrix实例的实时数据,并显示聚合视图。Turbine使用DiscoveryClient接口来查找相关实例。 当与Consul一起使用时,可以按下列方式进行配置:

pom.xml

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-netflix-turbine</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

注意,Turbine依赖并不是一个starter。Turbine的starter在Netflix Eureka中才提供的。

application.yml

spring.application.name: turbine
applications: consulhystrixclient
turbine:
  aggregator:
    clusterConfig: ${applications}
  appConfig: ${applications}

其中的clusterConfigappConfig,两者必须匹配,如果有多个值可以用逗号分割。

Turbine.java

@EnableTurbine
@EnableDiscoveryClient
@SpringBootApplication
public class Turbine {
    public static void main(String[] args) {
        SpringApplication.run(DemoturbinecommonsApplication.class, args);
    }
}

© 著作权归作者所有

共有 人打赏支持
秋雨霏霏
粉丝 146
博文 91
码字总数 160620
作品 0
杭州
CTO(技术副总裁)
Spring Cloud Finchley 正式发布,兼容 Spring Boot 2.0.x

经过数个前期测试版本,Spring Cloud Finchley 终于迎来了正式版本: 下载地址 发行说明 显著变化: 与 Spring Boot 2.0.x 兼容 不支持 Spring Boot 1.5.x 最低要求 Java 8 新增 Spring Clo...

淡漠悠然
06/20
0
12
Spring Cloud--Honghu Cloud分布式微服务云系统—组件化

Spring Cloud集成项目有很多,下面我们列举一下和Spring Cloud相关的优秀项目,我们的企业架构中用到了很多的优秀项目,说白了,也是站在巨人的肩膀上去整合的。在学习Spring Cloud之前大家必...

itcloud
04/26
0
0
Spring Cloud Finchley.SR1 发布,修复模块的 bug

Spring Cloud Finchley 的 Service Release 1 (SR1) 版本已发布,本次更新主要是对其包含的一些模块进行了升级,查看发布说明以了解更多信息。Spring Cloud Finchley 基于 Spring Boot 2.0....

局长
08/03
0
2
跟大家介绍一下关于Spring Cloud Consul

Spring Cloud Consul项目是针对Consul的服务治理实现。Consul是一个分布式高可用的系统,它包含多个组件,但是作为一个整体,在微服务架构中为我们的基础设施提供服务发现和服务配置的工具。...

明理萝
06/13
0
0
Spring Cloud Consul 2.0.0 发布,支持 HTTPS 实例

Spring Cloud Sleuth 2.0.0 已发布,更新内容包括: Added support for HTTPS instances and ACLs. is no longer used for Consul watches. Spring Cloud Consul 是把 Consul 的所有特性都集......

淡漠悠然
06/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

dubbo部分常见的面试题目

1、什么是AMQP协议? AMQP的全称是 Advanced Message Queuing Protocol (高级消息队列协议) 他是应用层协议的一个开放的标准,为面向消息中间件而设计,基于此协议的客户端和消息中间件可以...

DemonsI
9分钟前
0
0
http和https协议

HTTPS全称为Hypertext Transfer Protocol over Secure Socket Layer,中文含义为“超文本传输协议在安全加密字层”,简单来说就是加密数据传输,通俗的说就是安全连接。 HTTPS安全超文本传输...

寰宇01
10分钟前
0
0
vue内引入语音播报功能

在vue项目中引入语音播报,使用的科大讯飞语音接入, 具体思路为每次接收到语音信息后存入一个数组,然后监听这个数组,开始冲第一个索引播放,并且同时根据vuex getter 来动态删减数量 给a...

originDu
18分钟前
0
0
Java创建对象的五种方式

一、使用new关键字,调用构造方法创建对象 Person p1 = new Person(); 运行过程: 1、给新对象分配内存空间,将数据存储到堆。 2、执行显示的初始化。 3、执行构造器。new方法中括号参数传递...

Drathin
19分钟前
0
0
git使用纪要

之前公司一直没用git,于是自己注册了一个账号自己用,因为也没人合作,所以也没太关注协作方面的事情。最近公司终于想通了,开始用git,于是研究了一下,在此做个记录。 git功能非常灵活,因...

propagator
24分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部