最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring?cloud?eureka注冊(cè)原理-注冊(cè)失敗填坑筆記

 更新時(shí)間:2022年05月07日 11:53:25   作者:qtyy  
這篇文章主要介紹了spring?cloud?eureka注冊(cè)原理-注冊(cè)失敗填坑筆記,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

寫在前面

我們知道Eureka分為兩部分,Eureka Server和Eureka Client。Eureka Server充當(dāng)注冊(cè)中心的角色,Eureka Client相對(duì)于Eureka Server來(lái)說(shuō)是客戶端,需要將自身信息注冊(cè)到注冊(cè)中心。

本文主要介紹的就是在Eureka Client注冊(cè)到Eureka Server時(shí)RetryableClientQuarantineRefreshPercentage參數(shù)的使用技巧。

Eureka Client注冊(cè)過(guò)程分析

Eureka Client注冊(cè)到Eureka Server時(shí),首先遇到第一個(gè)問(wèn)題就是Eureka Client端要知道Server的地址,這個(gè)參數(shù)對(duì)應(yīng)的是eureka.client.service-url.defaultZone舉個(gè)例子,在Eureka Client的properties文件中配置如下:

eureka.client.service-url.defaultZone=
http://localhost:8761/eureka,http://localhost:8762/eureka,http://localhost:8763/eureka,http://localhost:8764/eureka

如上所示,Eureka Client配置對(duì)應(yīng)的Eureka Server地址分別是8761、8762、8763、8764。這里存在兩個(gè)問(wèn)題:

  • Eureka Client會(huì)將自身信息分別注冊(cè)到這四個(gè)地址嗎?
  • Eureka Clinent注冊(cè)機(jī)制是怎樣的?

源碼面前一目了然,帶著這兩個(gè)問(wèn)題我們通過(guò)源碼來(lái)解答這兩個(gè)問(wèn)題。Eureka Client在啟動(dòng)的時(shí)候注冊(cè)源碼如下:

RetryableEurekaHttpClient中的execut方法

@Override
  protected <R> EurekaHttpResponse<R> execute(RequestExecutor<R> requestExecutor) {
      List<EurekaEndpoint> candidateHosts = null;
      int endpointIdx = 0;
      for (int retry = 0; retry < numberOfRetries; retry++) {
          EurekaHttpClient currentHttpClient = delegate.get();
          EurekaEndpoint currentEndpoint = null;
          if (currentHttpClient == null) {
              if (candidateHosts == null) {
                  candidateHosts = getHostCandidates();
                  if (candidateHosts.isEmpty()) {
                      throw new TransportException("There is no known eureka server; cluster server list is empty");
                  }
              }
              if (endpointIdx >= candidateHosts.size()) {
                  throw new TransportException("Cannot execute request on any known server");
              }
              currentEndpoint = candidateHosts.get(endpointIdx++);
              currentHttpClient = clientFactory.newClient(currentEndpoint);
          }
          try {
              EurekaHttpResponse<R> response = requestExecutor.execute(currentHttpClient);
              if (serverStatusEvaluator.accept(response.getStatusCode(), requestExecutor.getRequestType())) {
                  delegate.set(currentHttpClient);
                  if (retry > 0) {
                      logger.info("Request execution succeeded on retry #{}", retry);
                  }
                  return response;
              }
              logger.warn("Request execution failure with status code {}; retrying on another server if available", response.getStatusCode());
          } catch (Exception e) {
              logger.warn("Request execution failed with message: {}", e.getMessage());  // just log message as the underlying client should log the stacktrace
          }
          // Connection error or 5xx from the server that must be retried on another server
          delegate.compareAndSet(currentHttpClient, null);
          if (currentEndpoint != null) {
              quarantineSet.add(currentEndpoint);
          }
      }
      throw new TransportException("Retry limit reached; giving up on completing the request");
  }

按照我的理解,代碼精簡(jiǎn)后內(nèi)容如下:

