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

简介: 本文重点讲述了在RPC远程调用中服务的注册和发现,通过SpringCloud框架的注册中心注册服务,以及应用模块从注册中心中发现相关服务。详细分析了服务的注册和发现的方式以及相关的应用配置,比较了SpringCloud框架下几种主流的注册中心特点以及使用配置。通过对本文的研读,读者可以了解到注册中心的整个框架和基本的使用方式。

服务治理

  • 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)
Rest:
- 使用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;
}
相关文章
|
2月前
|
负载均衡 算法 Java
【SpringCloud(4)】OpenFeign客户端:OpenFeign服务绑定;调用服务接口;Feign和OpenFeign
Feign是一个WebService客户端。使用Feign能让编写WebService客户端更加简单。 它的使用方法是定义一个服务接口然后再上面添加注解。Feign也支持可拔插式的编码器和解码器。SpringCloud对Feign进行了封装,十七支持了SpringMVC标准注解和HttpMessageConverters。 Feign可用于Eureka和Ribbon组合使用以支持负载均衡
699 138
|
5月前
|
消息中间件 负载均衡 中间件
⚡ 构建真正的高性能即时通讯服务:基于 Netty 集群的架构设计与实现
本文介绍了如何基于 Netty 构建分布式即时通讯集群。随着用户量增长,单体架构面临性能瓶颈,文章对比了三种集群方案:Nginx 负载均衡、注册中心服务发现与基于 ZooKeeper 的消息路由架构。最终选择第三种方案,通过 ZooKeeper 实现服务注册发现与消息路由,并结合 RabbitMQ 支持跨服务器消息广播。文中还详细讲解了 ZooKeeper 搭建、Netty 集群改造、动态端口分配、服务注册、负载均衡及消息广播的实现,构建了一个高可用、可水平扩展的即时通讯系统。
609 0
|
2月前
|
人工智能 JavaScript 前端开发
GenSX (不一样的AI应用框架)架构学习指南
GenSX 是一个基于 TypeScript 的函数式 AI 工作流框架,以“函数组合替代图编排”为核心理念。它通过纯函数组件、自动追踪与断点恢复等特性,让开发者用自然代码构建可追溯、易测试的 LLM 应用。支持多模型集成与插件化扩展,兼具灵活性与工程化优势。
274 6
|
8月前
|
人工智能 自然语言处理 数据可视化
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
|
4月前
|
人工智能 自然语言处理 JavaScript
Github又一AI黑科技项目,打造全栈架构,只需一个统一框架?
Motia 是一款现代化后端框架,融合 API 接口、后台任务、事件系统与 AI Agent,支持 JavaScript、TypeScript、Python 多语言协同开发。它提供可视化 Workbench、自动观测追踪、零配置部署等功能,帮助开发者高效构建事件驱动的工作流,显著降低部署与运维成本,提升 AI 项目落地效率。
412 0
|
5月前
|
文字识别 运维 监控
架构解密|一步步打造高可用的 JOCR OCR 识别服务
本文深入解析了JOCR OCR识别服务的高可用架构设计,涵盖从用户上传、智能调度、核心识别到容错监控的完整链路,助力打造高性能、低成本的工业级OCR服务。
258 0
架构解密|一步步打造高可用的 JOCR OCR 识别服务
|
11月前
|
机器学习/深度学习 安全 算法
十大主流联邦学习框架:技术特性、架构分析与对比研究
联邦学习(FL)是保障数据隐私的分布式模型训练关键技术。业界开发了多种开源和商业框架,如TensorFlow Federated、PySyft、NVFlare、FATE、Flower等,支持模型训练、数据安全、通信协议等功能。这些框架在灵活性、易用性、安全性和扩展性方面各有特色,适用于不同应用场景。选择合适的框架需综合考虑开源与商业、数据分区支持、安全性、易用性和技术生态集成等因素。联邦学习已在医疗、金融等领域广泛应用,选择适配具体需求的框架对实现最优模型性能至关重要。
2083 79
十大主流联邦学习框架:技术特性、架构分析与对比研究
|
7月前
|
Java 开发者 Spring
Spring框架 - 深度揭秘Spring框架的基础架构与工作原理
所以,当你进入这个Spring的世界,看似一片混乱,但细看之下,你会发现这里有个牢固的结构支撑,一切皆有可能。不论你要建设的是一座宏大的城堡,还是个小巧的花园,只要你的工具箱里有Spring,你就能轻松搞定。
312 9
|
9月前
|
消息中间件 人工智能 监控
文生图架构设计原来如此简单之分布式服务
想象一下,当成千上万的用户同时要求AI画图,如何公平高效地处理这些请求?文生图/图生图大模型的架构设计看似复杂,实则遵循简单而有效的原则:合理排队、分工明确、防患未然。
362 14
文生图架构设计原来如此简单之分布式服务
|
10月前
|
Cloud Native Java Nacos
springcloud/springboot集成NACOS 做注册和配置中心以及nacos源码分析
通过本文,我们详细介绍了如何在 Spring Cloud 和 Spring Boot 中集成 Nacos 进行服务注册和配置管理,并对 Nacos 的源码进行了初步分析。Nacos 作为一个强大的服务注册和配置管理平台,为微服务架构提供
4189 14

热门文章

最新文章