服务注册的作用

硬编码微服务的IP地址和端口号会带来以下几个主要问题:

  1. 无法应对变化:如果支付微服务的IP地址或端口号发生变化,微服务将无法正常调用其他微服务,需要手动同步修改订微服务中的硬编码信息。
  2. 无法实现负载均衡:如果系统中有多个微服务和某一个微服务实例,硬编码无法支持负载均衡,导致无法充分利用多实例的优势。
  3. 维护复杂:在系统需要支持更高并发,增加微服务实例时,硬编码的方式会使维护变得异常复杂,每次变更都需要手动更新和部署。

因此,在微服务开发中,需要引入服务治理功能,来实现微服务之间的动态注册与发现,确保系统的灵活性和高可用性。通过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

服务发现

  1. 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);
          }
      }
      
  2. 启动Spring项目测试Consul

    1. 启动应用程序:SpringApplication.run(MyApplication.class, args);
    2. 加载配置:加载 application.yml 中的 Consul 配置。
    3. 初始化 Consul 客户端:Spring Cloud 自动配置类初始化 Consul 客户端。
    4. 构建注册信息:构建包括服务名称、实例ID、IP地址、端口的注册信息。
    5. 发送注册请求:向 Consul 服务器发送 HTTP 请求,注册服务。
    6. 保存注册信息:Consul 服务器保存注册信息并更新服务目录。
    7. 执行健康检查:根据配置的健康检查路径和间隔,Consul 定期检查服务健康状态。
    8. 服务发现:客户端查询 Consul 服务目录,获取服务实例列表。
  3. 结果图
    alt text

健康检查

  1. UI控制台
    1. 正常情况下的服务状态
      alt text
    2. 错误情况下的服务状态
      alt text

键值存储

  1. key/value书写规则
    • prefix+service-name+data-key
      1. 其中 prefix 是文件存储的前缀
      2. service-name为注册的服务名称
      3. 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 #这就是具体配置文件名称
      
      截图_选择区域_20240727160502.png