int endpointIdx = 0;
//用來(lái)保存所有Eureka Server信息(8761、8762、8763、8764)
List<EurekaEndpoint> candidateHosts = null;
//numberOfRetries的值代碼寫死默認(rèn)為3次
for (int retry = 0; retry < numberOfRetries; retry++) {
    /**
     *首次進(jìn)入循環(huán)時(shí),獲取全量的Eureka Server信息(8761、8762、8763、8764)
     */
    if (candidateHosts == null) {
        candidateHosts = getHostCandidates();
    }
    /**
     *通過(guò)endpointIdx自增,依次獲取Eureka Server信息,然后發(fā)送
     *注冊(cè)的Post請(qǐng)求.
     */
    currentEndpoint = candidateHosts.get(endpointIdx++);
    currentHttpClient = clientFactory.newClient(currentEndpoint);
    try {
       /**
         *發(fā)送注冊(cè)的Post請(qǐng)求動(dòng)作,注意如果成功,則跳出循環(huán),如果失敗則
         *根據(jù)endpointIdx依次獲取下一個(gè)Eureka Server.
         */
        response = requestExecutor.execute(currentHttpClient);
        return respones;
    } catch (Exception e) {
        //向注冊(cè)中心(Eureka Server)發(fā)起注冊(cè)的post出現(xiàn)異常時(shí),打印日志...
    }
    //如果此次注冊(cè)動(dòng)作失敗,將當(dāng)前的信息保存到quarantineSet中(一個(gè)Set集合)
    if (currentEndpoint != null) {
        quarantineSet.add(currentEndpoint);
    }
}
//如果都失敗,則以異常形式拋出...
throw new TransportException("Retry limit reached; giving up on completing the request");

上面代碼中還有一個(gè)方法很重要就是List<EurekaEndpoint> candidateHosts = getHostCandidates();接下來(lái)看下getHostCandidates()方法源碼 

