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

攻城狮Chova      2022-02-12     333

关键词:

服务治理

  • 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;
    }

如何在一分钟内实现微服务系统下的架构可视化

为什么需要架构可视化随着企业进行微服务架构改造,系统架构复杂度越来越高,架构变化日益频繁,微服务改造后的实际架构模型可能与预期已经产生了巨大差异,架构师或系统运维人员很难准确记忆所有资源实例的构成和交... 查看详情

如何在一分钟内实现微服务系统下的架构可视化

为什么需要架构可视化随着企业进行微服务架构改造,系统架构复杂度越来越高,架构变化日益频繁,微服务改造后的实际架构模型可能与预期已经产生了巨大差异,架构师或系统运维人员很难准确记忆所有资源实例的构成和交... 查看详情

如何在一分钟内实现微服务系统下的架构可视化

为什么需要架构可视化随着企业进行微服务架构改造,系统架构复杂度越来越高,架构变化日益频繁,微服务改造后的实际架构模型可能与预期已经产生了巨大差异,架构师或系统运维人员很难准确记忆所有资源实例的构成和交... 查看详情

微服务架构下的服务治理

...Watcher机制常见应用场景分析分布式锁集群选主统一命名服务统一配置管理统一集群管理三、ApacheDubbo集成zookeeper实现服务注册实现步骤实现原理四、ApacheDubbo的高级应用集群容错配置方式负载均衡配置方式服务降级配置方式主机... 查看详情

三种微服务治理方式

1、应用程序中包含微服务治理逻辑在微服务架构中,服务间不再是在朴素的进程内通信,取而代之的是通过轻量级的网络协议进行通信。那么,如何找到服务提供方?如何超时重试?当存在多个服务提供方时如何实现负载均衡... 查看详情

微服务:整合springcloudeureka-服务治理机制

...体验了SpringCloudEureka通过简单的注解配置就能实现强大的服务治理功能之后,我们可以进一步了解一些Eureka基础架构中各个元素之间的通信行为,以此来更加深入的理解Eureka服务治理体系是如何运转起来的。二、微服务基础架构... 查看详情

微服务架构数据治理

随着微服务架构的落地,人们发现微服务架构虽然改进了开发模式,但同时也引入了一些问题,在这所有的问题中,最重要的也是马上要面临的一个问题就是数据的问题。在微服务架构中我们强调彻底的组件化和服务化,每个微... 查看详情

网易云原生架构实践之服务治理(代码片段)

云原生(CloudNative)的高阶实践是分布式服务化架构。一个良好的服务化架构,需要良好的服务发现、服务治理、服务编排等核心能力。本文为读者解析网易云的服务治理策略及其典型实践。 网易云微服务架构 在优化了... 查看详情

服务治理平台-注册中心

...多,持续部署困难,启动时间变慢等问题慢慢凸显时,微服务架构应运而生。微服务架构可以解决单体架构各种局限性问题。微服务架构:开发高可用企业应用,后端需要支持多种客户端形式,比如桌面端,移动端及其他微服务... 查看详情

服务治理与微服务

...了web应用,web应用的特点是界面部分是显示在浏览器中,服务处理是在服务容器中的,页面显示一般用css+js+html技术来处理,而后端可以用java、ph 查看详情

一文读懂springboot微服务架构和大数据治理之间的故事

微服务架构微服务的诞生并非偶然,它是在互联网高速发展,技术日新月异的变化以及传统架构无法适应快速变化等多重因素的推动下诞生的产物。互联网时代的产品通常有两类特点:需求变化快和用户群体庞大,在这种情况下... 查看详情

微服务架构下的身份认证(代码片段)

  从单体应用架构到分布式应用架构再到微服务架构,应用的安全访问在不断的经受考验。为了适应架构的变化、需求的变化,身份认证与鉴权方案也在不断的变革。面对数十个甚至上百个微服务之间的调用,如何保证高效安... 查看详情

dubbo架构设计与源码解析服务注册

...ubbo简介Dubbo是一款典型的高扩展、高性能、高可用的RPC微服务框架,用于解决微服务架构下的服务治理与通信问题。其核心模块包含【RPC通信】和【服务治理】,其中服务治理又分为服务注册与发现、服务容错、负载均衡、流量... 查看详情

常见的3种微服务治理方式

1、应用程序中包含微服务治理逻辑在微服务架构中,服务间不再是在朴素的进程内通信,取而代之的是通过轻量级的网络协议进行通信。那么,如何找到服务提供方?如何超时重试?当存在多个服务提供方时如何实现负载均衡... 查看详情

技术架构下的运维治理

...维治理之流程体系运维治理之规范体系运维治理之标准化服务治理之架构失控运维治理之架构点控制运维治理之架构线的控制技术架构之名字服务名字服务中心的服务治理一次业务访问流能够很好的容忍其经过的硬件及软件故障... 查看详情

应用量化时代|微服务架构的服务治理之路

...展,在众多企业的数字化转型之路上,云原生、DevOps、微服务、服务治理等成为行业内不断被探讨的新话题。人们在理解和接受这些新型概念的同时,也不断地思考其可能的落地形态。需求是创造发生的原动力,于是一批代表性... 查看详情

从0开始的微服务架构:如何保障微服务架构下的数据一致性

虽然已经红了很久,但是“微服务架构”正变得越来越重要,也将继续火下去。各个公司与技术人员都在分享微服务架构的相关知识与实践经验,但我们发现,目前网上的这些相关文章中,要么上来就是很有借鉴意义的干货,要... 查看详情

archsummit阿里云原生微服务架构治理最佳实践

...持👍一下博主~本文目录前言本文导读一、云原生微服务的挑战和趋势1、微服务在云原生下的挑战1.1挑战1.2微服务化深入服务治理是难点2、云原生微服务的发展趋势二、运行态服务治理最佳实践1、无损上下线2、安全生产... 查看详情