如何使用 Spring Cloud Consul 的其他配置和发现功能,不会来学
spring:
cloud:
consul:
discovery:
instanceId:
(spring .application. name}: (vcap.application. instance id:$ (spring . appicat
ion.instance id:${random.valuelll} } }
在启动所有示例微服务之后,即可查看 Consul 用户界面仪表板。此时应该看到注册了 4 种不同的服务,如下面的屏幕截图 10.1 所示。
或者,开发人员也可以使用 RESTful HTTP API 端点 GET /v1/agent/services 查看已注册服务的列表。以下是 JSON 响应的片段。
"customer-service-zone1-8092":1
ID": "customer-service-zone1-8092",
"service": "customer-service",
"Tags": 1,
"Address"; "minkowp-l.p4.org","Port": 8092,
"EnableTagOverride": false,
"CreateIndex": 0,
"ModifyIndex": 0
),
"order- service- zone1-8090”: {
"ID": "order-service-zone1-8090",
"Service": "order-service" ,
"Tags": [],
"Address"; "minkowp-1.p4.org",
"Port": 8090,
"EnableTagOverride"; false,
"CreateIndex": 0,
"ModifyIndex": 0
}
现在,可以使用 pl.piomin.services. order.rderCotollrTest JUnit 测试类通过向 order-service 服务发送一些测试请求来轻松测试整个系统。一切都应该工作得很好,和 Eurcka 的发现一样。
1.运行状况检查
Consul 可以通过调用/health 端点来检查每个已注册实例的运行状况。如果不希望在类路径中提供 Spring Boot Actuator 库,或者如果开发人员的服务存在一些问题,那么它将在 Web 仪表板上显示,如图 10.2 所示。
如果运行状况检查端点由于任何原因在不同的上下文路径下可用,则可以使用 spring cloud consuldiscovery healthCheckPath 属性覆盖该路径。还可以通过使用模式定义 halthCheckInterval 来更改状态刷新间隔,例如,10s 表示 10 秒,2m 表示 2 分钟。
spring:
cloud:
consul :
discovery:
healthCheckPath: admin/health
healthCheckInterval: 20s
2.区域
本书在第 4 章“服务发现”中已经详细介绍了可用于 Eureka 发现的分区机制。当主机放置在不同的位置,而开发人员又希望在同一区域中注册的实例之间进行通信时,它非常有用。虽然 Spring Cloud Consul 的官方说明文档(tp:/cloud .spring?
io/spring-cloud-static/spring-cloud-consul/1.2.3.RELEASE/single/spring-cloud-consul.html)对这样的解决方案未置一词,但幸运的是这并不意味着它无法实现。Spring Cloud 可以提供基于 Consul 标记的分区机制。开发人员可以使用 spring cloud.?consul.discovery.instanceZone 属性配置应用程序的默认区域。它使用传递的值设置 spring cloud.consu.discovery. defaultZoneMetadataName 属性中配置的标记。默认元数据标签的名称为 zone。
现在继续讨论示例应用程序。我们已经使用两个配置文件(zonel 和 zone2)扩展了所有配置文件。以下是 order -service 服务的 botstrap.yml 文件。
spring:
application:
name: order-service
cloud:
consul :
host: 192.168. 99.100
port: 8500spring:
profiles: zone1
cloud:
consul ;
discovery:
instanceZone: zone1
server:
port: S{PORT:8090}
---
spring:
profiles: zone2
cloud:
consul :
discovery:
instanceZone: zone2
server :
port: $IPORT:90901
在两个不同区域中注册的每个微服务都有两个运行实例。使用 mvncleaninstall 命令构建整个项目后,应该启动具有活动配置文件 zonel 或 zone2 的 Spring Boot 应用程序,如 java jar -spring profils active-zonel targe/order- service-1.0-SNAPSHOTjar.开发人员可以在 NODES(节点)中看到使用区域标记的已注册实例的完整列表。如图 10.3 所示为此时的 Consul 仪表板视图。
本架构中的最后一个元素是基于 Zuul 的 API 网关。我们还将在不同的区域中运行两个 gateway-service 服务实例。我们希望在 Consul 中省略注册,并且只允许获取配置, Ribbon 客户端在执行负载均衡时使用该配置。以下是 gateway -service 服务的 bootstrap.yml 文件的片段。它已经通过将 spring cloud. consu.discovery .register 和 spring cloud consul?
discovery.registertHealthCheck 属性设置为 false 禁用了注册。
---
spring:
profiles: zone1
cloud:
consul:
discovery:
instanceZone: zonel
register: false
registerHealthCheck: false
server:
port: ${PORT:8080}
---
spring:
profiles: zone2
cloud:
consul:
discovery:
instanceZone: zone2
register: false
registerHealthCheck: false
server:
port: ${PORT:9080}
3.客户端自定义设置
可以通过配置文件中的属性自定义 Spring Cloud Consul 客户端。其中一些设置已在本章前面的小节中介绍过。其他有用的设置已在表 10.3 中列出。所有这些都以
spring.cloud.consul.discovery 为前缀。
4.以集群模式运行
到目前为止,我们通常会启动一个单独的 Consul 实例。但这只是开发模式中的合适解决方案,对于生产模式来说是不够的。在生产模式中,我们会希望拥有一个可扩展的生产级服务发现基础架构,其中包含一些在集群内部协同工作的节点。Consul 提供了对集群的支持,它将在成员之问通信时使用 Gossip 协议,在选举领导时使用 Raft 共识协议。在此我们不想介绍该过程的细节,但是应该说明一些关于 Consul 架构的基础知识。
我们已经讨论过 Consul 代理,但它究竟是什么,以及它的作用是什么并没有得到解释。代理是 Consul 集群的每个成员长期运行的守护程序。它可以在客户端或服务器模式下运行。所有代理都负责在全局范围内运行检查并保持在不同节点和同步中注册的服务。
本节的主要目标是使用 Docker 镜像设置和配置 Consul 集群。首先,我们将启动容器,它充当集群的领导者。当前使用的 Docker 命令与独立的 Consul 服务器只有一个区别。我们设置了环境变量 CONSUL. _BIND_ INTERFACE-eth0, 以便将集群代理的网络地址从 127.0.0.1 更改为可用于其他成员容器的网络地址。笔者的 Consul 服务器现在在内部地址 172.17.0.2.上运行。要查看你的地址(它应该是相同的),可以运行命令 docker logs consul.容器启动后将记录适当的信息。
docker run -d --name consul-1 -P 8500:8500 一白 CONSUL BIND_ INTERFACE eth0
consul
了解该地址非常重要,因为现在我们必须将它作为集群连接参数传递给每个成员容器启动命令。我们还通过将 0.0.0.0 设置为客户端地址将其绑定到所有接口。现在,可以使用-p 参数轻松地在客户端代理 API 之外公开客户端代理 API。
docker run -d --name consul-2 -P 8501:8500 consul agent -server
client=0.0.0.0 -join=172.17.0.2
docker run -d --name consul-3 -P 8502:8500 consul agent -server
client=0.0.0.0 -join=172.17.0.2
在使用 Consul 代理运行两个容器之后,可以通过在领导者(Leader) 的容器上执行如图 10.4 所示的命令来检查集群成员的完整列表。
Consul 服务器代理在 8500 端口上公开,而成员代理在端口 8501 和 8502 上公开。即使微服务实例将自身注册到成员代理,集群的所有成员也可以看到它,如图 10.5 所示。
开发人员可以通过更改配置属性轻松更改 SpringBoot 应用程序的默认 Consul 代理地址。
spring:
application:
name: customer-service
cloud:
consul :
host: 192.168.99.100
port: 8501
分布式配置
=====
对于在类路径中使用 Spring Cloud Consul Config 库的应用程序来说,它们将在引导阶段从 Consul 键/值存储中获取配置。也就是说,默认情况下,会存储在/config 文件夹中。当开发人员要创建一个新键值时,必须设置-个文件夹路径。该路径将用于标识键值并将其分配给应用程序。Spring Cloud Config 会尝试根据应用程序名称和活动配置文件解析存储在文件夹中的属性。假设我们已经在 bosrp.ym 文件中将 spring apcationamnn 属性设置为 order-service,并将 sprigprofiles. active 运行参数设置为 zonel," 那么它会尝试按以下顺序查找属性源: config/order-service. zonel/、 config/order-service/. config/ pplication、zone1/、configapplication/. 对于所有没有与服务相关的属性源的应用程序来说,包含前缀 confgapplication 的所有文件夹就是它们的默认配置。
1.管理 Consul 中的属性
向 Consul 添加单个键值的最便捷方式是通过其 Web 仪表板。另一种方法是使用/kvHTTP 端点,这在本章开头已经介绍过。在使用 Web 控制台时,必须转到 KEY/VALUE(键/值)视图,然后就可以查看所有当前存在的键和值,并通过以任何格式提供其完整路径和值来创建新的键,如图 10.6 所示。
每个键值都可以更新或删除,如图 10.7 所示。
要访问使用 Consul 中存储的属性源的示例应用程序,应该切换到与上一个示例相同的存储库中的分支配置。我们已经为每个微服务创建了键值 server.port 和 spring cloud.consul. discovery instanceZone,而不是在 application.yml 或 bootstrap.yml 文件中定义它。
2.客户端定制
可以使用以下属性自定义 Consul Config 客户端,这些属性以
spring.cloud.consul.config 为前缀。
评论