? ? private List<EurekaEndpoint> getHostCandidates() {
? ? ? ? List<EurekaEndpoint> candidateHosts = clusterResolver.getClusterEndpoints();
? ? ? ? quarantineSet.retainAll(candidateHosts);
? ? ? ? // If enough hosts are bad, we have no choice but start over again
? ? ? ? int threshold = (int) (candidateHosts.size() * transportConfig.getRetryableClientQuarantineRefreshPercentage());
? ? ? ? if (quarantineSet.isEmpty()) {
? ? ? ? ? ? // no-op
? ? ? ? } else if (quarantineSet.size() >= threshold) {
? ? ? ? ? ? logger.debug("Clearing quarantined list of size {}", quarantineSet.size());
? ? ? ? ? ? quarantineSet.clear();
? ? ? ? } else {
? ? ? ? ? ? List<EurekaEndpoint> remainingHosts = new ArrayList<>(candidateHosts.size());
? ? ? ? ? ? for (EurekaEndpoint endpoint : candidateHosts) {
? ? ? ? ? ? ? ? if (!quarantineSet.contains(endpoint)) {
? ? ? ? ? ? ? ? ? ? remainingHosts.add(endpoint);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? candidateHosts = remainingHosts;
? ? ? ? }
? ? ? ? return candidateHosts;
? ? }

按照我的理解,將代碼精簡(jiǎn)下,只包括關(guān)鍵邏輯,內(nèi)容如下:

private List<EurekaEndpoint> getHostCandidates() {
? ? /**
? ? ?* 獲取所有defaultZone配置的注冊(cè)中心信息(Eureka Server),
? ? ?* 在本文例子中代表4個(gè)(8761、8762、8763、8764)Eureka Server
? ? ?*/
? ? List candidateHosts = clusterResolver.getClusterEndpoints();
? ? /**
? ? ?* quarantineSet這個(gè)Set集合中保存的是不可用的Eureka Server
? ? ?* 此處是拿不可用的Eureka Server與全量的Eureka Server取交集
? ? ?*/
? ? quarantineSet.retainAll(candidateHosts);
? ? /**
? ? ?* 根據(jù)RetryableClientQuarantineRefreshPercentage參數(shù)計(jì)算閾值
? ? ?* 該閾值后續(xù)會(huì)和quarantineSet中保存的不可用的Eureka Server個(gè)數(shù)
? ? ?* 作比較,從而判斷是否返回全量的Eureka Server還是過(guò)濾掉不可用的
? ? ?* Eureka Server。
? ? ?*/
? ? int threshold =?
? ? ? ?(int) (
? ? ? ? candidateHosts.size()
? ? ? ? ? ? ? *
? ? ? ? transportConfig.getRetryableClientQuarantineRefreshPercentage()
? ? ? ? );
? ? if (quarantineSet.isEmpty()) {
? ? ? ? /**
? ? ? ? ?* 首次進(jìn)入的時(shí)候,此時(shí)quarantineSet為空,直接返回全量的
? ? ? ? ?* Eureka Server列表
? ? ? ? ?*/
? ? } else if (quarantineSet.size() >= threshold) {
? ? ? ? /**
? ? ? ? ?* 將不可用的Eureka Server與threshold值相比較,如果不可
? ? ? ? ?* 用的Eureka Server個(gè)數(shù)大于閾值,則將之前保存的Eureka
? ? ? ? ?* Server內(nèi)容直接清空,并返回全量的Eureka Server列表。
? ? ? ? ?*/
? ? ? ? quarantineSet.clear();
? ? } else {
? ? ? ? /**
? ? ? ? ?* 通過(guò)quarantineSet集合保存不可用的Eureka Server來(lái)過(guò)濾
? ? ? ? ?* 全量的EurekaServer,從而獲取此次Eureka Client要注冊(cè)要
? ? ? ? ?* 注冊(cè)的Eureka Server實(shí)例地址。
? ? ? ? ?*/
? ? ? ? List<EurekaEndpoint> remainingHosts = new ArrayList<>(candidateHosts.size());
? ? ? ? for (EurekaEndpoint endpoint : candidateHosts) {
? ? ? ? ? ? if (!quarantineSet.contains(endpoint)) {
? ? ? ? ? ? ? ? remainingHosts.add(endpoint);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? candidateHosts = remainingHosts;
? ? }
? ? return candidateHosts;
}

通過(guò)源碼分析,我們現(xiàn)在初步知道,當(dāng)Eureka Client向Eureka Server發(fā)起注冊(cè)請(qǐng)求的時(shí)候(根據(jù)defaultZone尋找Eureka Server列表),如果有一次請(qǐng)求注冊(cè)成功,那么后續(xù)就不會(huì)在向其他Eureka Server發(fā)起注冊(cè)請(qǐng)求。以本文為例,注冊(cè)中心有四個(gè)(8761、8762、8763、8764)。如果8761對(duì)應(yīng)的Eureka Server服務(wù)的狀態(tài)是UP,那么Eureka Client向該注冊(cè)中心注冊(cè)成功后,不會(huì)再向(8762、8763、8764)對(duì)應(yīng)的Eureka Server發(fā)起注冊(cè)請(qǐng)求(對(duì)應(yīng)程序是在for循環(huán)中直接return respones)。

說(shuō)到這里又引出來(lái)另外一個(gè)問(wèn)題,如果8761這個(gè)Eureka Server是down掉的呢?

根據(jù)源碼我們可知Eureka Client首次會(huì)向8761這個(gè)Server發(fā)起注冊(cè)請(qǐng)求,如果該Server的狀態(tài)是down,那么它會(huì)將該Server保存到quarantineSet這個(gè)Set集合中,然后再次訪問(wèn)8762這個(gè)Eureka Server,如果8762這個(gè)Server的狀態(tài)依舊是down,它也會(huì)把這個(gè)Server保存到quarantineSet這個(gè)Set集合中,然后繼續(xù)訪問(wèn)8763這個(gè)Server,如果8763這個(gè)Server的狀態(tài)依舊是down,此時(shí)除了會(huì)將其保存到quarantineSet這個(gè)Set集合中之外,還會(huì)跳出本次循環(huán)。從而結(jié)束此次注冊(cè)過(guò)程。

道這里有人要問(wèn)接下來(lái)會(huì)不會(huì)向8764這個(gè)Server發(fā)起注冊(cè),答案是否定的,因?yàn)檠h(huán)的次數(shù)默認(rèn)是3次。所以即使8764這個(gè)Server的狀態(tài)是UP,它也不會(huì)接收到來(lái)自Eureka Client發(fā)起的注冊(cè)信息。

Eureka Client向Eureka Server發(fā)起注冊(cè)信息的過(guò)程除了在Eureka Client啟動(dòng)的時(shí)候觸發(fā),還有另外一種方式,就是后臺(tái)定時(shí)任務(wù)。

假設(shè)我們上面描述的場(chǎng)景是在Eureka Client啟動(dòng)的時(shí)候,因?yàn)樵趩?dòng)的時(shí)候注冊(cè)這個(gè)過(guò)程全部失敗了,當(dāng)后臺(tái)定時(shí)任務(wù)執(zhí)行時(shí),還會(huì)進(jìn)入該注冊(cè)流程。注意此時(shí)quarantineSet的值為3(8761、8762、8763之前注冊(cè)失敗的Eureka Server)。

所以當(dāng)程序再次進(jìn)入getHostCandidates()方法時(shí),if (quarantineSet.isEmpty())這個(gè)方法是不滿足的,接下來(lái)會(huì)走else if (quarantineSet.size() >= threshold)這個(gè)判斷,如果這個(gè)判斷成立,那么會(huì)將quarantineSet集合清空,同時(shí)返回全量的Eureka Server列表,如果這個(gè)判斷不成立,會(huì)拿quarantineSet集合中保存的內(nèi)容去過(guò)濾Eureka Server的全量列表。以本文為例:

  • quarantineSet中保存的是(8761、8762、8763)三個(gè)Eureka Server
  • Eureka Server全量列表的內(nèi)容是(8761、8762、8763、8764)四個(gè)Eureka Server過(guò)濾后返回的結(jié)果為8764這個(gè)Eureka Server。

在本文的例子中8761、8762、8763這三個(gè)Eureka Server的狀態(tài)是down而8764這個(gè)Eureka Server的狀態(tài)是UP,我們其實(shí)是想走到最后的else分支,從而完成過(guò)濾操作,并最終得到8764這個(gè)Server,遺憾的是它并不會(huì)走到這個(gè)分支,而是被上面的else if (quarantineSet.size() >= threshold)這個(gè)分支所攔截,返回的依舊是全量的Eureka Server列表。這樣造成的后果就是Eureka Client依舊會(huì)依次向(8761、8762、8763)這三個(gè)down的Eureka Server發(fā)起注冊(cè)請(qǐng)求。

那么問(wèn)題的關(guān)鍵在哪里呢?問(wèn)題的關(guān)鍵就是threshold這個(gè)值的由來(lái),因?yàn)榇藭r(shí)quarantineSet.size()的值為3,而3這個(gè)值大于threshold,從而導(dǎo)致,會(huì)將quarantineSet集合清空,返回全量的Server列表。  

