0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Eureka Client的创建案例

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-09 17:03 次阅读

在上篇中已经讲了 Eureka Server 的配置文件读取。接下来讲讲 Eureka Client 的创建。每一个 eureka server 都是一个 eureka client,是用来和其他 eureka-server 节点注册和通信的。

EurekaInstanceConfig & EurekaClientConfig

Instance 是实例的意思, EurekaInstanceConfig 就是 eureka client 的配置文件中的服务实例信息

EurekaInstanceConfig instanceConfig = isCloud(ConfigurationManager.getDeploymentContext())
                    ? new CloudInstanceConfig()
                    : new MyDataCenterInstanceConfig();

applicationInfoManager = new ApplicationInfoManager(
        instanceConfig, new EurekaConfigBasedInstanceInfoProvider(instanceConfig).get());

EurekaClientConfig eurekaClientConfig = new DefaultEurekaClientConfig();

EurekaInstanceConfig 就是将 eureka-client.properties 文件中的服务实例信息加载到 ConfigManager 中,然后基于 EurekaInstanceConfig 对外暴露接口,并且提供配置项的默认值。

图片

ApplicationInfoManager,包含了服务实例的信息、配置,作为服务实例管理的一个组件,由 EurekaInstanceConfig 和 InstanceInfo 构建完成,InstanceInfo 的创建是在 new EurekaConfigBasedInstanceInfoProvider(instanceConfig).get() 中,用了构造器模式 LeaseInfo.Builder.newBuilder() 构造了一个复杂的代表一个服务实例的 InstanceInfo 对象。核心思想就是在 EurekaInstanceConfig 中读取各种实例相关的配置信息,再构造了一些其他的对象,最终完成 InstanceInfo 对象的构建。

public synchronized InstanceInfo get() {
    if (instanceInfo == null) {
        // Build the lease information to be passed to the server based on config
        LeaseInfo.Builder leaseInfoBuilder = LeaseInfo.Builder.newBuilder()
                .setRenewalIntervalInSecs(config.getLeaseRenewalIntervalInSeconds())
                .setDurationInSecs(config.getLeaseExpirationDurationInSeconds());

        if (vipAddressResolver == null) {
            vipAddressResolver = new Archaius1VipAddressResolver();
        }
        //代码太长,省略其他代码
    }
}

DefaultEurekaClientConfig 就是和 DefaultEurekaServerConfig 一样,读取 erueka-client.properties 配置文件的内容。具体方法在 com.netflix.discovery.internal.util.initConfig() 中。最后都是交给 ConfigurationManager 管理。

EurekaInstanceConfig 和 EurekaClientConfig 虽然都是读取的 erueka-client.propeties ,但是读取的内容是不一样的。

EurekaInstanceConfig 接口

图片EurekaClientConfig 接口

图片

DiscoveryClient

DiscoveryClient 是创建 Erueka Client 的类,由 ApplicationInfoManager 和 EurekaClientConfig 组成。

eurekaClient = new DiscoveryClient(applicationInfoManager, eurekaClientConfig);

DiscoveryClient 代码很长。

  1. appPathIdentifier,服务实例的标识符, appName,代表了一个服务名称,但是一个服务可能部署多台机器,每台机器上部署的就是一个服务实例,如:serviceABC/001
appPathIdentifier = instanceInfo.getAppName() + "/" + instanceInfo.getId();
  1. 是否需要注册到别的注册中心。eurekaServer 有个配置:eureka.client.fetchRegistry,单机情况下为 false。false 表示自己就是注册中心。职责就是维护服务实例,并不需要去检索服务。
if (!config.shouldRegisterWithEureka() && !config.shouldFetchRegistry()) {}
  1. 支持调度的线程池。
scheduler = Executors.newScheduledThreadPool(2,
        new ThreadFactoryBuilder()
                .setNameFormat("DiscoveryClient-%d")
                .setDaemon(true)
                .build());
  1. 支持心跳的线程池。
heartbeatExecutor = new ThreadPoolExecutor(
            1, clientConfig.getHeartbeatExecutorThreadPoolSize(), 0, TimeUnit.SECONDS,
            new SynchronousQueue< Runnable >(),
            new ThreadFactoryBuilder()
                    .setNameFormat("DiscoveryClient-HeartbeatExecutor-%d")
                    .setDaemon(true)
                    .build()
    );
  1. 支持缓存刷新的线程池。
cacheRefreshExecutor = new ThreadPoolExecutor(
            1, clientConfig.getCacheRefreshExecutorThreadPoolSize(), 0, TimeUnit.SECONDS,
            new SynchronousQueue< Runnable >(),
            new ThreadFactoryBuilder()
                    .setNameFormat("DiscoveryClient-CacheRefreshExecutor-%d")
                    .setDaemon(true)
                    .build()
    );
  1. 支持底层的 eureka client 和 eureka server 进行通信的组件。
eurekaTransport = new EurekaTransport();
  1. 初始化调度任务。
initScheduledTasks();

总结

