zoukankan      html  css  js  c++  java
  • Eureka 的 Application Client client的执行演示样例

            上篇以一个 demo 演示样例介绍了 Eureka 的 Application Service 客户端角色。今天我们继续了解 Eureka 的 Application Client 客户端,以一个简单的交互演示样例,介绍 Application Client 是怎样使用 Eureka 获取 Application Service 实例并发送请求的。
            上篇《Eureka 的 Application Service 客户端的注冊以及执行演示样例》使用了一个 Socket 服务做为 demo,本文演示样例配合该文,将以一个 Socket 客户端对该服务进行请求。
            1. Eureka 服务器启动
            本文 demo 要求 Eureka Server 已经部署好,并已经启动。关于架设步骤參考博客《Linux 下 Eureka 服务器的部署》。
            2. Application Service 服务启动
            直接将《Eureka 的 Application Service 客户端的注冊以及执行演示样例》中的小 demo 跑起来(Socket Server 启动,開始侍服网络请求)。
            3. Application Client 配置文件的编写
            我们的 Application Client 就用官方提供 demo 里的 sampleclient 下的 sample-eureka-client.properties 就可以,当然还要依据实际情况修正一下,比方把 eureka.serviceUrl.default(默认情况下本客户端将要注冊到的 Eureka 服务器):http://serverIP:8080/eureka/v2/
    ###Eureka Client configuration for Sample Eureka Client
    
    
    #Properties based configuration for eureka client. The properties specified here is mostly what the users
    #need to change. All of these can be specified as a java system property with -D option (eg)-Deureka.region=us-east-1
    #For additional tuning options refer <url to go here>
    
    
    
    
    #Region where eureka is deployed -For AWS specify one of the AWS regions, for other datacenters specify a arbitrary string
    #indicating the region.This is normally specified as a -D option (eg) -Deureka.region=us-east-1
    eureka.region=default
    
    
    #Name of the application to be identified by other services
    
    
    eureka.name=sampleEurekaClient
    
    
    #Virtual host name by which the clients identifies this service
    #eureka.vipAddress=eureka.mydomain.net
    
    
    #The port where the service will be running and servicing requests
    #eureka.port=80
    
    
    #For eureka clients running in eureka server, it needs to connect to servers in other zones
    eureka.preferSameZone=true
    
    
    #Change this if you want to use a DNS based lookup for determining other eureka servers. For example
    #of specifying the DNS entries, check the eureka-client-test.properties, eureka-client-prod.properties
    eureka.shouldUseDns=false
    
    
    eureka.us-east-1.availabilityZones=default
    
    
    eureka.serviceUrl.default=http://serverIP:8080/eureka/v2/

            4. 日志配置
            就用官方提供 demo 里的 sampleclient 下的 log4j.properties 就可以,当然还要依据实际须要修正一下,比方给 com.netflix.eureka 包的输出级别设置为 DEBUG(log4j.properties 追加 log4j.logger.com.netflix.eureka=DEBUG),以方便我们研发期跟踪调试。
    log4j.rootCategory=INFO,stdout
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d %-5p %C:%L [%t] [%M] %m%n
    log4j.logger.com.netflix.eureka=DEBUG

            5. 寻找本次请求的 Application Service 实例
            客户端在向 Application Service 请求之前得先从 Eureka Server 拿到侍服本次请求的 Application Service 实例。寻找本次请求的 Application Service 实例的代码例如以下:
            // Register with Eureka
            DiscoveryManager.getInstance().initComponent(
                    new MyDataCenterInstanceConfig(),
                    new DefaultEurekaClientConfig());
            ApplicationInfoManager.getInstance().setInstanceStatus(
                    InstanceStatus.UP);
            String vipAddress = configInstance.getStringProperty(
                    "eureka.vipAddress", "sampleservice.mydomain.net").get();
            InstanceInfo nextServerInfo = DiscoveryManager.getInstance()
                    .getDiscoveryClient()
                    .getNextServerFromEureka(vipAddress, false);

            第一句初始化本客户端,第二句告诉 Eureka 本客户端处于就绪状态,接下来两句是使用 Eureka 找到对本次请求进行侍服的 Application Service 实例。
            6. Application Client 网络请求
            Application Client 拿到 Application Service 之后立刻进行网络 Socket 请求,进行数据信息交互。
            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);
            }
            try {
                System.out.println("Connected to server. Sending a sample request");
                PrintStream out = new PrintStream(s.getOutputStream());
                out.println("Sample request " + new Date());
                String str = null;
                System.out.println("Waiting for server response..");
                BufferedReader rd = new BufferedReader(new InputStreamReader(
                        s.getInputStream()));
                str = rd.readLine();
                if (str != null) {
                    System.out
                            .println("Received response from server. Communication all fine using Eureka :");
                    System.out.println("Exiting the client. Demo over..");
                }
                rd.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

            7. Application Client 关闭时取消注冊
            Application Client 在关闭时要将自己在 Eureka 的注冊取消掉。
        public void unRegisterWithEureka() {
            // Un register from eureka.
            DiscoveryManager.getInstance().shutdownComponent();
        }

            8. 执行 demo
            新建一个项目(不要和 Application Service 的 demo 跑在同一个项目下),如今我们把完整的 Application Client 代码整理一下。
    /*
     * Copyright 2012 Netflix, Inc.
     *
     *    Licensed under the Apache License, Version 2.0 (the "License");
     *    you may not use this file except in compliance with the License.
     *    You may obtain a copy of the License at
     *
     *        http://www.apache.org/licenses/LICENSE-2.0
     *
     *    Unless required by applicable law or agreed to in writing, software
     *    distributed under the License is distributed on an "AS IS" BASIS,
     *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     *    See the License for the specific language governing permissions and
     *    limitations under the License.
     */
    
    
    package com.netflix.eureka;
    
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.net.InetSocketAddress;
    import java.net.Socket;
    import java.util.Date;
    
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    
    import com.netflix.appinfo.ApplicationInfoManager;
    import com.netflix.appinfo.InstanceInfo;
    import com.netflix.appinfo.InstanceInfo.InstanceStatus;
    import com.netflix.appinfo.MyDataCenterInstanceConfig;
    import com.netflix.config.DynamicPropertyFactory;
    import com.netflix.discovery.DefaultEurekaClientConfig;
    import com.netflix.discovery.DiscoveryManager;
    
    
    /**
     * Sample Eureka client that discovers the service using Eureka and sends
     * requests.
     *
     * @author Karthik Ranganathan
     *
     */
    public class SampleEurekaClient {
        private static final DynamicPropertyFactory configInstance = com.netflix.config.DynamicPropertyFactory
                .getInstance();
        
        private static final Logger logger = LoggerFactory
        .getLogger(SampleEurekaClient.class);
    
    
        public void sendRequestToServiceUsingEureka() {
            // Register with Eureka
            DiscoveryManager.getInstance().initComponent(
                    new MyDataCenterInstanceConfig(),
                    new DefaultEurekaClientConfig());
            ApplicationInfoManager.getInstance().setInstanceStatus(
                    InstanceStatus.UP);
            String vipAddress = configInstance.getStringProperty(
                    "eureka.vipAddress", "sampleservice.mydomain.net").get();
            InstanceInfo nextServerInfo = DiscoveryManager.getInstance()
                    .getDiscoveryClient()
                    .getNextServerFromEureka(vipAddress, false);
    
    
            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);
            }
            try {
                System.out.println("Connected to server. Sending a sample request");
                PrintStream out = new PrintStream(s.getOutputStream());
                out.println("Sample request " + new Date());
                String str = null;
                System.out.println("Waiting for server response..");
                BufferedReader rd = new BufferedReader(new InputStreamReader(
                        s.getInputStream()));
                str = rd.readLine();
                if (str != null) {
                    System.out
                            .println("Received response from server. Communication all fine using Eureka :");
                    System.out.println("Exiting the client. Demo over..");
                }
                rd.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            this.unRegisterWithEureka();
        }
    
    
        public void unRegisterWithEureka() {
            // Un register from eureka.
            DiscoveryManager.getInstance().shutdownComponent();
        }
    
    
        public static void main(String[] args) {
            SampleEurekaClient sampleEurekaService = new SampleEurekaClient();
            sampleEurekaService.sendRequestToServiceUsingEureka();
    
    
        }
    
    
    }

            如上篇博客所述一样把各种依赖包加进本文 demo 的 CLASSPATH,然后把第三、四步写好的 sample-eureka-client.properties、log4j.properties 也拷贝进 CLASSPATH,并将 sample-eureka-client.properties 重命名为 config.properties(原因參考上篇博客),接下来就能够执行本文 demo 了。run SampleEurekaClient,日志结果例如以下:
    2014-07-10 11:02:51,860 INFO  com.netflix.config.sources.URLConfigurationSource:125 [main] [<init>] URLs to be used as dynamic configuration source: [file:/D:/javaprojects/test2/bin/config.properties]
    2014-07-10 11:02:51,927 INFO  com.netflix.config.DynamicPropertyFactory:281 [main] [getInstance] DynamicPropertyFactory is initialized with configuration sources: com.netflix.config.ConcurrentCompositeConfiguration@5ca46701
    2014-07-10 11:02:52,060 WARN  com.netflix.appinfo.PropertiesInstanceConfig:349 [main] [init] Cannot find the properties specified : eureka-client. This may be okay if there are other environment specific properties or the configuration is installed with a different mechanism.
    2014-07-10 11:02:52,065 WARN  com.netflix.discovery.DefaultEurekaClientConfig:95 [main] [init] Cannot find the properties specified : eureka-client. This may be okay if there are other environment specific properties or the configuration is installed with a different mechanism.
    2014-07-10 11:02:52,103 INFO  com.netflix.appinfo.providers.EurekaConfigBasedInstanceInfoProvider:79 [main] [get] Setting initial instance status as: STARTING
    2014-07-10 11:02:53,667 INFO  com.netflix.discovery.DiscoveryClient:646 [main] [fetchRegistry] Disable delta property : false
    2014-07-10 11:02:53,667 INFO  com.netflix.discovery.DiscoveryClient:647 [main] [fetchRegistry] Single vip registry refresh property : null
    2014-07-10 11:02:53,667 INFO  com.netflix.discovery.DiscoveryClient:648 [main] [fetchRegistry] Force full registry fetch : false
    2014-07-10 11:02:53,667 INFO  com.netflix.discovery.DiscoveryClient:649 [main] [fetchRegistry] Application is null : false
    2014-07-10 11:02:53,667 INFO  com.netflix.discovery.DiscoveryClient:650 [main] [fetchRegistry] Registered Applications size is zero : true
    2014-07-10 11:02:53,668 INFO  com.netflix.discovery.DiscoveryClient:652 [main] [fetchRegistry] Application version is -1: true
    2014-07-10 11:02:54,061 INFO  com.netflix.discovery.DiscoveryClient:992 [main] [makeRemoteCall] Finished a call to service url http://serverIP:8080/eureka/v2/ and url path apps/ with status code 200.
    2014-07-10 11:02:54,061 INFO  com.netflix.discovery.DiscoveryClient:758 [main] [getAndStoreFullRegistry] Getting all instance registry info from the eureka server
    2014-07-10 11:02:54,568 INFO  com.netflix.discovery.DiscoveryClient:765 [main] [getAndStoreFullRegistry] The response status is 200
    2014-07-10 11:02:54,578 INFO  com.netflix.discovery.DiscoveryClient:1056 [main] [initScheduledTasks] Starting heartbeat executor: renew interval is: 30
    Connected to server. Sending a sample request
    Waiting for server response..
    Received response from server. Communication all fine using Eureka :
    Exiting the client. Demo over..

            证明 demo 获取 Application Service 实例并请求成功。
            能够看出,Application Service 实例的信息都封装在了 com.netflix.appinfo.InstanceInfo 下,那么我们还能从中获取哪些信息?SampleEurekaClient 类增加下面代码:
            logger.debug("nextServerInfo.getAppGroupName()-" + nextServerInfo.getAppGroupName());
            logger.debug("nextServerInfo.getAppName()-" + nextServerInfo.getAppName());
            logger.debug("nextServerInfo.getASGName()-" + nextServerInfo.getASGName());
            logger.debug("nextServerInfo.getHomePageUrl()-" + nextServerInfo.getHomePageUrl());
            logger.debug("nextServerInfo.getHostName()-" + nextServerInfo.getHostName());
            logger.debug("nextServerInfo.getId()-" + nextServerInfo.getId());
            logger.debug("nextServerInfo.getIPAddr()-" + nextServerInfo.getIPAddr());
            logger.debug("nextServerInfo.getLastUpdatedTimestamp()-" + nextServerInfo.getLastUpdatedTimestamp());
            logger.debug("nextServerInfo.getPort()-" + nextServerInfo.getPort());
            logger.debug("nextServerInfo.getSecureVipAddress()-" + nextServerInfo.getSecureVipAddress());
            logger.debug("nextServerInfo.getStatusPageUrl()-" + nextServerInfo.getStatusPageUrl());
            logger.debug("nextServerInfo.getVIPAddress()-" + nextServerInfo.getVIPAddress());
            logger.debug("nextServerInfo.getLastDirtyTimestamp()-" + nextServerInfo.getLastDirtyTimestamp());
            logger.debug("nextServerInfo.getHealthCheckUrls()-" + nextServerInfo.getHealthCheckUrls());
            logger.debug("nextServerInfo.getStatus()-" + nextServerInfo.getStatus());

            然后又一次执行本文 demo,以上语句打印结果例如以下:
    2014-07-10 11:02:54,619 DEBUG com.netflix.eureka.SampleEurekaClient:69 [main] [sendRequestToServiceUsingEureka] nextServerInfo.getAppGroupName()-UNKNOWN
    2014-07-10 11:02:54,619 DEBUG com.netflix.eureka.SampleEurekaClient:70 [main] [sendRequestToServiceUsingEureka] nextServerInfo.getAppName()-SAMPLESERVICE
    2014-07-10 11:02:54,619 DEBUG com.netflix.eureka.SampleEurekaClient:71 [main] [sendRequestToServiceUsingEureka] nextServerInfo.getASGName()-null
    2014-07-10 11:02:54,619 DEBUG com.netflix.eureka.SampleEurekaClient:72 [main] [sendRequestToServiceUsingEureka] nextServerInfo.getHomePageUrl()-http://defonds-win7:1935/
    2014-07-10 11:02:54,620 DEBUG com.netflix.eureka.SampleEurekaClient:73 [main] [sendRequestToServiceUsingEureka] nextServerInfo.getHostName()-defonds-win7
    2014-07-10 11:02:54,620 DEBUG com.netflix.eureka.SampleEurekaClient:74 [main] [sendRequestToServiceUsingEureka] nextServerInfo.getId()-defonds-win7
    2014-07-10 11:02:54,620 DEBUG com.netflix.eureka.SampleEurekaClient:75 [main] [sendRequestToServiceUsingEureka] nextServerInfo.getIPAddr()-172.21.40.134
    2014-07-10 11:02:54,620 DEBUG com.netflix.eureka.SampleEurekaClient:76 [main] [sendRequestToServiceUsingEureka] nextServerInfo.getLastUpdatedTimestamp()-1404961202884
    2014-07-10 11:02:54,620 DEBUG com.netflix.eureka.SampleEurekaClient:77 [main] [sendRequestToServiceUsingEureka] nextServerInfo.getPort()-1935
    2014-07-10 11:02:54,620 DEBUG com.netflix.eureka.SampleEurekaClient:78 [main] [sendRequestToServiceUsingEureka] nextServerInfo.getSecureVipAddress()-null
    2014-07-10 11:02:54,620 DEBUG com.netflix.eureka.SampleEurekaClient:79 [main] [sendRequestToServiceUsingEureka] nextServerInfo.getStatusPageUrl()-http://defonds-win7:1935/Status
    2014-07-10 11:02:54,620 DEBUG com.netflix.eureka.SampleEurekaClient:80 [main] [sendRequestToServiceUsingEureka] nextServerInfo.getVIPAddress()-sampleservice.mydomain.net
    2014-07-10 11:02:54,620 DEBUG com.netflix.eureka.SampleEurekaClient:81 [main] [sendRequestToServiceUsingEureka] nextServerInfo.getLastDirtyTimestamp()-1404961230856
    2014-07-10 11:02:54,620 DEBUG com.netflix.eureka.SampleEurekaClient:82 [main] [sendRequestToServiceUsingEureka] nextServerInfo.getHealthCheckUrls()-[http://defonds-win7:1935/healthcheck]
    2014-07-10 11:02:54,621 DEBUG com.netflix.eureka.SampleEurekaClient:83 [main] [sendRequestToServiceUsingEureka] nextServerInfo.getStatus()-UP

            这些信息都和 http://serverIP:8080/eureka/v2/apps/ 显示的 SAMPLESERVICE 实例的 各个属性一一相应。
            參考资料
  • 相关阅读:
    Help Hanzo (素数筛+区间枚举)
    How to create and apply a patch with Git
    Assembly
    GNU C 内联汇编介绍
    Arch Linux sudo: PAM authentication error: Module is unknown [Solved!]
    关于 RTL8723BS 同时开启 STA/AP 模式
    单源最短路径算法——Dijkstra算法
    Altium Designer PCB制作入门实例
    I2C 总线协议
    TarJan 算法求解有向连通图强连通分量
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4533170.html
Copyright © 2011-2022 走看看