服务注册与服务发现

这篇具有很好参考价值的文章主要介绍了服务注册与服务发现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

服务注册与服务发现

Eureka的架构

Eureka客户端:使用了@EnableEurekaClient注解的应用服务,如订单服务等,甚至Eureka本身也是一个客户端
Eureka服务端:使用了@EnableEurekaServer注解的应用服务,该服务提供了注册表以及对服务节点的操作
服务提供者:服务启动后,可以向注册中心发起register请求,将服务信息注册进去
服务消费者:服务启动后,可以从注册中心拉取服务信息,并根据所得的服务信息调用服务
他们之间的关系为:
Eureka-server你可以当作他是一个单独的服务,而跟它对接的都是Eureka-client,而Eureka-client中则包含了服务消费者和服务提供者等角色。例如订单服务中包含一个消费者A,商品服务中包含一个提供者B,现在消费者A想查询该订单对应的商品信息,那就是查询提供者B的服务,那么首先A和B都必须先把自己作为一个eureka客户端,然后B将自己的服务信息发送到eureka的服务端中,A再从eureka服务端中拉取B的服务信息(地址),然后发起请求。

服务端

所需依赖

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

启动服务时需要添加两个注解

@EnableEurekaServer
@SpringBootApplication

客户端

所需依赖

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

启动服务需要配置

@EnableEurekaClient
@SpringBootApplication

关系

1、服务提供者、服务消费者、服务发现组件三者之间的关系大致如下:
1)各个微服务在启动时时,将自己的网络地址等信息注册到服务发现组件上(eureka,zookeeper,Consul,spring cloud alibaba的nacos),服务发现组件会存储这些信息。
2)服务消费者会从服务发现组件查询服务提供者的网络地址,然后将服务地址列表缓存到本地,然后根据服务名负载均衡调用服务提供者的接口。
3)各个微服务与服务发现组件使用一定的机制来维持心跳,服务发现组件若发现有服务没有提供心跳,那么服务发现组件会将该服务剔除。
4)微服务网络地址发生变更(例如实例增减或者IP端口发生变化等),会重新注册到服务发现组件上,使用这种方式,可以避免因网络变化导致服务之间的通讯停止,服务消费者也无须人工的修改网络地址。

Eureka简介

Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。
1.Eureka包含两个组件:Eureka Server和Eureka Client。
Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询负载算法的负载均衡器。
2.在应用启动后,Eureka Client会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。
3.Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。

三、Eureka一些特性及配置过程时需要注意的问题
1.Eureka能够保证AP,即当Eureka中的某个节点挂掉后,剩余的节点继续仍然可以提供服务的发现与注册服务。而Eureka的客户端在向某个Eureka或者发现了当前的Eureka不可用时,会自动切换到其他的节点,也就是说Eureka的节点是平等的,只要有一台Eureka服务器在,就能保证服务的可以继续被使用。
2.Eureka的自我保护机制,我们在注册服务时,如发生断网的情况,Eureka不能接收到当前服务的任何心跳请求,Eureka会在默认的90s后,将该服务进行强制剔除,这样就能保证到网络故障时,虽然失去了部分节点,但不会像zookeeper那样会使整个注册服务瘫痪。当网络稳定时,新的实例会同步到其他节点中。
3.相关配置问题
服务端的配置如下,不注册自身

security:
  basic:
    enabled: true
  user:
    name: user
    password: password123
eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://user:password123@localhost:8761/eureka

引入依赖

<!-- eureka-server-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
    <version>1.2.3.RELEASE</version>
</dependency>
 <!--eureka-client-->
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-eureka</artifactId>
     <version>1.2.3.RELEASE</version>
</dependency>

Eureka客户端应用服务注册流程

1、应用集成eureka客户端依赖,配置eureka相关信息;
2、当应用启动完成后,应用会自动向eureka-server服务发请求,将自身的示例信息注册到eureka-server;
3、会启动心跳进程和服务状态检测时间;心跳每隔30s一次;应用服务状态发生变更,也会想eureka-server服务进行服务重新注册;
4、当应用服务进行关闭时,会调用shutdown方法,进行服务下线的操作;当服务因断电/网络问题/意外停机,无法正确的下线服务时,这时心跳就会起到相对应的作用,如果eureka-server服务发现应用超过三次(90s)没有心跳,那么就会将服务进行保护/下线;

