【SpringCloud(2)】微服务注册中心:Eureka、Zookeeper;CAP分析;服务注册与服务发现;单机/集群部署Eureka;连接注册中心

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: 1. 什么是服务治理?SpringCloud封装了Netfix开发的Eureka模块来实现服务治理在传统pc的远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册

1. 什么是服务治理?

SpringCloud封装了Netfix开发的Eureka模块来实现服务治理

在传统pc的远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册

2. 什么是服务注册与发现

Eureka采用了CS的设计架构,Eureka Server 作为服务注册功能的服务器,它是服务注册中心,而系统中的其他微服务使用Eureka的客户端连接到Eureka Server并维持心跳连接。这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行

在服务注册与发现中,由一个注册中心,当服务器启动的时候,会把当前自己服务器的信息比如服务地址通讯等以别名方式注册到注册中心上。另一方,以该别名的方式去注册中心上获取实际的服务通讯地址,然后再实现本地RPC调用RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖管理(服务治理概念),在任何RPC远程框架中,都会由一个注册中心(存放服务地址相关信息(接口信息))

2.1 Eureka

2.1.1 Eureka Server提供服务注册服务

各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可用在界面中直观看到

2.1.2 EurekaClient通过注册中心进行访问

是一个Java客户端,用户简化EurekaServer的交互,客户端同时也具备一个内置的,使用轮询负载算法的负载均衡器。在应用启动后将会向Eureka Server发送心跳(默认周期30秒)。如果EurekaServer在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)

3. Eureka实操

3.1 单机Eureka实现

在项目中,消费者和提供者需要引入jar包

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

并在SpringBoot启动类添加**@EnableEurekaClient**注解

yaml需要配置Eureka的注册中心地址以及是否注册等确认信息

########################### Eureka ##################################
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    # 在server里,service-url直接填写地址,但在client中需要添加defaultZone
    service-url:
      defaultZone: http://localhost:7001/eureka
  • 需要一个新的模块来作为Eureka注册中心

在这个新模块中,需要引入jar包

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

并在SpringBoot启动类上添加**@EnableEurekaServer**注解

yaml配置文件中

server:
  port: 7001
eureka:
  instance:
    hostname: localhost # eureka服务端的实例名称
  client:
    fetch-registry: false # 不去检索服务
    register-with-eureka: false # 不向注册中注册自己
    # 设置Eurekaserve交互的地址查询服务和注册服务都需要依赖这个地址
    server-url: http://${eureka.instance.hostname}:${server.port}/eureka/

3.2 集群Eureka部署

准备两个或多个模块进行部署EurekaServer

当存在有多个时yaml文件必须一一对应上

  • Server7002
server:
  port: 7002
eureka:
  instance:
    #hostname: localhost # eureka服务端的实例名称
    hostname: eureka7002.com # eureka集群
  client:
    fetch-registry: false # 不去检索服务
    register-with-eureka: false # 不向注册中注册自己
    # 设置Eurekaserve交互的地址查询服务和注册服务都需要依赖这个地址
    #server-url: http://${eureka.instance.hostname}:${server.port}/eureka/
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka # eureka集群配置,需要集群其他内容
  • Server7001
server:
  port: 7001
eureka:
  instance:
    #hostname: localhost # eureka服务端的实例名称
    hostname: eureka7001.com # eureka集群
  client:
    fetch-registry: false # 不去检索服务
    register-with-eureka: false # 不向注册中注册自己
    # 设置Eurekaserve交互的地址查询服务和注册服务都需要依赖这个地址
    #server-url: http://${eureka.instance.hostname}:${server.port}/eureka/
    service-url:
      defaultZone: http://eureka7002.com:7002/eureka # eureka集群配置,需要集群其他内容

在提供者和消费者上,yaml文件的Eureka地址也都需要一一添加

########################### Eureka ##################################
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    # 在server里,service-url直接填写地址,但在client中需要添加defaultZone
    service-url:
      defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka # Eureka集群

4. 提供者集群部署

为了更大的提高算力以及资源分配,多个提供者还是有必要的。

两个提供者,一个8001,一个8002;配置一样,除了端口号,需要更改的只有端口号

消费者80需要更改部分较多

  1. 在指定路径的Controller中,需要重新定义地址