我們知道threshold這個(gè)值是根據(jù)全量的Eureka Server列表乘以一個(gè)可配置的參數(shù)計(jì)算出來(lái)的,在本文的例子當(dāng)中,我的properties文件中除了defaultZone之外并沒(méi)有配置這個(gè)參數(shù),那么也就是說(shuō)這個(gè)參數(shù)是有默認(rèn)值的,通過(guò)源碼我們了解到,這個(gè)默認(rèn)值是0.66。具體源碼如下:

final class PropertyBasedTransportConfigConstants {
? ? /**
? ? ?*省略部分源碼
? ? ?*/
? ? static class Values {
? ? ? ? static final int SESSION_RECONNECT_INTERVAL = 20*60;
? ? ? ? //默認(rèn)值為0.66
? ? ? ? static final double QUARANTINE_REFRESH_PERCENTAGE = 0.66;
? ? ? ? static final int DATA_STALENESS_TRHESHOLD = 5*60;
? ? ? ? static final int ASYNC_RESOLVER_REFRESH_INTERVAL = 5*60*1000;
? ? ? ? static final int ASYNC_RESOLVER_WARMUP_TIMEOUT = 5000;
? ? ? ? static final int ASYNC_EXECUTOR_THREADPOOL_SIZE = 5;
? ? }
}
/**
?*@return the percentage of the full endpoints set above which the ??
?*quarantine set is cleared in the range [0, 1.0]
?*/
double getRetryableClientQuarantineRefreshPercentage();

看到這里就不難理解了,因?yàn)檫@個(gè)值是0.66而此時(shí)全量的Eureka Server值為4。計(jì)算之后的值為2,而由于注冊(cè)的for循環(huán)為3次,所以當(dāng)?shù)诙伟l(fā)起注冊(cè)流程的時(shí)候quarantineSet的值始終大于threshold。這樣就會(huì)導(dǎo)致一個(gè)問(wèn)題,就是如果8761、8762、8763一直是down即使8764一直是好的,那么Eureka Client也不會(huì)注冊(cè)成功。而且這個(gè)參數(shù)值的區(qū)間為0到1.

既然通過(guò)源碼分析我們找到了問(wèn)題根源,其實(shí)對(duì)應(yīng)的我們也找到了解決這個(gè)問(wèn)題的辦法,就是對(duì)應(yīng)把這個(gè)參數(shù)值調(diào)大些。這個(gè)值在properties中對(duì)應(yīng)的寫法如下:

eureka.client.transport.retryableClientQuarantineRefreshPercentage = xxx

接下來(lái)我們修改下properties文件,修改后的內(nèi)容如下:

