关于微服务:微服务架构下的服务治理如何在-SpringCloud-框架中实现服务的注册与发现

32次阅读

共计 5435 个字符,预计需要花费 14 分钟才能阅读完成。

服务治理

  • RPC 近程过程调用协定的外围设计思维: 在于 注册核心, 因为 注册核心: 治理每个服务与服务之间的一个依赖关系
  • 服务治理: 在传统的 RPC 近程过程调用协定中, 治理每个服务与服务之间的依赖关系非常复杂. 能够应用服务治理技术, 治理每个服务与服务之间的一个依赖关系. 能够实现本地负载平衡, 服务发现与注册, 容错等

    服务注册与发现

    注册核心

  • 在 RPC 近程过程调用协定中, 有一个注册核心

    • SpringCloud反对三种组册核心:

      • Consul(go 语言)
      • Eureka
      • Zookeeper
    • Dubbo反对两种注册核心:

      • Zookeeper
      • Redis
  • 注册核心概念: 寄存服务地址相干信息(接口地址), 通过别名注册获取
  • 原理:

    • 首先启动注册核心
    • 服务提供者 (Provider) 服务在启动时, 把以后服务信息以别名的形式注册到注册核心
    • 服务消费者 (Consumer) 在调用接口的时候, 应用服务别名从注册核心获取 RPC 近程调用地址
    • 服务消费者 (Consumer) 获取 RPC 近程调用地址后, 应用本地 HttpClient 技术实现调用
  • 配置文件:

    server.port=8761    # 服务端口号
    eureka.instance.hostname=127.0.0.1    # 注册核心 IP 地址
    eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/    # 注册 url 地址
    eureka.client.register-with-eureka=false    # 是否将本人注册到注册核心(集群时须要注册)
    eureka.client.fetch-registry=false    # 是否须要到注册核心检索服务信息
  • 注册核心我的项目:

    1. 在主类上标注 @EnableEurekaServer 注解开启 EurekaServer 服务, 开启注册核心

    服务注册

  • 将服务信息注册到注册核心上
  • 配置文件:

    server.port=8001    # 服务提供者 (Provider) 服务端口号
    spring.application.name=Ticket-Service    # 服务别名, 注册到注册核心的名称:serviceId
    eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/    # 服务提供者 (Provider) 注册到 eureka 注册核心的 url 地址
    eureka.client.register-with-eureka=true    # 是否将本人注册到注册核心
    eureka.client.fetch-registry=true    # 是否须要到注册核心检索服务信息
  • 服务提供者 (Provider) 我的项目:

    1. 在主类上标注 @EnableEurekaClient 注解将服务提供者 (Provider) 服务注册到注册核心

    服务发现

  • 从注册核心获取服务信息
  • 配置文件:

    server.port=8200    # 服务消费者 (Consumer) 服务端口号
    spring.application.name=Ticket-User    # 服务别名, 注册到注册核心的名称:serviceId
    eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/    # 服务提供者 (Provider) 调用服务 eureka 注册核心的 url 地址
    eureka.client.register-with-eureka=true    # 是否将本人注册到注册核心
    eureka.client.fetch-registry=true    # 是否须要到注册核心检索服务信息
  • 服务消费者 (Consumer) 我的项目:

    1. 在 SpringCloud 有两种形式调用服务:Rest    Fegin(SpringCloud)
  • 应用 RestTemplate, 是 SpringBoot 的 web 组件, 默认整合 Ribbon 负载均衡器. 底层就是采纳的 HttpClient 技术
  • 创立 RestTemplate 并标注 @Bean 增加办法创立 Http 服务进行通信
  • RestTemplate 调用有两种形式: 采纳服务别名调用 间接 url 调用
    restTemplate.getForObject(“providerName(代替 IP 地址)/providerUrl”,String.class)
    2. 在主类上标注 @EnableEurekaClient(@EnableDiscoveryClient)注解开启服务消费者 (Consumer) 从注册核心发现服务性能
    3. 应用 Rest 形式以别名形式调用须要依赖 Ribbon 负载均衡器, 在 RestTemplate 办法上标注
    @LoadBalanced, 让 RestTemplate 在申请时领有客户端的负载平衡的能力

  • Ribbon 负载平衡:

    • 在集群操作中:

      • 首先启动注册核心
      • 多个服务提供者 (Provider) 服务在启动时, 把以后服务信息以别名的形式注册到注册核心
      • 多个服务消费者 (Consumer) 在调用接口的时候, 应用服务别名从注册核心获取 RPC 近程调用地址
      • 服务消费者 (Consumer) 获取 RPC 近程调用地址后,先应用 Ribbon 负载均衡器实现负载平衡 再应用本地 HttpClient 技术实现调用
    • 负载平衡根本策略: 轮询机制(默认)

      集群

  • 微服务 RPC 近程过程调用协定的 外围 : 服务治理: 注册核心
  • 搭建 注册核心集群: 能够解决注册核心故障导致整个微服务环境不可用的问题
  • Eureka 高可用原理:

    • 默认状况下,Eureka 是让服务注册的服务注册核心, 不注册本人
    • Eureka 高可用就是将本人作为服务向其它注册核心注册本人, 造成一组 互相注册 的服务注册核心,实现服务清单的相互同步, 达到高可用成果
  • 注册核心集群:

    • 在注册服务过程中, 只会保障有一台注册核心有对应的服务信息数据即可, 只有注册核心宕机后, 才启动同步数据到其它注册核心
    • 配置文件:

      server.port=9000    # 服务端口号
      spring.application.name=euraka    # 注册核心集群上服务器的名称要保持一致
      eureka.instance.hostname=127.0.0.1    # 注册核心 IP 地址
      eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:8761/eureka/    # , 注册到其它注册核心的 url 地址
      eureka.client.register-with-eureka=true    # 是否将本人注册到注册核心(集群时须要注册)
      eureka.client.fetch-registry=true    # 是否须要到注册核心检索服务信息

      Eureka 自我爱护机制

  • Eureka 自我爱护机制: 为了避免EurekaClient 能够失常运行时, 与 EurekaServer 在网络无奈通信的状况下,EurekaServer 误将 EurekaClient 服务剔除

    1. 默认状况下,EurekaClient 端定时向 EurekaServer 端发送心跳包
    2. 如果 EurekaServer 端在 < 肯定工夫 > 内没有收到 EurekaClient 端发送的心跳包, 便会间接从服务注册列表中剔除该服务
    3. 在 < 短时间 > 内如果失落了大量的服务实例心跳包,EurekaServer 端会开启自我爱护机制, 不会剔除 EurekaClient 端
  • 在本地开发环境中, 测试时倡议敞开 EurekaServer 端自我爱护机制, 保障不可用服务及时被剔除:

    配置文件:
    EurekaServer 端:
    eureka.server.enable-self-preservation=false         # 是否开启自我爱护机制(默认开启 true) 
    eureka.server.eviction-interval-timer-in-ms=2000    # 剔除距离 2 秒
    
    EurekaClient 端 - 服务提供者(Provider):
    # 心跳检测和续约工夫, 在测试程序时, 将值设置小些, 保障服务敞开后, 注册核心及时剔除服务
    eureka.instance.lease-renewal-interval-in-seconds=1    # EurekaClient 端向 EurekaServer 端发送心跳的工夫距离秒
    eureka.instance.lease-expiration-duration-in-seconds=2    #     EurekaServer 端在收到最初一次心跳之后等待时间下限秒, 超过就剔除服务

    Zookeeper

  • Eureka 闭源, 应用 Zookeeper 代替 Eureka 作为注册核心
  • Zookeeper 是分布式协调工具, 能够实现注册核心的性能, 采纳 Zookeeper 的 长期节点 类型
  • 长期节点和生命周期是相关联的, 如果服务断开连接之后, 长期节点就会被主动删除

    配置文件:
    ZookeeperClient- 服务提供者(Provider):
    server.port=8090    # 服务端口号
    spring.application.name=zk-ticket    # 服务别名, 注册到注册核心的名称
    spring.cloud.zookeeper.connect-string=127.0.0.1:2181    #注册到 zookeeper 注册核心的 url 地址 
    
    ZookeeperClient- 服务消费者(Consumer):
    server.port=8020    # 服务端口号
    spring.application.name=zk-user    # 服务别名, 注册到注册核心的名称
    spring.cloud.zookeeper.connect-string=127.0.0.1:2181    #调用服务的 zookeeper 注册核心的 url 地址
    
    
    1.ZookeeperClient- 服务提供者 (Provider) 在主类上标注 @EnableDiscoveryClient 注解向注册核心注册服务
    2.ZookeeperClient- 服务消费者 (Consumer) 在主类上标注 @EnableDiscoveryClient 注解从注册核心调用服务
    3.. 在调用服务的办法上标注 @LoadBalanced 开启 Ribbon 的负载平衡性能进行服务的调用

    Consul

  • Consul 是开源的分布式服务发现与配置管理系统, 由 HashiCorp 公司用 Go 语言开发
  • 特点:

    • 基于 raft 协定, 比拟简洁
    • 反对健康检查
    • 反对 Http 和 DNS 协定
    • 反对跨数据中心的 WAN 集群
    • 提供图形界面
    • 跨平台
  • Consul 环境搭建:

    • 下载 Consul
    • 设置环境变量: 增加 Consul 所在目录
    • cmd 启动:consul agent -dev -ui -node=cy(-dev: 开发服务器模式启动 -node: 节点名 -ui 界面拜访反对, 默认开启)
    • 拜访 Consul: http://localhost:8500

      配置文件:
      ConsulClient- 服务提供者(Provider):
      server.port=8780    # 服务端口号
      spring.application.name=consul-ticket    # 服务别名, 注册到注册核心的名称
      spring.cloud.consul.host=127.0.0.1        # Consul 服务 url 地址
      spring.cloud.consul.port=8500            # Consul 服务端口号
      spring.cloud.consul.discovery.hostname=192.168.66.128    # 服务在注册核心显示的 IP 地址(默认状况下, 服务注册到注册核心, 地址随机生成)
      
      ConsulClient- 服务消费者(Consumer):
      server.port=8099    # 服务端口号
      spring.application.name=consul-user    # 服务别名, 注册到注册核心的名称
      spring.cloud.zookeeper.connect-string=127.0.0.1:2181    #服务调用服务 Consul 注册核心的 url 地址
      
      
      1.ZookeeperClient- 服务提供者 (Provider) 在主类上标注 @EnableDiscoveryClient 注解向注册核心注册服务
      2.ZookeeperClient- 服务消费者 (Consumer) 在主类上标注 @EnableDiscoveryClient 注解从注册核心调用服务
      3.. 在调用服务的办法上标注 @LoadBalanced 开启 Ribbon 的负载平衡性能进行服务的调用

      DiscoveryClient

  • 获取注册核心的服务信息
  • 用于实现本地负载平衡

    @Autowired        // 主动拆卸
    private DiscoveryClient discoveryClient;    // Discovery 接口, 用于获取注册核心的服务信息
    
    
    @RequestMapping("/discoveryClientMember")
    public List<ServiceInstance> discoveryClientMember(){List<ServiceInstance> instances=discoveryClient.getInstance("consul-ticket");
      for(ServiceInstance serviceInstance:instances){System.out.println("URI:"+serviceInstance.getUri());
      }
      return instance;
    }

正文完
 0