源码分析

源码分析:
应用在服务启动时自动注册的实现:配置类:EurekaClientAutoConfiguration里面向IOC容器内注册了EurekaAutoServiceRegistration.class对象

@Bean
@ConditionalOnBean(AutoServiceRegistrationProperties.class)
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true)
public EurekaAutoServiceRegistration eurekaAutoServiceRegistration(ApplicationContext context, EurekaServiceRegistry registry,
                                                                       EurekaRegistration registration) {
    return new EurekaAutoServiceRegistration(context, registry, registration);
}

EurekaAutoServiceRegistration.class实现了SmartLifecycle.class
SmartLifecycle.class这个类是在应用启动后,自动调用start()

@Override
public void start() {
    // 端口配置
    if (this.port.get() != 0) {
           if (this.registration.getNonSecurePort() == 0) {
                this.registration.setNonSecurePort(this.port.get());
           }
            if (this.registration.getSecurePort() == 0 && this.registration.isSecure()) {
                this.registration.setSecurePort(this.port.get());
            }
        }

        // only initialize if nonSecurePort is greater than 0 and it isn't already running
        // because of containerPortInitializer below
         if (!this.running.get() && this.registration.getNonSecurePort() > 0) {
          // 进行主动注册
            this.serviceRegistry.register(this.registration);
            // 发布注册事件
            this.context.publishEvent(
                   new InstanceRegisteredEvent<>(this, this.registration.getInstanceConfig()));
            this.running.set(true);
         }
    }

EurekaServiceRegistry#register() 注册代码如下:

@Override
public void register(EurekaRegistration reg) {
     maybeInitializeClient(reg);
     if (log.isInfoEnabled()) {
          log.info("Registering application " + reg.getApplicationInfoManager().getInfo().getAppName()
              + " with eureka with status "
              + reg.getInstanceConfig().getInitialStatus());
     }
     reg.getApplicationInfoManager()
        .setInstanceStatus(reg.getInstanceConfig().getInitialStatus());
      // 进行注册健康检查
     reg.getHealthCheckHandler().ifAvailable(healthCheckHandler ->
     reg.getEurekaClient().registerHealthCheck(healthCheckHandler));
}

进行安全健康检查同时注册信息 DiscoveryClient#registerHealthCheck()

@Override
    public void registerHealthCheck(HealthCheckHandler healthCheckHandler) {
        if (instanceInfo == null) {
            logger.error("Cannot register a healthcheck handler when instance info is null!");
        }
        if (healthCheckHandler != null) {
            this.healthCheckHandlerRef.set(healthCheckHandler);
            // schedule an onDemand update of the instanceInfo when a new healthcheck handler is registered
            if (instanceInfoReplicator != null) {
                // 进行注册
                instanceInfoReplicator.onDemandUpdate();
            }
        }
    }

在上述的onDemandUpdate()方法中有个register方法,代码如下
DiscoveryClient#register()

boolean register() throws Throwable {
        logger.info(PREFIX + "{}: registering service...", appPathIdentifier);
        EurekaHttpResponse<Void> httpResponse;
        try {            // 发请求给配置url进行注册 
            httpResponse = eurekaTransport.registrationClient.register(instanceInfo);
        } catch (Exception e) {
            logger.warn(PREFIX + "{} - registration failed {}", appPathIdentifier, e.getMessage(), e);
            throw e;
        }
        if (logger.isInfoEnabled()) {
            logger.info(PREFIX + "{} - registration status: {}", appPathIdentifier, httpResponse.getStatusCode());
        }
        // 返回204码代表注册成功
        return httpResponse.getStatusCode() == 204;
    }

AbstractJerseyEurekaHttpClient#register()文章来源地址https://www.toymoban.com/news/detail-709475.html