eureka.client.service-url.defaultZone=
http://localhost:8761/eureka,http://localhost:8762/eureka,http://localhost:8763/eureka,http://localhost:8764/eureka
eureka.client.transport.retryableClientQuarantineRefreshPercentage=1
eureka.client.service-url.defaultZone=
http://localhost:8761/eureka,http://localhost:8762/eureka,http://localhost:8763/eureka,http://localhost:8764/eureka
eureka.client.transport.retryableClientQuarantineRefreshPercentage=1

接下來(lái)按照這個(gè)配置再次回顧下上面的流程:

  • Eureka Client啟動(dòng)時(shí)進(jìn)行注冊(cè)(8761、8762、8763的狀態(tài)是down),所以此時(shí)quarantineSet的值為3.
  • 接下來(lái)在定時(shí)任務(wù)中又觸發(fā)注冊(cè)事件,此時(shí)因?yàn)閰?shù)的值從0.66調(diào)整為1。所以計(jì)算出的threshold的值為4。而此時(shí)quarantineSet的值為3。所以不會(huì)進(jìn)入到else if (quarantineSet.size() >= threshold)分支,而是會(huì)進(jìn)入最后的esle分支。
  • 在else分支中會(huì)完成過(guò)濾功能,最終返回的list中的結(jié)果只有一個(gè)就是8764這個(gè)Eureka Server。
  • Eureka Client向8764這個(gè)Eureka Server發(fā)起注冊(cè)請(qǐng)求,得到成功相應(yīng),并返回。

遺留問(wèn)題

說(shuō)道這里我們感覺(jué)好像是解決了這個(gè)問(wèn)題,那么問(wèn)一個(gè)問(wèn)題,這個(gè)參數(shù)值可以設(shè)置的無(wú)限大嗎?

比如我將這個(gè)參數(shù)值設(shè)置為10,雖然javaDoc中說(shuō)明這個(gè)參數(shù)值的范圍在0-1之間,但是并沒(méi)有說(shuō)明如果將這個(gè)參數(shù)調(diào)整大于1會(huì)出現(xiàn)什么情況。接下來(lái)按照上面的流程我們分析下:

之前我們分析的流程中的前提是8761、8762、8763這三臺(tái)Server的狀態(tài)是down而8764這個(gè)server的狀態(tài)是up,現(xiàn)在我們修改下這個(gè)前提。

假設(shè)一開(kāi)始8761、8762、8763、8764這四臺(tái)Eureka Server的狀態(tài)都是down。

