理想论坛_专业20年的财经股票炒股论坛交流社区 - 股票论坛

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

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

[复制链接]

9650

主题

9650

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

在源码分析三、四都有说起到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|手机版|小黑屋|理想论坛_专业20年的财经股票炒股论坛交流社区 - 股票论坛

GMT+8, 2020-7-12 17:45 , Processed in 0.156278 second(s), 29 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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