海安零距离 海安论坛 海安新闻 海安

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2060|回复: 0

【一起学源码-微服务】Nexflix Eureka 源码五:EurekaClient启动要经历哪些

[复制链接]

6234

主题

6234

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
18716
发表于 2019-12-27 14:44 | 显示全部楼层 |阅读模式
前言

在源码分析三、四都有提及到EurekaClient启动的一些过程。由于EurekaServer在集群模式下 本身本身就是一个client,所以之前初始化eurekaServerContext就有涉及到eurekaClient的初始化。
我们也看了EurekaClient(DiscoveryClient)初始化的过程,繁杂的启动过程让人眼花缭乱,这篇文章就专门来唠唠 内里履历的一些艰巨险阻。这也会是后面client注册的一个前置文章。
如若转载 请标明泉源:一枝花算不算浪漫
从ExampleEurekaClient开始提及

在第一讲我们就说过,eureka项目有一个examples模块的,如今看一下此中的EurekaClientExample对象:
  1. public class ExampleEurekaClient {    private static ApplicationInfoManager applicationInfoManager;    private static EurekaClient eurekaClient;    private static synchronized ApplicationInfoManager initializeApplicationInfoManager(EurekaInstanceConfig instanceConfig) {        if (applicationInfoManager == null) {            InstanceInfo instanceInfo = new EurekaConfigBasedInstanceInfoProvider(instanceConfig).get();            applicationInfoManager = new ApplicationInfoManager(instanceConfig, instanceInfo);        }        return applicationInfoManager;    }    private static synchronized EurekaClient initializeEurekaClient(ApplicationInfoManager applicationInfoManager, EurekaClientConfig clientConfig) {        if (eurekaClient == null) {            eurekaClient = new DiscoveryClient(applicationInfoManager, clientConfig);        }        return eurekaClient;    }    public void sendRequestToServiceUsingEureka(EurekaClient eurekaClient) {        // initialize the client        // this is the vip address for the example service to talk to as defined in conf/sample-eureka-service.properties        String vipAddress = "sampleservice.mydomain.net";        InstanceInfo nextServerInfo = null;        try {            nextServerInfo = eurekaClient.getNextServerFromEureka(vipAddress, false);        } catch (Exception e) {            System.err.println("Cannot get an instance of example service to talk to from eureka");            System.exit(-1);        }        System.out.println("Found an instance of example service to talk to from eureka: "                + nextServerInfo.getVIPAddress() + ":" + nextServerInfo.getPort());        System.out.println("healthCheckUrl: " + nextServerInfo.getHealthCheckUrl());        System.out.println("override: " + nextServerInfo.getOverriddenStatus());        Socket s = new Socket();        int serverPort = nextServerInfo.getPort();        try {            s.connect(new InetSocketAddress(nextServerInfo.getHostName(), serverPort));        } catch (IOException e) {            System.err.println("Could not connect to the server :"                    + nextServerInfo.getHostName() + " at port " + serverPort);        } catch (Exception e) {            System.err.println("Could not connect to the server :"                    + nextServerInfo.getHostName() + " at port " + serverPort + "due to Exception " + e);        }        try {            String request = "FOO " + new Date();            System.out.println("Connected to server. Sending a sample request: " + request);            PrintStream out = new PrintStream(s.getOutputStream());            out.println(request);            System.out.println("Waiting for server response..");            BufferedReader rd = new BufferedReader(new InputStreamReader(s.getInputStream()));            String str = rd.readLine();            if (str != null) {                System.out.println("Received response from server: " + str);                System.out.println("Exiting the client. Demo over..");            }            rd.close();        } catch (IOException e) {            e.printStackTrace();        }    }    public static void main(String[] args) throws Exception{        injectEurekaConfiguration();        ExampleEurekaClient sampleClient = new ExampleEurekaClient();        // MyDataCenterInstanceConfig 就是加载eureka-client.properties设置信息,形成一个服务实例的设置EurekaInstanceConfig        // 基于EurekaClient设置,构造了一个服务实例(InstanceInfo)        // 基于eureka client设置和服务实例,构造了一个服务实例管理器(ApplicationInfoManager)        // 读取eureka-client.properties设置文件,形成了一个eureka client的设置,接口对外提供eureka client的设置项的读取        // 基于eureka client的设置,和服务实例管理器,来构造了一个EurekaClient(DiscoveryClient        // ),生存了一些设置,处理惩罚服务的注册和注册表的抓取,启动了几个线程池,启动了网络通讯组件,启动了一些调治使命,注册了监控项        ApplicationInfoManager applicationInfoManager = initializeApplicationInfoManager(new MyDataCenterInstanceConfig());        EurekaClient client = initializeEurekaClient(applicationInfoManager, new DefaultEurekaClientConfig());        // use the client        sampleClient.sendRequestToServiceUsingEureka(client);        // shutdown the client        eurekaClient.shutdown();    }    /**     * This will be read by server internal discovery client. We need to salience it.     */    private static void injectEurekaConfiguration() throws UnknownHostException {        String myHostName = InetAddress.getLocalHost().getHostName();        String myServiceUrl = "http://" + myHostName + ":8080/v2/";        System.setProperty("eureka.region", "default");        System.setProperty("eureka.name", "eureka");        System.setProperty("eureka.vipAddress", "eureka.mydomain.net");        System.setProperty("eureka.port", "8080");        System.setProperty("eureka.preferSameZone", "false");        System.setProperty("eureka.shouldUseDns", "false");        System.setProperty("eureka.shouldFetchRegistry", "true");        System.setProperty("eureka.serviceUrl.defaultZone", myServiceUrl);        System.setProperty("eureka.serviceUrl.default.defaultZone", myServiceUrl);        System.setProperty("eureka.awsAccessId", "fake_aws_access_id");        System.setProperty("eureka.awsSecretKey", "fake_aws_secret_key");        System.setProperty("eureka.numberRegistrySyncRetries", "0");    }}
复制代码
这里我们从main函数开始看起:

  • 注入eureka设置信息:injectEurekaConfiguration();
  • 读取eureka-client.properties设置文件,形成一个服务器实例的设置,基于接口对外提供实例的设置项读取
    这里就是涉及到我么你之前讲解的DynamicPropertyFactory和ConfigurationManager,这里可以查察new MyDataCenterInstanceConfig()然后一步步以后跟。
  • 基于服务实例的设置,构造了一个服务实例(InstanceInfo)。initializeApplicationInfoManager中会构建InstanceInfo信息
  • 基于服务实例的设置和服务实例,初始化服务实例管理器(ApplicationInfoManager)
  • 基于eureka client设置,和服务实例管理器,来构造了一个EurekaClient(DiscoveryClient),生存了一些设置,处理惩罚服务的注册和注册表的抓取,启动了几个线程池,启动了网络通讯组件,启动了一些调治使命,注册了监控项
    具体可查察 EurekaClient client = initializeEurekaClient(applicationInfoManager, new DefaultEurekaClientConfig());
流程图


说明

本文章首发自本人博客:https://www.cnblogs.com/wang-meng 和公众号:壹枝花算不算浪漫,如若转载请标明泉源!
感爱好的小同伴可关注个人公众号:壹枝花算不算浪漫


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|深圳论坛-深圳人的网上家园  

GMT+8, 2020-5-31 21:13 , Processed in 0.126338 second(s), 30 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表