Eureka Client啟動(dòng)時(shí)進(jìn)行注冊(cè)(8761、8762、8763的狀態(tài)是down),所以此時(shí)quarantineSet的值為3.

  • 接下來(lái)在定時(shí)任務(wù)中又觸發(fā)注冊(cè)事件,此時(shí)因?yàn)閰?shù)的值從0.66調(diào)整為10。所以計(jì)算出的threshold的值為40。而此時(shí)quarantineSet的值為3。所以不會(huì)進(jìn)入到else if (quarantineSet.size() >= threshold)分支,而是會(huì)進(jìn)入最后的esle分支。
  • 在else分支中會(huì)完成過(guò)濾功能,最終返回的list中的結(jié)果只有一個(gè)就是8764這個(gè)Eureka Server。
  • Eureka Client向8764這個(gè)Eureka Server發(fā)起注冊(cè)請(qǐng)求,因?yàn)榇藭r(shí)8764的狀態(tài)也是down導(dǎo)致注冊(cè)失敗,此時(shí)quarantineSet中的內(nèi)容是(8761、8762、8763、8764)
  • 當(dāng)定時(shí)任務(wù)再次觸發(fā)時(shí)if (quarantineSet.isEmpty())這個(gè)分支不會(huì)進(jìn)入,因?yàn)榇藭r(shí)quarantineSet的值為4else if (quarantineSet.size() >= threshold)這分支也不會(huì)進(jìn)入因?yàn)閠hreshold的值為40
  • 最終會(huì)進(jìn)入else分支,這個(gè)分支原本的含義是想通過(guò)quarantineSet來(lái)充當(dāng)過(guò)濾器,從全量的Eureka Server中過(guò)濾掉之前狀態(tài)為down的Eureka Server,但是由于quarantineSet的值現(xiàn)在已經(jīng)是全量,導(dǎo)致過(guò)濾后的結(jié)果返回的是一個(gè)空的list。即使此時(shí)Eureka Server列表(8761、8762、8763、8764)任何一個(gè)Server的狀態(tài)變?yōu)閁P,該Eureka Client也不可能完成注冊(cè)事件。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot整合quartz實(shí)例demo

    springboot整合quartz實(shí)例demo

    Quartz是一個(gè)開(kāi)源的任務(wù)調(diào)度框架。基于定時(shí)、定期的策略來(lái)執(zhí)行任務(wù)是它的核心功能,比如x年x月的每個(gè)星期五上午8點(diǎn)到9點(diǎn),每隔10分鐘執(zhí)行1次,本文重點(diǎn)給大家介紹springboot整合quartz的實(shí)例代碼,感興趣的朋友一起看看吧
    2022-02-02
  • 淺談Java中Collection和Collections的區(qū)別

    淺談Java中Collection和Collections的區(qū)別

    下面小編就為大家?guī)?lái)一篇淺談Java中Collection和Collections的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • MySQL查詢字段實(shí)現(xiàn)字符串分割split功能的示例代碼

    MySQL查詢字段實(shí)現(xiàn)字符串分割split功能的示例代碼

    本文主要介紹了MySQL查詢字段實(shí)現(xiàn)字符串分割split功能的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • IDEA生成patch和使用patch的方法實(shí)現(xiàn)

    IDEA生成patch和使用patch的方法實(shí)現(xiàn)

    比如你本地修復(fù)的 bug,需要把增量文件發(fā)給客戶,很多場(chǎng)景下大家都需要手工整理修改的文件,并整理好目錄,這個(gè)很麻煩,那有沒(méi)有簡(jiǎn)單的技巧呢?本文主要介紹了IDEA生成patch和使用patch的方法實(shí)現(xiàn),感興趣的可以了解一下
    2023-08-08
  • 如何解決SpringBoot定時(shí)任務(wù)報(bào)錯(cuò)Unexpected error occurred in scheduled task問(wèn)題

    如何解決SpringBoot定時(shí)任務(wù)報(bào)錯(cuò)Unexpected error occurred 

    這篇文章主要介紹了如何解決SpringBoot定時(shí)任務(wù)報(bào)錯(cuò)Unexpected error occurred in scheduled task問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java 中的變量類型

    Java 中的變量類型

    這篇文章主要介紹了Java 中的變量類型,一般包括局部變量、成員變量、類變量,下面文章對(duì)這三種內(nèi)容的變量做了一個(gè)詳細(xì)介紹,需要的朋友可以參考一下
    2021-11-11
  • Spring Boot學(xué)習(xí)入門之AOP處理請(qǐng)求詳解

    Spring Boot學(xué)習(xí)入門之AOP處理請(qǐng)求詳解

    AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過(guò)預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù),下面這篇文章主要給大家介紹了關(guān)于Spring Boot學(xué)習(xí)入門之AOP處理請(qǐng)求的相關(guān)資料,需要的朋友可以參考下。
    2017-09-09
  • java 判斷一個(gè)數(shù)組中的數(shù)值是否連續(xù)相鄰的方法

    java 判斷一個(gè)數(shù)組中的數(shù)值是否連續(xù)相鄰的方法

    下面小編就為大家分享一篇java 判斷一個(gè)數(shù)組中的數(shù)值是否連續(xù)相鄰的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • 一文詳解Java線程的6種狀態(tài)與生命周期

    一文詳解Java線程的6種狀態(tài)與生命周期

    一個(gè)線程在給定的時(shí)間點(diǎn)只能處于一種狀態(tài)。線程可以有6種狀態(tài):New、Runnable、Blocked、Waiting、Timed?waiting和Terminated。本文將詳細(xì)講解這6種狀態(tài),需要的可以參考一下
    2022-05-05
  • 詳解java jinfo命令

    詳解java jinfo命令

    jinfo是jdk自帶的命令,用來(lái)查看jvm的配置參數(shù).通常會(huì)先使用jps查看java進(jìn)程的id,然后使用jinfo查看指定pid的jvm信息,需要的朋友可以參考下
    2021-06-06

最新評(píng)論

沁源县| 峨边| 彭山县| 运城市| 钟山县| 肇州县| 滕州市| 澄城县| 济南市| 思南县| 长子县| 甘德县| 闸北区| 即墨市| 临江市| 东台市| 云安县| 青河县| 娄底市| 麻江县| 闵行区| 莱芜市| 阳新县| 财经| 黄大仙区| 长葛市| 福安市| 惠来县| 平潭县| 安吉县| 张掖市| 资阳市| 新余市| 黄梅县| 香港| 常州市| 桂林市| 运城市| 漳州市| 白山市| 本溪市|