Consul服务与注册
服务注册的作用
硬编码微服务的IP地址和端口号会带来以下几个主要问题:
- 无法应对变化:如果支付微服务的IP地址或端口号发生变化,微服务将无法正常调用其他微服务,需要手动同步修改订微服务中的硬编码信息。
- 无法实现负载均衡:如果系统中有多个微服务和某一个微服务实例,硬编码无法支持负载均衡,导致无法充分利用多实例的优势。
- 维护复杂:在系统需要支持更高并发,增加微服务实例时,硬编码的方式会使维护变得异常复杂,每次变更都需要手动更新和部署。
因此,在微服务开发中,需要引入服务治理功能,来实现微服务之间的动态注册与发现,确保系统的灵活性和高可用性。通过SpringCloud,可以实现以下目标:
- 服务注册与发现:通过Consul等组件,微服务可以动态注册和发现彼此,无需手动配置IP地址和端口号。
- 负载均衡:通过Ribbon或Feign,可以实现微服务调用的负载均衡,提升系统的处理能力和稳定性。
- 自动化配置管理:使用SpringCloud Config等工具,可以实现配置的集中管理和动态更新,简化维护工作。
总结:为了克服硬编码带来的问题,确保微服务系统的灵活性和高可用性,需要引入SpringCloud等服务治理框架,实现动态注册与发现、负载均衡和自动化配置管理,从而提高系统的可靠性和维护效率。
而我们这篇文章奖从Consul展开
Consul的作用
-
服务发现:Consul的客户端可以注册服务,例如API或MySQL,其他客户端可以使用Consul来发现特定服务的提供者。通过使用DNS或HTTP,应用程序可以轻松找到它们所依赖的服务。
-
健康检查:Consul客户端可以提供任意数量的健康检查,可以与特定服务相关(例如“web服务器是否返回200 OK”),也可以与本地节点相关(例如“内存利用率是否低于90%”)。这些信息可以供操作员监控集群健康状况,并被服务发现组件用来将流量引导到健康的主机上。
-
键值存储:应用程序可以利用Consul的分层键/值存储,用于多种用途,包括动态配置、特性标记、协调、领导者选举等。简单的HTTP API使其易于使用。
-
安全服务通信:Consul可以为服务生成和分发TLS证书,以建立双向TLS连接。意图(Intentions)可以用来定义哪些服务被允许通信。服务分段可以通过意图轻松管理,并且可以实时更改,而无需使用复杂的网络拓扑和静态防火墙规则。
-
多数据中心:Consul原生支持多数据中心。这意味着Consul的用户不必担心为了扩展到多个区域而构建额外的抽象层。
-
提供UI界面:默认UI端口为8500
服务发现
-
SpringCloud环境的配置
-
pom.xml 文件加入依赖
<!--SpringCloud consul config--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency>
-
bootstrap.yml配置文件
spring: application: name: cloud-module-service-function # Spring 应用的名称,在服务注册和发现中使用 #### Spring Cloud Consul for Service Discovery cloud: consul: host: localhost # Consul 服务器的主机地址 port: 8500 # Consul 服务器的端口 discovery: prefer-ip-address: true # 优先使用服务 IP 地址进行注册 service-name: ${spring.application.name} # 使用 Spring 应用名作为服务名进行注册 config: prefix: config/consumer-service # 配置中心的前缀路径 profile-separator: '-' # 配置文件的分隔符,默认值是 ",",这里更新为 "-" format: YAML # 配置文件的格式为 YAML data-key: data # 数据键 enabled: true # 启用配置中心
-
SpringApplication.java上加上特定注解
@SpringBootApplication @EnableDiscoveryClient //该注解用于向使用consul为注册中心时注册服务 public class SpringApplication{ public static void main(String[] args) { SpringApplication.run(SpringApplicationclass, args); } }
-
-
启动Spring项目测试Consul
- 启动应用程序:SpringApplication.run(MyApplication.class, args);
- 加载配置:加载 application.yml 中的 Consul 配置。
- 初始化 Consul 客户端:Spring Cloud 自动配置类初始化 Consul 客户端。
- 构建注册信息:构建包括服务名称、实例ID、IP地址、端口的注册信息。
- 发送注册请求:向 Consul 服务器发送 HTTP 请求,注册服务。
- 保存注册信息:Consul 服务器保存注册信息并更新服务目录。
- 执行健康检查:根据配置的健康检查路径和间隔,Consul 定期检查服务健康状态。
- 服务发现:客户端查询 Consul 服务目录,获取服务实例列表。
-
结果图
健康检查
- UI控制台
- 正常情况下的服务状态
- 错误情况下的服务状态
- 正常情况下的服务状态
键值存储
- key/value书写规则
- prefix+service-name+data-key
- 其中 prefix 是文件存储的前缀
- service-name为注册的服务名称
- data-key是文件名称
spring: application: name: cloud-payment-service cloud: consul: host: localhost port: 8500 discovery: service-name: ${spring.application.name} #这个就是注册的服务名称 config: prefix: config/payment-service #这就是前缀的目录 profile-separator: '-' format: YAML data-key: data #这就是具体配置文件名称
- prefix+service-name+data-key