@Override
public EurekaHttpResponse<Void> register(InstanceInfo info) {
   String urlPath = "apps/" + info.getAppName();
   ClientResponse response = null;
   try {
       Builder resourceBuilder = jerseyClient.resource(serviceUrl).path(urlPath).getRequestBuilder();
       addExtraHeaders(resourceBuilder);
       response = resourceBuilder.header("Accept-Encoding", "gzip").type(MediaType.APPLICATION_JSON_TYPE).accept(MediaType.APPLICATION_JSON).post(ClientResponse.class, info);
       return anEurekaHttpResponse(response.getStatus()).headers(headersOf(response)).build();
    } finally {
       if (logger.isDebugEnabled()) {
            logger.debug("Jersey HTTP POST {}/{} with instance {}; statusCode={}", serviceUrl, urlPath, info.getId(), response == null ? "N/A" : response.getStatus());
     }
     if (response != null) {
          response.close();
      }
   }
}

到了这里,关于服务注册与服务发现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微服务之SpringCloud服务注册与发现

    目录 一,前言 二,Eureka实现服务注册与发现 单机Eureka服务注册流程 集群模式搭建模拟 Eureka自我保护机制 三,Zookeeper实现服务注册与发现 四,Consul是实现服务注册与发现 基本简介 安装 服务注册测试 ​五,三个注册中心的异同点 什么是服务治理 Spring Cloud 封装了Netflix公司

    2024年02月02日
    浏览(45)
  • 微服务注册与发现——Eureka

    服务发现(注册)机制 nodejs的Eureka Client开源实现 服务发现组件具备功能: 服务注册表 服务注册与服务发现 服务检查 Eureka架构图 http://localhost:8761/ 微服务工程添加引用 注意添加版本号,否则会下载不下来 增加配置 启动类增加注解 启动服务注册 防止因Eureka Server宕机导致微

    2024年02月04日
    浏览(48)
  • Consul服务注册发现集群搭建

    Consul 是一种用于服务发现、配置和分布式一致性的开源工具和平台。它由 HashiCorp 公司开发和维护,旨在简化构建和维护分布式系统的任务。 Consul 提供了许多功能,包括: 服务发现 :Consul允许服务注册和发现。当服务启动时,它可以向Consul注册自己的位置和元数据。其他服

    2024年04月08日
    浏览(41)
  • docker consul 服务注册与发现

    Docker consul的容器服务更新与发现 ------------------------------------ Consul ------------------------------------ (1)什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接

    2024年02月09日
    浏览(45)
  • springcloud Eureka服务注册与发现

    代码上传到 :https://github.com/13thm/study_springcloud/tree/main/days3 什么是服务治理 Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理 什么是服务注册与发现 Eureka采用了CS的设计架构,Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使

    2024年01月18日
    浏览(69)
  • Choerodon 的微服务之路(三):服务注册与发现

    ▌文章的主要内容包括: 服务注册/发现 服务注册表 健康检查 在上一篇文章的开始,我们提到解决微服务架构中的通信问题,基本只要解决下面三个问题: 服务网络通信能力 服务间的数据交互格式 服务间如何相互发现与调用 网络的互通保证了服务之间是可以通信的,通过

    2024年02月21日
    浏览(41)
  • RPC框架引入zookeeper服务注册与服务发现

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是大数据生态中的重要组件。它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提

    2024年02月14日
    浏览(45)
  • 微服务·架构组件之服务注册与发现-Nacos

    Nacos服务注册与发现流程 服务注册:Nacos 客户端会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。 Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。 服务心跳:在服务注册后,Nacos Client会维

    2024年02月02日
    浏览(44)
  • 微服务 – Spring Cloud – Nacos服务注册、发现

    1、引入依赖 父pom依赖 子pom依赖 2、配置文件 3、主启动类 第三部完成 打开nacos 在服务列表即可看到注册进来的服务. 4、业务类 写一个接口供服务发现者使用 1、引入依赖 2、配置文件 3、主启动类 打开nacos 在服务列表即可看到注册进来的服务. 4、发现第一个服务 并调用第一

    2024年02月11日
    浏览(87)
  • 【SpringCloud微服务】- Eureka服务注册与服务发现Discovery

    Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。 SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。 Eureka包含两个组件: Eureka Server 和 E

    2024年02月03日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包