先创建了 EurekaInstanceConfig,基于 EurekaInstanceConfig 和 InstanceInfo 创建 ApplicationInfoManager,之后才创建 DiscoveryClient。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    7970

    浏览量

    149243
  • 文件
    +关注

    关注

    1

    文章

    541

    浏览量

    24467
  • 代码
    +关注

    关注

    30

    文章

    4601

    浏览量

    67335
  • eureka
    +关注

    关注

    0

    文章

    4

    浏览量

    1751
收藏 人收藏

    评论

    相关推荐

    请问while循环中是怎么调用tcp_client_senddata()和tcp_client_recv()发送接收数据的?

    在这个while循环中,是怎么调用tcp_client_senddata()和tcp_client_recv()发送接收数据的?是要等到创建一个新的pcb?while(res==0){ key
    发表于 06-28 02:29

    怎样实现创建TCP Server后连接多个Client

    版主你好,请问使用UCOS3+LWIP时,怎样实现创建TCP Server后,连接多个Client,然后能在每个Client之间进行不同数据格式的收发?比如我有2个设备需要连接407,但是都只能通过一个网口,是否再开一个任务?谢
    发表于 09-26 00:51

    Symantec Client Security使用入门

    Symantec Client Security使用入门 Symantec Client Security 為工作站提供可調整、跨平台的防火牆、入侵偵測,以及防毒保護,並為網路伺服器提供防毒保護。您可以建
    发表于 06-10 17:11 7次下载

    CLient相关资料

    CLient,好东西,喜欢的朋友可以下载来学习。
    发表于 02-19 17:00 0次下载

    Eureka的集群搭建方法-保证高可用

    在微服务架构中,注册中心是一个必不可少的组件 前面我们搭建的注册中心只适合本地开发使用,在生产环境必须搭建一个集群来保证高可用 Eureka的集群搭建很简单,每一台Eureka都需要在配置中指定另外N个Eureka的地址就可以。
    发表于 11-29 10:41 7452次阅读
    <b class='flag-5'>Eureka</b>的集群搭建方法-保证高可用

    ApiBoot Logging整合Spring Cloud Eureka负载均衡上报日志

    ApiBoot Logging支持整合服务注册中心(Eureka、Consul、Nacos Discovery、Zookeeper...)进行上报请求日志,Logging Client会从服务注...
    的头像 发表于 12-10 22:08 306次阅读

    如何使用kubernetes client-go实践一个简单的与K8s交互过程

    【导读】Kubernetes项目使用Go语言编写,对Go api原生支持非常便捷。 本篇文章介绍了如何使用kubernetes client-go实践一个简单的与K8s交互过程
    的头像 发表于 02-02 11:16 6323次阅读
    如何使用kubernetes <b class='flag-5'>client</b>-go实践一个简单的与K8s交互过程

    danmu-client弹幕客户端

    ./oschina_soft/danmu-client.zip
    发表于 06-01 10:24 1次下载
    danmu-<b class='flag-5'>client</b>弹幕客户端

    VB6 OPC Client文件分享

    VB6 OPC Client文件分享
    发表于 08-28 10:20 0次下载

    LabVIEW Actor Framwork:边学边做server和client

    现在要做一个类似聊天的demo,一个server端,若干个client端;首先是server启动,通过server可以打开若干个client端,然后每个client可以独立给server发送数据。server收到数据打印出来带有
    的头像 发表于 06-01 15:49 1080次阅读
    LabVIEW Actor Framwork:边学边做server和<b class='flag-5'>client</b>

    I2C控制器节点创建

    节点创建 i2c_add_adapter、i2c_add_numbered_adapter 是注册 i2c_adapter,这两个 API 最终是调用 i2c_register_adapter
    的头像 发表于 07-22 15:42 532次阅读
    I2C控制器节点<b class='flag-5'>创建</b>

    基于MM32F3270以太网Client使用

    基于MM32F3270以太网Client使用
    的头像 发表于 09-27 15:44 512次阅读
    基于MM32F3270以太网<b class='flag-5'>Client</b>使用

    Eureka Server面向接口的方式读取配置文件

    eureka sersver 配置环境 在上一篇中已经介绍了,spring boot 是调用 类的 方法启动 Eureka Server 的。 public void
    的头像 发表于 10-09 17:05 382次阅读
    <b class='flag-5'>Eureka</b> Server面向接口的方式读取配置文件

    Spring Boot启动 Eureka流程

    在上篇中已经说过了 Eureka-Server 本质上是一个 web 应用的项目,今天就来看看 Spring Boot 是怎么启动 Eureka 的。 Spring Boot 启动 Eureka
    的头像 发表于 10-10 11:40 512次阅读
    Spring Boot启动 <b class='flag-5'>Eureka</b>流程

    Eureka!NVIDIA 研究突破为机器人学习注入新动力

    AI 智能体利用 LLM 自动生成奖励算法,训练机器人完成复杂任务。 NVIDIA Research 开发的一款名为 Eureka 的新型 AI 智能体可以教机器人复杂的技能,它教会了机器人
    的头像 发表于 10-25 15:55 155次阅读
    <b class='flag-5'>Eureka</b>!NVIDIA 研究突破为机器人学习注入新动力