文档章节

[Spring Cloud] 8 Spring Cloud Consul

秋雨霏霏
 秋雨霏霏
发布于 2017/02/15 14:45
字数 2497
阅读 791
收藏 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);
    }
}

© 著作权归作者所有

共有 人打赏支持
秋雨霏霏
粉丝 149
博文 94
码字总数 168411
作品 0
杭州
CTO(技术副总裁)
私信 提问
Spring Cloud 大版本 Spring Cloud Edgware.SR2 发布

Spring Cloud Edgware.SR2 已发布,该版本可以在 Maven Central 找到,本次更新主要是对其包含的一些模块进行了升级,或查看 Edgware 发布说明以获取更多信息。 以下模块作为 Edgware.SR2 的...

局长
02/10
5.5K
5
Spring Cloud Edgware.SR5 发布,大量 bug 修复

Spring Cloud Edgware SR5(Service Release 5)已发布,可在 Maven Central 下载该版本。 主要更新 Spring Cloud Commons Bug fixes Spring Cloud Config Documentation and Bug fixes Spr......

淡漠悠然
10/18
1K
0
Spring Cloud Brixton M1 发布

主要更新内容如下: Spring Boot 1.3.x and Spring 4.2.x support Cluster Leadership election and locks Hashicorp Consul support for service registration/discovery, configuration an......

oschina
2015/09/17
1K
5
Spring Cloud Greenwich.M3 版本发布

Spring Cloud Function 的第三个 Milestone 3 已发布,该版本的各个模块现可在 Spring Milestone 存储库中使用。 主要更改 此版本与 Spring Boot 2.1.0.RELEASE 兼容,并已对 Java 11 兼容性...

淡漠悠然
11/22
1K
0
Spring Cloud--Honghu Cloud分布式微服务云系统—组件化

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

itcloud
04/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

[LintCode] Binary Tree Level Order Traversal(二叉树的层次遍历)

描述 给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) 样例 给一棵二叉树 {3,9,20,#,#,15,7} : 3 / \9 20 / \ 15 7 返回他的分层遍历结果: [ [3], [...

honeymose
11分钟前
1
0
Spring Cloud Config 规范

Spring Cloud Config 规范 首先Spring Cloud 是基于 Spring 来扩展的,Spring 本身就提供当创建一个Bean时可从Environment 中将一些属性值通过@Value的形式注入到业务代码中的能力。那Sprin...

阿里云官方博客
21分钟前
1
0
renderer

renderer Function 单元格绘制处理函数,同drawcell事件。

architect刘源源
32分钟前
5
0
jdk1.8 lambda表达式过滤重复的对象

//操作类public class BizAgentAudit {    private String supplierOrgId;    private int age;    private String name;        public BizAgentAudit() { ...

INSISTQIAO
33分钟前
6
0
DataUtil的日期处理

SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果定义为static,必须加锁,或者使用 DateUtils 工具类。 解决方法 1、将SimpleDateFormat定义成局部变量。 缺点:每调用...

DoLo-lty
37分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部