//    public static final String PAYMNT_URL = "http://localhost:8001";// 单机
/**
     * 按照集群来说明地址的话,需要按照Eureka中的注册服务名来作为地址
     * CLOUD-PAYMENT-SERVICE
     */
public static final String PAYMNT_URL = "http://CLOUD-PAYMENT-SERVICE";// 集群
  1. 在集群中,只需要填写提供者在Eureka的服务名
    请注意这里还不是完成,我们需要开启负载均衡技术,因为规定了地址后,Eureka不会帮你去找提供者来处理请求,如果不开启将会报错
  2. 需要在消费者ApplicatonContextConfig类中找到RestTemplate模板的获取点,添加上**@LoadBalanced**注解赋予RestTemplate模板负载均衡技术
@Configuration
public class ApplicatonContextConfig {
    /**
     * 获得RestTemplate;通过注解方式注入进IOC中
     *
     * @return
     */
    @Bean
    @LoadBalanced// 开启负载均衡
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

5. 服务发现和Eureka自我保护

5.1 服务发现

  • 我们可用在提供者上设置服务发现,这样可以在Eureka中可以暴露提供者的信息
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
@Resource
private DiscoveryClient discoveryClient;// 将自身暴露出去
/**
     * 暴露关于自身服务的地址
     * @return
     */
@GetMapping("/discovery")
public Object discovery(){
    List<String> services = discoveryClient.getServices();
    for (String service : services) {
        log.info("******element"+service);
    }
    List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
    for (ServiceInstance instance : instances) {
        log.info(instance.getInstanceId()+" + "+instance.getHost()+" + "+instance.getPort()+" + "+instance.getUri());
    }
    return this.discoveryClient;
}

同时,再服务启动类上需要添加**@EnableEurekaClient**注解

5.2 Eureka自我保护

  • 保护模式主要用于一组客户端与EurekaServer之间存在网络分区场景下的保护,一旦进入保护模式,EurekaServer将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务。

5.3 为什么会产生Eureka自我保护机制?

为了防止EurekaClient可以正常运行,但是与EurekaServer网络不通的情况下,EurekaServer不会立刻将EurekaClient服务剔除

5.4 什么是自我保护模式?

默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务和EurekaServer之间是无法通信的,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。Eureka通过“自我保护模式“来解决这个问题——当EurekaServer节点在短时间内丢失过多客户端时,那么这个节点就会进行自我保护模式

在自我保护模式中,EurekaServer会保护服务注册表中的信息,不再注销任何服服务实例

它的设计理念就是宁可保留错误的服务注册比信息,也不盲目注销任何可能健康的服务实例

综上,自我保护模式是一种应对网络异常的安全保护措施。它的架构理念是宁可同时保留所有微服务也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加健壮、稳定

5.5 关闭自我保护模式

修改提供者和注册中心的配置文件

  • 提供者:
########################### Eureka ##################################
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    # 在server里,service-url直接填写地址,但在client中需要添加defaultZone
    service-url:
      defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka
  instance:
    instance-id: payment8001
    prefer-ip-address: true
    # Eureka客户端向服务端发送心跳的时间间隔,单位为秒
    lease-renewal-interval-in-seconds: 1 # 一秒钟;默认30秒
    # Eureka服务器在收到最后一次心跳后等待时间上线,单位为秒(默认90秒),超时将删除服务
    lease-expiration-duration-in-seconds: 2
  • 注册中心
server:
  port: 7002
eureka:
  instance:
    #hostname: localhost # eureka服务端的实例名称
    hostname: eureka7002.com # eureka集群
  client:
    fetch-registry: false # 不去检索服务
    register-with-eureka: false # 不向注册中注册自己
    # 设置Eurekaserve交互的地址查询服务和注册服务都需要依赖这个地址
    #server-url: http://${eureka.instance.hostname}:${server.port}/eureka/
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka # eureka集群配置,需要集群其他内容
 #########################################################################
  server:
    enable-self-preservation: false # 禁用自我保护模式
    eviction-interval-timer-in-ms: 20000

6. Zookeeper

server:
  port: 8004
#### 连接zookeeper
spring:
  application:
    name: cloud-provider-payment
  cloud:
    zookeeper:
      connect-string: 192.168.21.128:2181 # zookeeper连接地址

其他配置与Eureka没有区别。

7. 注册中心的异同点:

组件名 语言 CAP 服务健康检查 对外暴露接口 SpringCloud集成
Eureka JAVA AP 可配支持 HTTP 集成
Consul GO CP 支持 HTTP/DNS 集成
Zookeeper JAVA CP 支持 客户端 集成
  • CAP:
  1. C —— Consistency(强一致性性)
  2. A —— Availability(可用性)
  3. P —— Partition tolerance(分区容错性)

在CAP中,最多只能同时较好的满足两个需求,不是AP就是CP

CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性、可用性、和分区容错性这三个需求

因此,根据CAP原理将NoSQL数据库分成了满足CA原则、满足CP原则和满足AP原则三大类

