Eureka 的 Application Client client的执行演示样例

Eureka 的 Application Client client的执行演示样例

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

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 实例的 各个属性一一相应。


       
參考资料

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/117936.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • SQL中的连接查询与嵌套查询「建议收藏」

    SQL中的连接查询与嵌套查询「建议收藏」连接查询若一个查询同时涉及两个或两个以上的表,则称之为连接查询。连接查询是数据库中最最要的查询,包括:1、等值连接查询2、自然连接查询3、非等值连接查询4、自身连接查询5、外连接查询6、复合条件查询等值与非等值连接查询:比较运算符主要有=、>、=、)等。下面来看一个例子:假设有一个学生数据库,其中有三张表,即学生信息表(Student

  • python的多线程是否没有用了[通俗易懂]

    python的多线程是否没有用了[通俗易懂]python的多线程是否就完全没有用了呢?相同的代码,为何有时候多线程会比单线程慢,有时又会比单线程快? 这主要跟运行的代码有关: 1、 CPU密集型代码 (

  • python unix时间戳_python24小时12小时转换

    python unix时间戳_python24小时12小时转换#-*-coding:utf-8-*-importtimedeftimestamp_datetime(value):format=’%Y-%m-%d%H:%M:%S’#value为传入的值为时间戳(×××),如:1332888820value=time.localtime(value)##经过localtime转换后变成##time.struct_time(tm_yea…

  • Eclipse配置Maven及setting文件解释

    Eclipse配置Maven及setting文件解释Eclipse配置Maven及setting文件解释

  • NET-> SplitContainer控件说明

    NET-> SplitContainer控件说明拆分器控件Splitcontainer,是一个含有Splitter拆分条的容器,它包含两个面板容器Panel1,Panel2,可以移动拆分条,对面板大小进行控制!控件学习示例程序!属性介绍;//拆分条的是否启用禁用boolIsSplitterFixed{get

  • Java保留两位小数的几种写法总结[通俗易懂]

    Java保留两位小数的几种写法总结[通俗易懂]相信大家在平时做项目时,可能会有这样的业务需求:页面或界面上展示的数据保留小数点后两位。那么这篇文章小编就和大家分享了利用Java保留两位小数的几种写法,文章给出了详细的示例代码,对大家的学习和理解很有帮助,有需要的朋友们下面来一起学习学习下吧。本文列举了几个方法:    1.使用java.math.BigDecimal     2.使用java.text.DecimalFormat …

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号