1. 程式人生 > >Eureka-webservice註冊及續約

Eureka-webservice註冊及續約

註冊:

將應用(以下簡稱App)註冊到eureka服務中心中去,首先要給eureka server傳送一個請求,請求型別為HttpPost,請求引數型別content-type為application/xml,serverUrl為eureka Server的地址,例如:http://localhost:8761/eureka/apps,appName需要自己定,比如我這裡用的是EUREKA-APP,返回碼200即表註冊成功,然後還要傳一個xml檔案,裡面詳盡的設定了請求需要傳的具體引數。

xml如下:

<instance>
    <!--例項ID -->
    <instanceId>localhost:8080</instanceId>
    <!--例項HOST -->
    <hostName>localhost</hostName>
    <!--全域性應用名 -->
    <app>EUREKA-APP</app>
    <!--IP地址 -->
    <ipAddr>localhost</ipAddr>
    <!--例項狀態 -->
    <status>UP</status>
    <!--例項的覆蓋狀態 -->
    <overriddenstatus>UNKNOWN</overriddenstatus>
    <!--埠 -->
    <port enabled="true">8080</port>
    <securePort enabled="false">8443</securePort>
    <countryId>1</countryId>

    <!--使用的資料中心 -->
    <dataCenterInfo class="com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo">
       <name>MyOwn</name>
    </dataCenterInfo>

    <!--租約資訊 -->
    <leaseInfo>
        <!--心跳間隔 -->
        <renewalIntervalInSecs>45</renewalIntervalInSecs>
        <!--例項過期時間 -->
        <durationInSecs>120</durationInSecs>
    </leaseInfo>

    <!--監控埠 -->
    <metadata>
       <management.port>8080</management.port>
    </metadata>

    <!--主頁 -->
    <homePageUrl>http://localhost:8080/edasa/login</homePageUrl>

    <!--資訊查詢介面 -->
    <statusPageUrl>http://localhost:8080/edasa/login</statusPageUrl>

    <!--健康檢查介面 -->
    <healthCheckUrl>http://localhost:8080/edasa/login</healthCheckUrl>

    <!--VIP 這裡的vipAddress 要與全域性應用名相同-->
    <vipAddress>eureka-app</vipAddress>
    <secureVipAddress>eureka-app</secureVipAddress>
    <isCoordinatingDiscoveryServer>false</isCoordinatingDiscoveryServer>

    <!--最後修改時間 -->
    <lastDirtyTimestamp>1528277019740</lastDirtyTimestamp>

</instance>

還需要配置一個eureka-client.properties檔案。

eureka.serviceUrl.default=http://localhost:8761/eureka/apps
eureka.client.appName=eureka-app
eureka.client.instanceId=localhost:8080

java請求程式碼如下:   serverUrl與appName是從xml裡讀取的,請自行處理。

public class EurekaClientPublishListener implements ServletContextListener{

    try {
            if(Util.isNull(serverUrl)) {
                throw new RuntimeException("serverUrl is null");
            }
            if(Util.isNull(appName)){
                throw new RuntimeException("appName is null");
            }
            HttpPost httpPost = new HttpPost(serverUrl+"/"+appName);

            //解決中文亂碼問題
            StringEntity stringEntity = new StringEntity(xmlStr, "UTF-8");
            stringEntity.setContentEncoding("UTF-8");

            //引數型別application/xml
            httpPost.setHeader("content-type", "application/xml");

            //引數設定,就是將xml先讀取出來,再用流字串的形式傳到請求中
            httpPost.setEntity(stringEntity);
            HttpResponse response = httpClient.execute(httpPost);
            int code = response.getStatusLine().getStatusCode();
        }catch (IOException e){
            e.printStackTrace();
            logger.error("http request failure");
        }

}

續約:

由於Eureka需要定時傳心跳請求,否則Eureka就會登出註冊其上的服務,故需要作一個定時任務不停地續約。

java程式碼如下:serverUrl 與 appName 和 instanceId 是從xml裡讀取的,請自行處理。

@Service
public class EurekaJobService {

    HttpPut httpPut = new HttpPut(serverUrl+"/"+appName+"/"+instanceId);

    //引數型別application/xml
    httpPut.setHeader("content-type", "application/xml");

    HttpResponse response = httpClient.execute(httpPut);
    code = response.getStatusLine().getStatusCode();
}

springApplicationContext.xml 配置定時任務:

  <task:scheduled-tasks>
       <task:scheduled ref="quartzTestBean" method="renewalClientContract" cron="*/20 * * * * ?" />
  </task:scheduled-tasks>

  <bean id="quartzTestBean" class="com.eureka.service.EurekaJobService"/>