  1. CA —— 单点集群,满足一致性,可用性的系统,通常在可扩展性不太强大
  2. CP —— 满足一致性和分区容错性的系统,通信性能不是特别高
  3. AP —— 满足可用性,分区容错性的系统,通常可能对一致性要求低一些

7.1 AP

7.2 CP

🥸🏏SpringCloud微服务专栏

  1. 【SpringCloud(1)】初识微服务架构:创建一个简单的微服务;java与Spring与微服务;初入RestTemplate

💕👉博客专栏

目录
相关文章
|
29天前
|
算法 Java 微服务
【SpringCloud(1)】初识微服务架构:创建一个简单的微服务;java与Spring与微服务;初入RestTemplate
微服务架构是What?? 微服务架构是一种架构模式,它提出将单一应用程序划分为一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。 每个服务允许在其独立的进程中,服务于服务间采用轻量级的通信机制互相协作(通常是Http协议的RESTful API或RPC协议)。 每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。另外应当尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据上下文,选择合适的语言、工具对其进行构建
381 126
|
3月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
563 3
|
23天前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
2月前
|
监控 安全 Java
Spring Cloud 微服务治理技术详解与实践指南
本文档全面介绍 Spring Cloud 微服务治理框架的核心组件、架构设计和实践应用。作为 Spring 生态系统中构建分布式系统的标准工具箱,Spring Cloud 提供了一套完整的微服务解决方案,涵盖服务发现、配置管理、负载均衡、熔断器等关键功能。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
163 1
|
2月前
|
jenkins Java 持续交付
使用 Jenkins 和 Spring Cloud 自动化微服务部署
随着单体应用逐渐被微服务架构取代,企业对快速发布、可扩展性和高可用性的需求日益增长。Jenkins 作为领先的持续集成与部署工具,结合 Spring Cloud 提供的云原生解决方案,能够有效简化微服务的开发、测试与部署流程。本文介绍了如何通过 Jenkins 实现微服务的自动化构建与部署,并结合 Spring Cloud 的配置管理、服务发现等功能,打造高效、稳定的微服务交付流程。
322 0
使用 Jenkins 和 Spring Cloud 自动化微服务部署
|
2月前
|
Kubernetes Java 微服务
Spring Cloud 微服务架构技术解析与实践指南
本文档全面介绍 Spring Cloud 微服务架构的核心组件、设计理念和实现方案。作为构建分布式系统的综合工具箱,Spring Cloud 为微服务架构提供了服务发现、配置管理、负载均衡、熔断器等关键功能的标准化实现。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
349 0
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
239 2
|
5月前
|
负载均衡 Java API
基于 Spring Cloud 的微服务架构分析
Spring Cloud 是一个基于 Spring Boot 的微服务框架,提供全套分布式系统解决方案。它整合了 Netflix、Zookeeper 等成熟技术,通过简化配置和开发流程,支持服务发现(Eureka)、负载均衡(Ribbon)、断路器(Hystrix)、API网关(Zuul)、配置管理(Config)等功能。此外,Spring Cloud 还兼容 Nacos、Consul、Etcd 等注册中心,满足不同场景需求。其核心组件如 Feign 和 Stream,进一步增强了服务调用与消息处理能力,为开发者提供了一站式微服务开发工具包。
560 0
|
11月前
|
JSON Java API
利用Spring Cloud Gateway Predicate优化微服务路由策略
Spring Cloud Gateway 的路由配置中,`predicates`​(断言)用于定义哪些请求应该匹配特定的路由规则。 断言是Gateway在进行路由时,根据具体的请求信息如请求路径、请求方法、请求参数等进行匹配的规则。当一个请求的信息符合断言设置的条件时,Gateway就会将该请求路由到对应的服务上。
884 69
利用Spring Cloud Gateway Predicate优化微服务路由策略

热门文章

最新文章