{"id":889,"date":"2020-09-29T18:21:44","date_gmt":"2020-09-29T10:21:44","guid":{"rendered":"http:\/\/prayerlaputa.com\/?p=889"},"modified":"2020-09-29T19:35:05","modified_gmt":"2020-09-29T11:35:05","slug":"%e6%ba%90%e7%a0%81%e5%88%86%e6%9e%90%e4%b9%8beureka%e6%9c%8d%e5%8a%a1%e7%ab%af%e6%ba%90%e7%a0%81%e8%a7%a3%e6%9e%90","status":"publish","type":"post","link":"http:\/\/prayerlaputa.com\/?p=889","title":{"rendered":"\u6e90\u7801\u5206\u6790\u4e4bEureka\u670d\u52a1\u7aef\u6e90\u7801\u89e3\u6790"},"content":{"rendered":"<h2 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u8bf4\u660e<\/span><\/h2>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u82e5\u65e0\u7279\u522b\u8bf4\u660e\uff0c\u672c\u6587\u6240\u6d89\u53ca\u7684\u4ee3\u7801\u7248\u672c\u4e3aspring boot\/cloud 2.2.6\u3002<\/span><\/p>\n<h2 class=\"md-end-block md-heading\"><span class=\"md-plain\">eureka server\u57fa\u672c\u529f\u80fd<\/span><\/h2>\n<ul class=\"ul-list\" data-mark=\"-\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u63a5\u53d7\u670d\u52a1\u6ce8\u518c<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u63a5\u53d7\u670d\u52a1\u5fc3\u8df3<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u670d\u52a1\u5254\u9664<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u670d\u52a1\u4e0b\u7ebf<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u96c6\u7fa4\u540c\u6b65<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u83b7\u53d6\u6ce8\u518c\u8868\u4e2d\u670d\u52a1\u5b9e\u4f8b\u4fe1\u606f<\/span><\/p>\n<\/li>\n<\/ul>\n<p><!--more--><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0cEureka Server\u540c\u65f6\u4e5f\u662f\u4e00\u4e2aEureka Client\uff0c\u5728\u4e0d\u7981\u6b62Eureka Server\u7684\u5ba2\u6237\u7aef\u884c\u4e3a\u65f6\uff0c\u5b83\u4f1a\u5411\u5b83\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u5176\u4ed6Eureka Server\u8fdb\u884c\u62c9\u53d6\u6ce8\u518c\u8868\u3001\u670d\u52a1\u6ce8\u518c\u548c\u53d1\u9001\u5fc3\u8df3\u7b49\u64cd\u4f5c<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">eureka\u67b6\u6784\u653e\u4e00\u5f20\u56fe\uff0c\u9547\u697c<\/span><\/p>\n<p class=\"md-end-block md-p\"><img loading=\"lazy\" class=\"size-large wp-image-890 aligncenter\" src=\"http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/eureka-architecture-1-1024x548.png\" alt=\"\" width=\"695\" height=\"372\" srcset=\"http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/eureka-architecture-1-1024x548.png 1024w, http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/eureka-architecture-1-300x160.png 300w, http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/eureka-architecture-1-768x411.png 768w, http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/eureka-architecture-1.png 1240w\" sizes=\"(max-width: 695px) 100vw, 695px\" \/><\/p>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u542f\u52a8eureka-server\u6ce8\u518c\u76f8\u5173bean<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u4e0eeureka-client\u7c7b\u4f3c\uff0ceureka-server\u542f\u52a8\u4e5f\u662f\u4f9d\u8d56spring factories\u673a\u5236\u521d\u59cb\u5316\u3001\u5e76\u5c06\u5bf9\u8c61\u52a0\u8f7d\u5230spring\u5bb9\u5668\u4e2d\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u4ee5<\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>spring-cloud-netflix-eureka-server-2.2.2.REALEASE.jar<\/code><\/span><span class=\"md-plain\">\u4e3a\u4f8b\uff0c\u6253\u5f00\u8be5\u5305\u4e2d\u7684spring.factories\uff0c\u53ef\u4ee5\u770b\u5230<\/span><\/p>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"text\" spellcheck=\"false\"><span role=\"presentation\">org.springframework.boot.autoconfigure.EnableAutoConfiguration=\\<\/span>\r\n<span role=\"presentation\">  org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration<\/span><\/pre>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5373\u542f\u52a8\u65f6\u81ea\u52a8\u52a0\u8f7dEurekaServerAutoConfiguration\u7c7b\uff0c\u800c\u8be5\u7c7b\u7684\u529f\u80fd\u662f\u5411spring\u7684bean\u5de5\u5382\u6dfb\u52a0eureka-server\u76f8\u5173\u529f\u80fd\u7684bean\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">EurekaServerAutoConfiguration\u4e0a\u6709\u4e00\u4e2a\u6ce8\u89e3\uff1a@ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class)\uff0c\u610f\u601d\u662f\uff1a\u53ea\u6709\u5728Spring\u5bb9\u5668\u91cc\u6709Marker\u8fd9\u4e2a\u7c7b\u7684\u5b9e\u4f8b\u65f6\uff0c\u624d\u4f1a\u52a0\u8f7dEurekaServerAutoConfiguration\uff0c\u8fd9\u4e2a\u5c31\u662f\u63a7\u5236\u662f\u5426\u5f00\u542fEureka Server\u7684\u5173\u952e\u3002<\/span><\/p>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u5f00\u542feureka server<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5728\u4f7f\u7528eureka-server\u65f6\uff0c\u6211\u4eec\u6240\u52a0\u7684<\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>@EnableEurekaServer<\/code><\/span><span class=\"md-plain\">\u6ce8\u89e3\uff0c\u5b9e\u73b0\u5982\u4e0b\uff1a<\/span><\/p>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"java\" spellcheck=\"false\"><span role=\"presentation\"><span class=\"cm-meta\">@Target<\/span>(<span class=\"cm-variable\">ElementType<\/span>.<span class=\"cm-variable\">TYPE<\/span>)<\/span>\r\n<span role=\"presentation\"><span class=\"cm-meta\">@Retention<\/span>(<span class=\"cm-variable\">RetentionPolicy<\/span>.<span class=\"cm-variable\">RUNTIME<\/span>)<\/span>\r\n<span role=\"presentation\"><span class=\"cm-meta\">@Documented<\/span><\/span>\r\n<span role=\"presentation\"><span class=\"cm-meta\">@Import<\/span>(<span class=\"cm-variable\">EurekaServerMarkerConfiguration<\/span>.<span class=\"cm-keyword\">class<\/span>)<\/span>\r\n<span role=\"presentation\"><span class=\"cm-keyword\">public<\/span> <span class=\"cm-keyword\">@interface<\/span> <span class=\"cm-def\">EnableEurekaServer<\/span> {<\/span>\r\n<span role=\"presentation\">}<\/span><\/pre>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u6b64\u5904\u5229\u7528spring\u63d0\u4f9b\u7684<\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>@Import<\/code><\/span><span class=\"md-plain\">\u6ce8\u89e3\uff0c\u5c06<\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>EurekaServerMarkerConfiguration<\/code><\/span><span class=\"md-plain\">\u52a8\u6001\u6ce8\u5165\u5230spring \u5bb9\u5668\u4e2d\uff0c\u8fd9\u4e5f\u521a\u597d\u63d0\u4f9b\u4e86\u4e0a\u9762spring factories\u91cc<\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>EurekaServerAutoConfiguration<\/code><\/span><span class=\"md-plain\">\u5b9e\u4f8b\u5316\u7684\u524d\u63d0\uff1a\u5fc5\u987b\u6709<\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>EurekaServerMarkerConfiguration<\/code><\/span><span class=\"md-plain\">\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5373\u542f\u52a8\u65f6\u521d\u59cb\u5316\u987a\u5e8f\uff1a<\/span><\/p>\n<ul class=\"ul-list\" data-mark=\"-\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u6dfb\u52a0<\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>EnableEurekaServer<\/code><\/span><span class=\"md-plain\">\u6ce8\u89e3\u540e\uff0c\u901a\u8fc7@Import\u5f15\u5165<\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>EurekaServerMarkerConfiguration<\/code><\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5229\u7528spring factories\uff0c\u52a0\u8f7d<\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>EurekaServerAutoConfiguration<\/code><\/span><\/p>\n<\/li>\n<\/ul>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u5f00\u542f\u6ce8\u518c<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5728spring-cloud-netflix-eureka-server:2.2.2.RELEASE\u4e2d\uff0c<\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>EurekaServerAutoConfiguration<\/code><\/span><span class=\"md-plain\">\u58f0\u660e\u5982\u4e0b\uff1a<\/span><\/p>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"java\" spellcheck=\"false\"><span role=\"presentation\"><span class=\"cm-meta\">@Configuration<\/span>(<span class=\"cm-variable\">proxyBeanMethods<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-atom\">false<\/span>)<\/span>\r\n<span role=\"presentation\"><span class=\"cm-meta\">@Import<\/span>(<span class=\"cm-variable\">EurekaServerInitializerConfiguration<\/span>.<span class=\"cm-keyword\">class<\/span>)<\/span>\r\n<span role=\"presentation\"><span class=\"cm-meta\">@ConditionalOnBean<\/span>(<span class=\"cm-variable\">EurekaServerMarkerConfiguration<\/span>.<span class=\"cm-variable\">Marker<\/span>.<span class=\"cm-keyword\">class<\/span>)<\/span>\r\n<span role=\"presentation\"><span class=\"cm-meta\">@EnableConfigurationProperties<\/span>({ <span class=\"cm-variable\">EurekaDashboardProperties<\/span>.<span class=\"cm-keyword\">class<\/span>,<\/span>\r\n<span role=\"presentation\">        <span class=\"cm-variable\">InstanceRegistryProperties<\/span>.<span class=\"cm-keyword\">class<\/span> })<\/span>\r\n<span role=\"presentation\"><span class=\"cm-meta\">@PropertySource<\/span>(<span class=\"cm-string\">\"classpath:\/eureka\/server.properties\"<\/span>)<\/span>\r\n<span role=\"presentation\"><span class=\"cm-keyword\">public<\/span> <span class=\"cm-keyword\">class<\/span> <span class=\"cm-def\">EurekaServerAutoConfiguration<\/span> <span class=\"cm-keyword\">implements<\/span> <span class=\"cm-variable\">WebMvcConfigurer<\/span> {<\/span>\r\n<span role=\"presentation\"> \u00a0  ......<\/span>\r\n<span role=\"presentation\">}<\/span><\/pre>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5176\u4e2d\uff0c\u901a\u8fc7@Import\u5f15\u5165\u7684<\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>EurekaServerInitializerConfiguration<\/code><\/span><span class=\"md-plain\">\u7c7b\u58f0\u660e\u5982\u4e0b\uff1a<\/span><\/p>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"java\" spellcheck=\"false\"><span role=\"presentation\"><span class=\"cm-meta\">@Configuration<\/span>(<span class=\"cm-variable\">proxyBeanMethods<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-atom\">false<\/span>)<\/span>\r\n<span role=\"presentation\"><span class=\"cm-keyword\">public<\/span> <span class=\"cm-keyword\">class<\/span> <span class=\"cm-def\">EurekaServerInitializerConfiguration<\/span><\/span>\r\n<span role=\"presentation\">        <span class=\"cm-keyword\">implements<\/span> <span class=\"cm-variable\">ServletContextAware<\/span>, <span class=\"cm-variable\">SmartLifecycle<\/span>, <span class=\"cm-variable\">Ordered<\/span> {<\/span>\r\n<span role=\"presentation\"> \u00a0  ......<\/span>\r\n<span role=\"presentation\">}<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<\/span><\/pre>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">SmartLifecycle\u7684\u4f5c\u7528\u662f\uff1a\u521d\u59cb\u5316\u5b8c\u4e4b\u540e\uff0c\u6267\u884cpublic void start()\u65b9\u6cd5\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u800c<\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>EurekaServerInitializerConfiguration<\/code><\/span><span class=\"md-plain\">\u4e2dstart()\u65b9\u6cd5\uff1a<\/span><\/p>\n<ul class=\"ul-list\" data-mark=\"-\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u542f\u52a8\u4e00\u4e2a\u7ebf\u7a0b\uff1b<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u4e0a\u4e0b\u6587\u521d\u59cb\u5316<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5229\u7528spring\u7684\u4e8b\u4ef6\u673a\u5236\uff0c\u53d1\u5e03\u4e00\u4e2aEurekaRegistryAvailableEvent\u4e8b\u4ef6<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u66f4\u6539running\u72b6\u6001<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5229\u7528spring\u7684\u4e8b\u4ef6\u673a\u5236\uff0c\u53d1\u5e03\u4e00\u4e2aEurekaServerStartedEvent\u4e8b\u4ef6<\/span><\/p>\n<\/li>\n<\/ul>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5728\u8fd9\u4e2astart() \u4e0a\u4e0b\u6587\u521d\u59cb\u5316\u8fd9\u4e00\u6b65\uff0c\u8fd8\u4f1a\u4ece\u76f8\u90bbeureka\u8282\u70b9\u6ce8\u518c\u8868\uff0c\u65b9\u6cd5\u8c03\u7528\u8def\u5f84\u5982\u4e0b\uff1a<\/span><\/p>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"text\" spellcheck=\"false\"><span role=\"presentation\">EurekaServerInitializerConfiguration#start()<\/span>\r\n<span role=\"presentation\">    EurekaServerBoostrap#contextInitialized(ServletContext context)<\/span>\r\n<span role=\"presentation\">        EurekaServerBoostrap#initEurekaServerContext()<\/span>\r\n<span role=\"presentation\">            \/\/ Copy registry from neighboring eureka node  \u6b64\u5904\u8fdb\u884c\u590d\u5236\u76f8\u90bbeureka\u6ce8\u518c\u8868\u7684\u64cd\u4f5c<\/span>\r\n<span role=\"presentation\">            int registryCount = this.registry.syncUp();<\/span><\/pre>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5728EurekaServerAutoConfiguration\u4e2d\u4f1a\u5b9e\u4f8b\u5316<\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>EurekaServerContext<\/code><\/span><span class=\"md-plain\">\uff0c\u4ee3\u7801\u5982\u4e0b\uff1a<\/span><\/p>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"java\" spellcheck=\"false\"><span role=\"presentation\">    <span class=\"cm-meta\">@Bean<\/span><\/span>\r\n<span role=\"presentation\">    <span class=\"cm-meta\">@ConditionalOnMissingBean<\/span><\/span>\r\n<span role=\"presentation\">    <span class=\"cm-keyword\">public<\/span> <span class=\"cm-variable\">EurekaServerContext<\/span> <span class=\"cm-def\">eurekaServerContext<\/span>(<span class=\"cm-variable\">ServerCodecs<\/span> <span class=\"cm-variable\">serverCodecs<\/span>,<\/span>\r\n<span role=\"presentation\">            <span class=\"cm-variable\">PeerAwareInstanceRegistry<\/span> <span class=\"cm-variable\">registry<\/span>, <span class=\"cm-variable\">PeerEurekaNodes<\/span> <span class=\"cm-variable\">peerEurekaNodes<\/span>) {<\/span>\r\n<span role=\"presentation\">        <span class=\"cm-keyword\">return<\/span> <span class=\"cm-keyword\">new<\/span> <span class=\"cm-variable\">DefaultEurekaServerContext<\/span>(<span class=\"cm-keyword\">this<\/span>.<span class=\"cm-variable\">eurekaServerConfig<\/span>, <span class=\"cm-variable\">serverCodecs<\/span>,<\/span>\r\n<span role=\"presentation\">                <span class=\"cm-variable\">registry<\/span>, <span class=\"cm-variable\">peerEurekaNodes<\/span>, <span class=\"cm-keyword\">this<\/span>.<span class=\"cm-variable\">applicationInfoManager<\/span>);<\/span>\r\n<span role=\"presentation\">    }<\/span><\/pre>\n<p class=\"md-end-block md-p\"><span class=\"md-pair-s\" spellcheck=\"false\"><code>DefaultEurekaServerContext<\/code><\/span><span class=\"md-plain\">\u4e2d\u521d\u59cb\u5316\u4ee3\u7801\u5982\u4e0b\uff1a<\/span><\/p>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"java\" spellcheck=\"false\"><span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-meta\">@PostConstruct<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-meta\">@Override<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-keyword\">public<\/span> <span class=\"cm-variable-3\">void<\/span> <span class=\"cm-def\">initialize<\/span>() {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">logger<\/span>.<span class=\"cm-variable\">info<\/span>(<span class=\"cm-string\">\"Initializing ...\"<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-comment\">\/\/\u542f\u52a8\u4e00\u4e2a\u53ea\u62e5\u6709\u4e00\u4e2a\u7ebf\u7a0b\u7684\u7ebf\u7a0b\u6c60\uff0c\u7b2c\u4e00\u6b21\u8fdb\u53bb\u4f1a\u66f4\u65b0\u4e00\u4e0b\u96c6\u7fa4\u5176\u4ed6\u8282\u70b9\u4fe1\u606f\u3002<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">peerEurekaNodes<\/span>.<span class=\"cm-variable\">start<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">try<\/span> {<\/span>\r\n<span role=\"presentation\">        <span class=\"cm-comment\">\/\/\u8c03\u7528PeerAwareInstanceRegistryImpl\u7684init\u65b9\u6cd5<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">registry<\/span>.<span class=\"cm-variable\">init<\/span>(<span class=\"cm-variable\">peerEurekaNodes<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0  } <span class=\"cm-keyword\">catch<\/span> (<span class=\"cm-variable\">Exception<\/span> <span class=\"cm-variable\">e<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">throw<\/span> <span class=\"cm-keyword\">new<\/span> <span class=\"cm-variable\">RuntimeException<\/span>(<span class=\"cm-variable\">e<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">logger<\/span>.<span class=\"cm-variable\">info<\/span>(<span class=\"cm-string\">\"Initialized\"<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0  }<\/span><\/pre>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5728spring-cloud-netflix-eureka-server\u4e2d\uff0c<\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>PeerAwareInstanceRegistryImpl<\/code><\/span><span class=\"md-plain\">\u7684\u7ee7\u627f\/\u5b9e\u73b0\u5173\u7cfb\u53c2\u89c1\u4e0b\u56fe\uff1a<\/span><\/p>\n<h2 class=\"md-end-block md-heading\"><span class=\"md-plain\"><img loading=\"lazy\" class=\"size-large wp-image-891 aligncenter\" src=\"http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/eureka-server-instance-registry-class-diagram-1024x453.png\" alt=\"\" width=\"695\" height=\"307\" srcset=\"http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/eureka-server-instance-registry-class-diagram-1024x453.png 1024w, http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/eureka-server-instance-registry-class-diagram-300x133.png 300w, http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/eureka-server-instance-registry-class-diagram-768x340.png 768w, http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/eureka-server-instance-registry-class-diagram.png 1205w\" sizes=\"(max-width: 695px) 100vw, 695px\" \/><\/span><\/h2>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">eureka server\u56f4\u7ed5\u6ce8\u518c\u8868\u7ba1\u7406\u7684\uff0c\u4e5f\u5c31\u662f\u4e0a\u9762\u7684InstanceRegistry\u3002<\/span><\/p>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u6ce8\u518c\u8868\u7ba1\u7406\u6838\u5fc3\u7c7b InstanceRegistry<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u53c2\u8003\u4e0a\u56fe\uff0c\u4f9d\u6b21\u8bf4\u660e\u5982\u4e0b\uff1a<\/span><\/p>\n<ul class=\"ul-list\" data-mark=\"-\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">InstanceRegistry<\/span><\/p>\n<ul class=\"ul-list\" data-mark=\"-\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u6709\u4e24\u79cdInstanceRegistry\uff0c\u53c2\u8003\u5982\u4e0b\uff1a<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">com.netflix.eureka.registry.InstanceRegistry\u662feuraka server\u4e2d\u6ce8\u518c\u8868\u7ba1\u7406\u7684\u6838\u5fc3\u63a5\u53e3\u3002\u804c\u8d23\u662f\u5728\u5185\u5b58\u4e2d\u7ba1\u7406\u6ce8\u518c\u5230Eureka Server\u4e2d\u7684\u670d\u52a1\u5b9e\u4f8b\u4fe1\u606f\u3002\u5b9e\u73b0\u7c7b\u6709PeerAwareInstanceRegistryImpl\u3002<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">org.springframework.cloud.netflix.eureka.server.InstanceRegistry \u5bf9PeerAwareInstanceRegistryImpl\u8fdb\u884c\u4e86\u7ee7\u627f\u548c\u6269\u5c55\uff0c\u4f7f\u5176\u9002\u914dSpring cloud\u7684\u4f7f\u7528\u73af\u5883\uff0c\u4e3b\u8981\u7684\u5b9e\u73b0\u7531PeerAwareInstanceRegistryImpl\u63d0\u4f9b\u3002<\/span><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">LeaseManager<\/span><\/p>\n<ul class=\"ul-list\" data-mark=\"-\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5bf9\u6ce8\u518c\u5230Eureka Server\u4e2d\u7684\u670d\u52a1\u5b9e\u4f8b\u79df\u7ea6\u8fdb\u884c\u7ba1\u7406\uff0c\u65b9\u6cd5\u6709\uff1a\u670d\u52a1\u6ce8\u518c\uff0c\u4e0b\u7ebf\uff0c\u7eed\u7ea6\uff0c\u5254\u9664\u3002\u6b64\u63a5\u53e3\u7ba1\u7406\u7684\u7c7b\u76ee\u524d\u662fInstanceInfo\u3002InstanceInfo\u4ee3\u8868\u670d\u52a1\u5b9e\u4f8b\u4fe1\u606f\u3002<\/span><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">LookupService<\/span><\/p>\n<ul class=\"ul-list\" data-mark=\"-\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u63d0\u4f9b\u670d\u52a1\u5b9e\u4f8b\u7684\u68c0\u7d22\u67e5\u8be2\u529f\u80fd\u3002<\/span><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">PeerAwareInstanceRegistryImpl<\/span><\/p>\n<ul class=\"ul-list\" data-mark=\"-\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u589e\u52a0\u4e86\u5bf9peer\u8282\u70b9\u7684\u540c\u6b65\u590d\u5236\u64cd\u4f5c\u3002\u4f7f\u5f97eureka server\u96c6\u7fa4\u4e2d\u6ce8\u518c\u8868\u4fe1\u606f\u4fdd\u6301\u4e00\u81f4\u3002<\/span><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u670d\u52a1\u6ce8\u518c<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">Eureka Client\u5728\u53d1\u8d77\u670d\u52a1\u6ce8\u518c\u65f6\u4f1a\u5c06\u81ea\u8eab\u7684\u670d\u52a1\u5b9e\u4f8b\u5143\u6570\u636e\u5c01\u88c5\u5728InstanceInfo\u4e2d\uff0c\u7136\u540e\u5c06InstanceInfo\u53d1\u9001\u5230Eureka Server\u3002Eureka Server\u5728\u63a5\u6536\u5230Eureka Client\u53d1\u9001\u7684InstanceInfo\u540e\u5c06\u4f1a\u5c1d\u8bd5\u5c06\u5176\u653e\u5230\u672c\u5730\u6ce8\u518c\u8868\u4e2d\u4ee5\u4f9b\u5176\u4ed6Eureka Client\u8fdb\u884c\u670d\u52a1\u53d1\u73b0\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">EurekaServerAutoConfiguration\u4e2d\u5b9a\u4e49\u4e86 public FilterRegistrationBean jerseyFilterRegistration \uff0c\u8868\u660eeureka-server\u4f7f\u7528\u4e86Jersey\u5b9e\u73b0 \u5bf9\u5916\u7684RESTful\u63a5\u53e3\u3002\u6ce8\u518c\u4e00\u4e2a Jersey \u7684 filter \uff0c\u914d\u7f6e\u597d\u76f8\u5e94\u7684Filter \u548c url\u6620\u5c04\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5728com.netflix.eureka.resources\u5305\u4e0b\uff0c\u662fEureka Server\u5bf9\u4e8eEureka client\u7684REST\u8bf7\u6c42\u7684\u5b9a\u4e49\u3002\u770bApplicationResource\u7c7b\uff08\u8fd9\u662f\u4e00\u7c7b\u8bf7\u6c42\uff0c\u5e94\u7528\u7c7b\u7684\u8bf7\u6c42\uff09\uff0c\u7c7b\u4f3c\u4e8e\u5e94\u7528@Controller\u6ce8\u89e3\uff1a@Produces({&#8220;application\/xml&#8221;, &#8220;application\/json&#8221;})\uff0c\u63a5\u53d7xml\u548cjson\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u4f8b\u5982ApplicationResource\u7c7b\u4e2d\uff0c\u6709\u5982\u4e0b\u65b9\u6cd5\uff08\u6dfb\u52a0\u5b9e\u4f8b\u63a5\u53e3\uff09\uff1a<\/span><\/p>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"java\" spellcheck=\"false\"><span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-meta\">@POST<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-meta\">@Consumes<\/span>({<span class=\"cm-string\">\"application\/json\"<\/span>, <span class=\"cm-string\">\"application\/xml\"<\/span>})<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-keyword\">public<\/span> <span class=\"cm-variable\">Response<\/span> <span class=\"cm-def\">addInstance<\/span>(<span class=\"cm-variable\">InstanceInfo<\/span> <span class=\"cm-variable\">info<\/span>,<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-meta\">@HeaderParam<\/span>(<span class=\"cm-variable\">PeerEurekaNode<\/span>.<span class=\"cm-variable\">HEADER_REPLICATION<\/span>) <span class=\"cm-variable-3\">String<\/span> <span class=\"cm-variable\">isReplication<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0  ......<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"cm-comment\">\/\/registry\u662fPeerAwareInstanceRegistry\u7c7b\u578b<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">registry<\/span>.<span class=\"cm-variable\">register<\/span>(<span class=\"cm-variable\">info<\/span>, <span class=\"cm-string\">\"true\"<\/span>.<span class=\"cm-variable\">equals<\/span>(<span class=\"cm-variable\">isReplication<\/span>));<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0  ......<\/span>\r\n<span role=\"presentation\"> \u00a0  }<\/span><\/pre>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u4e0a\u9762\u7684<\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>registry.register<\/code><\/span><span class=\"md-plain\">\u65b9\u6cd5\uff0c\u53ef\u4ee5\u8ffd\u6eaf\u5230<\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>PeerAwareInstanceRegistryImpl<\/code><\/span><span class=\"md-plain\">\u7684\u65b9\u6cd5\uff1apublic void register(final InstanceInfo info, final boolean isReplication) \uff0c\u4e2d\u6709\u4e00\u53e5\uff1asuper.register(info, leaseDuration, isReplication); <\/span> <span class=\"md-plain\"> \u5c06\u4f1a\u8fdb\u5165\uff1a<\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>com.netflix.eureka.registry.AbstractInstanceRegistry<\/code><\/span><span class=\"md-plain\">\u7684 register\u65b9\u6cd5<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\"> \u5728register\u65b9\u6cd5\u4e2d\uff0c\u670d\u52a1\u5b9e\u4f8b\u7684InstanceInfo\u4fdd\u5b58\u5728Lease\u4e2d\uff0cLease\u5728AbstractInstanceRegistry\u4e2d\u7edf\u4e00\u901a\u8fc7ConcurrentHashMap\u4fdd\u5b58\u5728\u5185\u5b58\u4e2d\u3002\u5728\u670d\u52a1\u6ce8\u518c\u8fc7\u7a0b\u4e2d\uff0c\u4f1a\u5148\u83b7\u53d6\u4e00\u4e2a\u8bfb\u9501\uff0c\u9632\u6b62\u5176\u4ed6\u7ebf\u7a0b\u5bf9registry\u6ce8\u518c\u8868\u8fdb\u884c\u6570\u636e\u64cd\u4f5c\uff0c\u907f\u514d\u6570\u636e\u7684\u4e0d\u4e00\u81f4\u3002\u7136\u540e\u4eceresgitry\u67e5\u8be2\u5bf9\u5e94\u7684InstanceInfo\u79df\u7ea6\u662f\u5426\u5df2\u7ecf\u5b58\u5728\u6ce8\u518c\u8868\u4e2d\uff0c\u6839\u636eappName\u5212\u5206\u670d\u52a1\u96c6\u7fa4\uff0c\u4f7f\u7528InstanceId\u552f\u4e00\u6807\u8bb0\u670d\u52a1\u5b9e\u4f8b\u3002<\/span><\/p>\n<ul class=\"ul-list\" data-mark=\"-\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5982\u679c\u79df\u7ea6\u5b58\u5728\uff0c\u6bd4\u8f83\u4e24\u4e2a\u79df\u7ea6\u4e2d\u7684InstanceInfo\u7684\u6700\u540e\u66f4\u65b0\u65f6\u95f4lastDirtyTimestamp\uff0c\u4fdd\u7559\u65f6\u95f4\u6233\u5927\u7684\u670d\u52a1\u5b9e\u4f8b\u4fe1\u606fInstanceInfo\u3002<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5982\u679c\u79df\u7ea6\u4e0d\u5b58\u5728\uff0c\u610f\u5473\u8fd9\u662f\u4e00\u6b21\u5168\u65b0\u7684\u670d\u52a1\u6ce8\u518c\uff0c\u5c06\u4f1a\u8fdb\u884c\u81ea\u6211\u4fdd\u62a4\u7684\u7edf\u8ba1\uff0c\u521b\u5efa\u65b0\u7684\u79df\u7ea6\u4fdd\u5b58InstanceInfo\u3002\u63a5\u7740\u5c06\u79df\u7ea6\u653e\u5230resgitry\u6ce8\u518c\u8868\u4e2d\u3002<\/span><\/p>\n<\/li>\n<\/ul>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u4e4b\u540e\u5c06\u8fdb\u884c\u4e00\u7cfb\u5217\u7f13\u5b58\u64cd\u4f5c\u5e76\u6839\u636e\u8986\u76d6\u72b6\u6001\u89c4\u5219\u8bbe\u7f6e\u670d\u52a1\u5b9e\u4f8b\u7684\u72b6\u6001\uff0c\u7f13\u5b58\u64cd\u4f5c\u5305\u62ec\u5c06InstanceInfo\u52a0\u5165\u7528\u4e8e\u7edf\u8ba1Eureka Client\u589e\u91cf\u5f0f\u83b7\u53d6\u6ce8\u518c\u8868\u4fe1\u606f\u7684recentlyChangedQueue\u548c\u5931\u6548responseCache\u4e2d\u5bf9\u5e94\u7684\u7f13\u5b58\u3002\u6700\u540e\u8bbe\u7f6e\u670d\u52a1\u5b9e\u4f8b\u79df\u7ea6\u7684\u4e0a\u7ebf\u65f6\u95f4\u7528\u4e8e\u8ba1\u7b97\u79df\u7ea6\u7684\u6709\u6548\u65f6\u95f4\uff0c\u91ca\u653e\u8bfb\u9501\u5e76\u5b8c\u6210\u670d\u52a1\u6ce8\u518c\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u6d41\u7a0b\u56fe\u5982\u4e0b\uff1a<\/span><\/p>\n<p class=\"md-end-block md-p\"><img loading=\"lazy\" class=\"size-large wp-image-892 aligncenter\" src=\"http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/Eureka\u670d\u52a1\u7aef\u6ce8\u518c-579x1024.png\" alt=\"\" width=\"579\" height=\"1024\" srcset=\"http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/Eureka\u670d\u52a1\u7aef\u6ce8\u518c-579x1024.png 579w, http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/Eureka\u670d\u52a1\u7aef\u6ce8\u518c-170x300.png 170w, http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/Eureka\u670d\u52a1\u7aef\u6ce8\u518c-768x1359.png 768w, http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/Eureka\u670d\u52a1\u7aef\u6ce8\u518c-868x1536.png 868w, http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/Eureka\u670d\u52a1\u7aef\u6ce8\u518c.png 925w\" sizes=\"(max-width: 579px) 100vw, 579px\" \/><\/p>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u63a5\u6536\u670d\u52a1\u5fc3\u8df3\u8bf7\u6c42<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5728Eureka Client\u5b8c\u6210\u670d\u52a1\u6ce8\u518c\u4e4b\u540e\uff0c\u5b83\u9700\u8981\u5b9a\u65f6\u5411Eureka Server\u53d1\u9001\u5fc3\u8df3\u8bf7\u6c42(\u9ed8\u8ba430\u79d2\u4e00\u6b21)\uff0c\u7ef4\u6301\u81ea\u5df1\u5728Eureka Server\u4e2d\u79df\u7ea6\u7684\u6709\u6548\u6027\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u6b64\u4ee3\u7801\u5b9e\u73b0\u5728com.netflix.eureka.resources.InstanceResource\u4e2d\uff0c\u53c2\u89c1\u6b64\u65b9\u6cd5\uff1a<\/span><\/p>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"java\" spellcheck=\"false\"><span role=\"presentation\"><span class=\"cm-meta\">@PUT<\/span><\/span>\r\n<span role=\"presentation\"><span class=\"cm-keyword\">public<\/span> <span class=\"cm-variable\">Response<\/span> <span class=\"cm-def\">renewLease<\/span>(<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-meta\">@HeaderParam<\/span>(<span class=\"cm-variable\">PeerEurekaNode<\/span>.<span class=\"cm-variable\">HEADER_REPLICATION<\/span>) <span class=\"cm-variable-3\">String<\/span> <span class=\"cm-variable\">isReplication<\/span>,<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-meta\">@QueryParam<\/span>(<span class=\"cm-string\">\"overriddenstatus\"<\/span>) <span class=\"cm-variable-3\">String<\/span> <span class=\"cm-variable\">overriddenStatus<\/span>,<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-meta\">@QueryParam<\/span>(<span class=\"cm-string\">\"status\"<\/span>) <span class=\"cm-variable-3\">String<\/span> <span class=\"cm-variable\">status<\/span>,<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-meta\">@QueryParam<\/span>(<span class=\"cm-string\">\"lastDirtyTimestamp\"<\/span>) <span class=\"cm-variable-3\">String<\/span> <span class=\"cm-variable\">lastDirtyTimestamp<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0  ......<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-variable-3\">boolean<\/span> <span class=\"cm-variable\">isSuccess<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">registry<\/span>.<span class=\"cm-variable\">renew<\/span>(<span class=\"cm-variable\">app<\/span>.<span class=\"cm-variable\">getName<\/span>(), <span class=\"cm-variable\">id<\/span>, <span class=\"cm-variable\">isFromReplicaNode<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0  ......<\/span>\r\n<span role=\"presentation\">}<\/span><\/pre>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">registry\u7c7b\u578b\u4e3a<\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>PeerAwareInstanceRegistry<\/code><\/span><span class=\"md-plain\">\uff0c\u8ffd\u6eaf\u540e\u4f1a\u53d1\u73b0\u6700\u7ec8\u5b9e\u73b0\u662f\u5728<\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>AbstractInstanceRegistry<\/code><\/span><span class=\"md-plain\">#renew\u65b9\u6cd5\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">renew\u65b9\u6cd5\u662f\u5bf9Eureka Client\u4f4d\u4e8e\u6ce8\u518c\u8868\u4e2d\u7684\u79df\u7ea6\u7684\u7eed\u79df\u64cd\u4f5c\uff0c\u4e0d\u50cfregister\u65b9\u6cd5\u9700\u8981\u670d\u52a1\u5b9e\u4f8b\u4fe1\u606f\uff0c\u4ec5\u6839\u636e\u670d\u52a1\u5b9e\u4f8b\u7684\u670d\u52a1\u540d\u548c\u670d\u52a1\u5b9e\u4f8bid\u5373\u53ef\u66f4\u65b0\u5bf9\u5e94\u79df\u7ea6\u7684\u6709\u6548\u65f6\u95f4\u3002<\/span><\/p>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"java\" spellcheck=\"false\"><span role=\"presentation\"><span class=\"cm-keyword\">public<\/span> <span class=\"cm-variable-3\">boolean<\/span> <span class=\"cm-def\">renew<\/span>(<span class=\"cm-variable-3\">String<\/span> <span class=\"cm-variable\">appName<\/span>, <span class=\"cm-variable-3\">String<\/span> <span class=\"cm-variable\">id<\/span>, <span class=\"cm-variable-3\">boolean<\/span> <span class=\"cm-variable\">isReplication<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">RENEW<\/span>.<span class=\"cm-variable\">increment<\/span>(<span class=\"cm-variable\">isReplication<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 <span class=\"cm-comment\">\/\/\u6839\u636eappName\u83b7\u53d6\u670d\u52a1\u96c6\u7fa4\u7684\u79df\u7ea6\u96c6\u5408<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">Map<\/span><span class=\"cm-operator\">&lt;<\/span><span class=\"cm-variable-3\">String<\/span>, <span class=\"cm-variable\">Lease<\/span><span class=\"cm-operator\">&lt;<\/span><span class=\"cm-variable\">InstanceInfo<\/span><span class=\"cm-operator\">&gt;&gt;<\/span> <span class=\"cm-variable\">gMap<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">registry<\/span>.<span class=\"cm-variable\">get<\/span>(<span class=\"cm-variable\">appName<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">Lease<\/span><span class=\"cm-operator\">&lt;<\/span><span class=\"cm-variable\">InstanceInfo<\/span><span class=\"cm-operator\">&gt;<\/span> <span class=\"cm-variable\">leaseToRenew<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-atom\">null<\/span>;<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-variable\">gMap<\/span> <span class=\"cm-operator\">!=<\/span> <span class=\"cm-atom\">null<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">leaseToRenew<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">gMap<\/span>.<span class=\"cm-variable\">get<\/span>(<span class=\"cm-variable\">id<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-variable\">leaseToRenew<\/span> <span class=\"cm-operator\">==<\/span> <span class=\"cm-atom\">null<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">RENEW_NOT_FOUND<\/span>.<span class=\"cm-variable\">increment<\/span>(<span class=\"cm-variable\">isReplication<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">logger<\/span>.<span class=\"cm-variable\">warn<\/span>(<span class=\"cm-string\">\"DS: Registry: lease doesn't exist, registering resource: {} - {}\"<\/span>, <span class=\"cm-variable\">appName<\/span>, <span class=\"cm-variable\">id<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">return<\/span> <span class=\"cm-atom\">false<\/span>;<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0  } <span class=\"cm-keyword\">else<\/span> {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">InstanceInfo<\/span> <span class=\"cm-variable\">instanceInfo<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">leaseToRenew<\/span>.<span class=\"cm-variable\">getHolder<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-variable\">instanceInfo<\/span> <span class=\"cm-operator\">!=<\/span> <span class=\"cm-atom\">null<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-comment\">\/\/ touchASGCache(instanceInfo.getASGName());<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-comment\">\/\/\u67e5\u770b\u670d\u52a1\u5b9e\u4f8b\u72b6\u6001<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">InstanceStatus<\/span> <span class=\"cm-variable\">overriddenInstanceStatus<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-keyword\">this<\/span>.<span class=\"cm-variable\">getOverriddenInstanceStatus<\/span>(<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">instanceInfo<\/span>, <span class=\"cm-variable\">leaseToRenew<\/span>, <span class=\"cm-variable\">isReplication<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-variable\">overriddenInstanceStatus<\/span> <span class=\"cm-operator\">==<\/span> <span class=\"cm-variable\">InstanceStatus<\/span>.<span class=\"cm-variable\">UNKNOWN<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">logger<\/span>.<span class=\"cm-variable\">info<\/span>(<span class=\"cm-string\">\"Instance status UNKNOWN possibly due to deleted override for instance {}\"<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-operator\">+<\/span> <span class=\"cm-string\">\"; re-register required\"<\/span>, <span class=\"cm-variable\">instanceInfo<\/span>.<span class=\"cm-variable\">getId<\/span>());<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">RENEW_NOT_FOUND<\/span>.<span class=\"cm-variable\">increment<\/span>(<span class=\"cm-variable\">isReplication<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">return<\/span> <span class=\"cm-atom\">false<\/span>;<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-operator\">!<\/span><span class=\"cm-variable\">instanceInfo<\/span>.<span class=\"cm-variable\">getStatus<\/span>().<span class=\"cm-variable\">equals<\/span>(<span class=\"cm-variable\">overriddenInstanceStatus<\/span>)) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">logger<\/span>.<span class=\"cm-variable\">info<\/span>(<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-string\">\"The instance status {} is different from overridden instance status {} for instance {}. \"<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-operator\">+<\/span> <span class=\"cm-string\">\"Hence setting the status to overridden status\"<\/span>, <span class=\"cm-variable\">instanceInfo<\/span>.<span class=\"cm-variable\">getStatus<\/span>().<span class=\"cm-variable\">name<\/span>(),<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">instanceInfo<\/span>.<span class=\"cm-variable\">getOverriddenStatus<\/span>().<span class=\"cm-variable\">name<\/span>(),<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">instanceInfo<\/span>.<span class=\"cm-variable\">getId<\/span>());<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">instanceInfo<\/span>.<span class=\"cm-variable\">setStatusWithoutDirty<\/span>(<span class=\"cm-variable\">overriddenInstanceStatus<\/span>);<\/span>\r\n<span role=\"presentation\">\u200b<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"cm-comment\">\/\/\u7edf\u8ba1\u6bcf\u5206\u949f\u7eed\u79df\u6b21\u6570<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">renewsLastMin<\/span>.<span class=\"cm-variable\">increment<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"cm-comment\">\/\/\u66f4\u65b0\u79df\u7ea6<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">leaseToRenew<\/span>.<span class=\"cm-variable\">renew<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">return<\/span> <span class=\"cm-atom\">true<\/span>;<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0  }<\/span><\/pre>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\"> \u6b64\u65b9\u6cd5\u4e2d\u4e0d\u5173\u6ce8InstanceInfo\uff0c\u4ec5\u5173\u6ce8\u4e8e\u79df\u7ea6\u672c\u8eab\u4ee5\u53ca\u79df\u7ea6\u7684\u670d\u52a1\u5b9e\u4f8b\u72b6\u6001\u3002\u5982\u679c\u6839\u636e\u670d\u52a1\u5b9e\u4f8b\u7684appName\u548cinstanceInfoId\u67e5\u8be2\u51fa\u670d\u52a1\u5b9e\u4f8b\u7684\u79df\u7ea6\uff0c\u5e76\u4e14\u6839\u636e#getOverriddenInstanceStatus\u65b9\u6cd5\u5f97\u5230\u7684instanceStatus\u4e0d\u4e3aInstanceStatus.UNKNOWN\uff0c\u90a3\u4e48\u66f4\u65b0\u79df\u7ea6\u4e2d\u7684\u6709\u6548\u65f6\u95f4\uff0c\u5373\u66f4\u65b0\u79df\u7ea6Lease\u4e2d\u7684lastUpdateTimestamp\uff0c\u8fbe\u5230\u7eed\u7ea6\u7684\u76ee\u7684\uff1b\u5982\u679c\u79df\u7ea6\u4e0d\u5b58\u5728\uff0c\u90a3\u4e48\u8fd4\u56de\u7eed\u79df\u5931\u8d25\u7684\u7ed3\u679c\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u4e0b\u56fe\u7ed9\u51fa\u4e86eureka\u670d\u52a1\u7aef\u63a5\u6536\u5fc3\u8df3\u3001\u79df\u7ea6\u66f4\u65b0\u6d41\u7a0b\u3002<\/span><\/p>\n<h2 class=\"md-end-block md-heading\"><span class=\"md-plain\"><img loading=\"lazy\" class=\"size-full wp-image-893 aligncenter\" src=\"http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/Eureka\u670d\u52a1\u7aef\u63a5\u6536\u5fc3\u8df3.png\" alt=\"\" width=\"761\" height=\"586\" srcset=\"http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/Eureka\u670d\u52a1\u7aef\u63a5\u6536\u5fc3\u8df3.png 761w, http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/Eureka\u670d\u52a1\u7aef\u63a5\u6536\u5fc3\u8df3-300x231.png 300w\" sizes=\"(max-width: 761px) 100vw, 761px\" \/><\/span><\/h2>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u670d\u52a1\u5254\u9664<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5982\u679cEureka Client\u5728\u6ce8\u518c\u540e\uff0c\u65e2\u6ca1\u6709\u7eed\u7ea6\uff0c\u4e5f\u6ca1\u6709\u4e0b\u7ebf(\u670d\u52a1\u5d29\u6e83\u6216\u8005\u7f51\u7edc\u5f02\u5e38\u7b49\u539f\u56e0)\uff0c\u90a3\u4e48\u670d\u52a1\u7684\u72b6\u6001\u5c31\u5904\u4e8e\u4e0d\u53ef\u77e5\u7684\u72b6\u6001\uff0c\u4e0d\u80fd\u4fdd\u8bc1\u80fd\u591f\u4ece\u8be5\u670d\u52a1\u5b9e\u4f8b\u4e2d\u83b7\u53d6\u5230\u56de\u9988\uff0c\u6240\u4ee5\u9700\u8981\u670d\u52a1\u5254\u9664\u6b64\u65b9\u6cd5\u5b9a\u65f6\u6e05\u7406\u8fd9\u4e9b\u4e0d\u7a33\u5b9a\u7684\u670d\u52a1\uff0c\u8be5\u65b9\u6cd5\u4f1a\u6279\u91cf\u5c06\u6ce8\u518c\u8868\u4e2d\u6240\u6709\u8fc7\u671f\u79df\u7ea6\u5254\u9664\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\"> \u5254\u9664\u662f\u5b9a\u65f6\u4efb\u52a1\uff0c\u9ed8\u8ba460\u79d2\u6267\u884c\u4e00\u6b21\u3002\u5ef6\u65f660\u79d2\uff0c\u95f4\u969460\u79d2<\/span> <span class=\"md-plain\"> evictionTimer.schedule(evictionTaskRef.get(),<\/span> <span class=\"md-plain\"> serverConfig.getEvictionIntervalTimerInMs(),<\/span> <span class=\"md-plain\"> serverConfig.getEvictionIntervalTimerInMs());<\/span> <span class=\"md-plain\"> \u4ece\u4e0a\u9762eureka server\u542f\u52a8\u6765\u770b\uff0c\u5254\u9664\u7684\u4efb\u52a1\uff0c\u662f\u7ebf\u7a0b\u542f\u52a8\u7684\uff0c\u6267\u884c\u7684\u662f\u4e0b\u9762\u7684\u65b9\u6cd5\u3002<\/span> <span class=\"md-pair-s\" spellcheck=\"false\"><code>com.netflix.eureka.registry.AbstractInstanceRegistry<\/code><\/span><span class=\"md-plain\">#evict<\/span><\/p>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"java\" spellcheck=\"false\"><span role=\"presentation\">\u200b<\/span>\r\n<span role=\"presentation\"><span class=\"cm-comment\">\/\/isLeaseExpirationEnabled\u5728<\/span><\/span>\r\n<span role=\"presentation\"><span class=\"cm-keyword\">public<\/span> <span class=\"cm-variable-3\">boolean<\/span> <span class=\"cm-def\">isLeaseExpirationEnabled\u5728<\/span>() {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-operator\">!<\/span><span class=\"cm-variable\">isSelfPreservationModeEnabled<\/span>()) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-comment\">\/\/\u6b64\u5904\u83b7\u53d6\u81ea\u6211\u4fdd\u62a4\u6a21\u5f0f\u5f00\u5173\u72b6\u6001\uff0c\u6700\u7ec8\u5bf9\u5e94\u4e8eEurekaServerConfigBean\u7c7b\u4e2d\u7684enableSelfPreservation\u914d\u7f6e\u9879\uff0c<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-comment\">\/\/ The self preservation mode is disabled, hence allowing the instances to expire.<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">return<\/span> <span class=\"cm-atom\">true<\/span>;<\/span>\r\n<span role=\"presentation\"> \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-keyword\">return<\/span> <span class=\"cm-variable\">numberOfRenewsPerMinThreshold<\/span> <span class=\"cm-operator\">&gt;<\/span> <span class=\"cm-number\">0<\/span> <span class=\"cm-operator\">&amp;&amp;<\/span> <span class=\"cm-variable\">getNumOfRenewsInLastMin<\/span>() <span class=\"cm-operator\">&gt;<\/span> <span class=\"cm-variable\">numberOfRenewsPerMinThreshold<\/span>;<\/span>\r\n<span role=\"presentation\">}<\/span>\r\n<span role=\"presentation\">\u200b<\/span>\r\n<span role=\"presentation\"><span class=\"cm-keyword\">public<\/span> <span class=\"cm-variable-3\">void<\/span> <span class=\"cm-def\">evict<\/span>(<span class=\"cm-variable-3\">long<\/span> <span class=\"cm-variable\">additionalLeaseMs<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-variable\">logger<\/span>.<span class=\"cm-variable\">debug<\/span>(<span class=\"cm-string\">\"Running the evict task\"<\/span>);<\/span>\r\n<span role=\"presentation\">\u200b<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-operator\">!<\/span><span class=\"cm-variable\">isLeaseExpirationEnabled<\/span>()) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">logger<\/span>.<span class=\"cm-variable\">debug<\/span>(<span class=\"cm-string\">\"DS: lease expiration is currently disabled.\"<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">return<\/span>;<\/span>\r\n<span role=\"presentation\"> \u00a0  }<\/span>\r\n<span role=\"presentation\">\u200b<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-comment\">\/\/ We collect first all expired items, to evict them in random order. For large eviction sets,<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-comment\">\/\/ if we do not that, we might wipe out whole apps before self preservation kicks in. By randomizing it,<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-comment\">\/\/ the impact should be evenly distributed across all applications.<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-variable\">List<\/span><span class=\"cm-operator\">&lt;<\/span><span class=\"cm-variable\">Lease<\/span><span class=\"cm-operator\">&lt;<\/span><span class=\"cm-variable\">InstanceInfo<\/span><span class=\"cm-operator\">&gt;&gt;<\/span> <span class=\"cm-variable\">expiredLeases<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-keyword\">new<\/span> <span class=\"cm-variable\">ArrayList<\/span><span class=\"cm-operator\">&lt;&gt;<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-comment\">\/*<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-comment\">\u904d\u5386\u6ce8\u518c\u8868register\uff0c\u4f9d\u6b21\u5224\u65ad\u79df\u7ea6\u662f\u5426\u8fc7\u671f\u3002\u4e00\u6b21\u6027\u83b7\u53d6\u6240\u6709\u7684\u8fc7\u671f\u79df\u7ea6\u3002<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-comment\">*\/<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-keyword\">for<\/span> (<span class=\"cm-variable\">Entry<\/span><span class=\"cm-operator\">&lt;<\/span><span class=\"cm-variable-3\">String<\/span>, <span class=\"cm-variable\">Map<\/span><span class=\"cm-operator\">&lt;<\/span><span class=\"cm-variable-3\">String<\/span>, <span class=\"cm-variable\">Lease<\/span><span class=\"cm-operator\">&lt;<\/span><span class=\"cm-variable\">InstanceInfo<\/span><span class=\"cm-operator\">&gt;&gt;&gt;<\/span> <span class=\"cm-variable\">groupEntry<\/span> : <span class=\"cm-variable\">registry<\/span>.<span class=\"cm-variable\">entrySet<\/span>()) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">Map<\/span><span class=\"cm-operator\">&lt;<\/span><span class=\"cm-variable-3\">String<\/span>, <span class=\"cm-variable\">Lease<\/span><span class=\"cm-operator\">&lt;<\/span><span class=\"cm-variable\">InstanceInfo<\/span><span class=\"cm-operator\">&gt;&gt;<\/span> <span class=\"cm-variable\">leaseMap<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">groupEntry<\/span>.<span class=\"cm-variable\">getValue<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-variable\">leaseMap<\/span> <span class=\"cm-operator\">!=<\/span> <span class=\"cm-atom\">null<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">for<\/span> (<span class=\"cm-variable\">Entry<\/span><span class=\"cm-operator\">&lt;<\/span><span class=\"cm-variable-3\">String<\/span>, <span class=\"cm-variable\">Lease<\/span><span class=\"cm-operator\">&lt;<\/span><span class=\"cm-variable\">InstanceInfo<\/span><span class=\"cm-operator\">&gt;&gt;<\/span> <span class=\"cm-variable\">leaseEntry<\/span> : <span class=\"cm-variable\">leaseMap<\/span>.<span class=\"cm-variable\">entrySet<\/span>()) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">Lease<\/span><span class=\"cm-operator\">&lt;<\/span><span class=\"cm-variable\">InstanceInfo<\/span><span class=\"cm-operator\">&gt;<\/span> <span class=\"cm-variable\">lease<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">leaseEntry<\/span>.<span class=\"cm-variable\">getValue<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-variable\">lease<\/span>.<span class=\"cm-variable\">isExpired<\/span>(<span class=\"cm-variable\">additionalLeaseMs<\/span>) <span class=\"cm-operator\">&amp;&amp;<\/span> <span class=\"cm-variable\">lease<\/span>.<span class=\"cm-variable\">getHolder<\/span>() <span class=\"cm-operator\">!=<\/span> <span class=\"cm-atom\">null<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">expiredLeases<\/span>.<span class=\"cm-variable\">add<\/span>(<span class=\"cm-variable\">lease<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0  }<\/span>\r\n<span role=\"presentation\">\u200b<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-comment\">\/\/ To compensate for GC pauses or drifting local time, we need to use current registry size as a base for<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-comment\">\/\/ triggering self-preservation. Without that we would wipe out full registry.<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-comment\">\/\/\u83b7\u53d6\u6ce8\u518c\u8868\u79df\u7ea6\u603b\u6570<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-variable-3\">int<\/span> <span class=\"cm-variable\">registrySize<\/span> <span class=\"cm-operator\">=<\/span> (<span class=\"cm-variable-3\">int<\/span>) <span class=\"cm-variable\">getLocalRegistrySize<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-comment\">\/\/\u8ba1\u7b97\u6ce8\u518c\u8868\u79df\u7ea6\u7684\u9608\u503c \uff08\u603b\u6570\u4e58\u4ee5 \u7eed\u79df\u767e\u5206\u6bd4\uff09\uff0c\u5f97\u51fa\u8981\u7eed\u79df\u7684\u6570\u91cf<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-variable-3\">int<\/span> <span class=\"cm-variable\">registrySizeThreshold<\/span> <span class=\"cm-operator\">=<\/span> (<span class=\"cm-variable-3\">int<\/span>) (<span class=\"cm-variable\">registrySize<\/span> <span class=\"cm-operator\">*<\/span> <span class=\"cm-variable\">serverConfig<\/span>.<span class=\"cm-variable\">getRenewalPercentThreshold<\/span>());<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-comment\">\/\/\u603b\u6570\u51cf\u53bb\u8981\u7eed\u79df\u7684\u6570\u91cf\uff0c\u5c31\u662f\u7406\u8bba\u8981\u5254\u9664\u7684\u6570\u91cf \u00a0 \u00a0 \u00a0 \u00a0<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-variable-3\">int<\/span> <span class=\"cm-variable\">evictionLimit<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">registrySize<\/span> <span class=\"cm-operator\">-<\/span> <span class=\"cm-variable\">registrySizeThreshold<\/span>;<\/span>\r\n<span role=\"presentation\">    <span class=\"cm-comment\">\/\/\u6c42 \u4e0a\u9762\u7406\u8bba\u5254\u9664\u6570\u91cf\uff0c\u548c\u8fc7\u671f\u79df\u7ea6\u603b\u6570\u7684\u6700\u5c0f\u503c\u3002\u5c31\u662f\u6700\u7ec8\u8981\u63d0\u51fa\u7684\u6570\u91cf\u3002<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-variable-3\">int<\/span> <span class=\"cm-variable\">toEvict<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">Math<\/span>.<span class=\"cm-variable\">min<\/span>(<span class=\"cm-variable\">expiredLeases<\/span>.<span class=\"cm-variable\">size<\/span>(), <span class=\"cm-variable\">evictionLimit<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-variable\">toEvict<\/span> <span class=\"cm-operator\">&gt;<\/span> <span class=\"cm-number\">0<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">logger<\/span>.<span class=\"cm-variable\">info<\/span>(<span class=\"cm-string\">\"Evicting {} items (expired={}, evictionLimit={})\"<\/span>, <span class=\"cm-variable\">toEvict<\/span>, <span class=\"cm-variable\">expiredLeases<\/span>.<span class=\"cm-variable\">size<\/span>(), <span class=\"cm-variable\">evictionLimit<\/span>);<\/span>\r\n<span role=\"presentation\">\u200b<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">Random<\/span> <span class=\"cm-variable\">random<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-keyword\">new<\/span> <span class=\"cm-variable\">Random<\/span>(<span class=\"cm-variable\">System<\/span>.<span class=\"cm-variable\">currentTimeMillis<\/span>());<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">for<\/span> (<span class=\"cm-variable-3\">int<\/span> <span class=\"cm-variable\">i<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-number\">0<\/span>; <span class=\"cm-variable\">i<\/span> <span class=\"cm-operator\">&lt;<\/span> <span class=\"cm-variable\">toEvict<\/span>; <span class=\"cm-variable\">i<\/span><span class=\"cm-operator\">++<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-comment\">\/\/ Pick a random item (Knuth shuffle algorithm)<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable-3\">int<\/span> <span class=\"cm-variable\">next<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">i<\/span> <span class=\"cm-operator\">+<\/span> <span class=\"cm-variable\">random<\/span>.<span class=\"cm-variable\">nextInt<\/span>(<span class=\"cm-variable\">expiredLeases<\/span>.<span class=\"cm-variable\">size<\/span>() <span class=\"cm-operator\">-<\/span> <span class=\"cm-variable\">i<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">Collections<\/span>.<span class=\"cm-variable\">swap<\/span>(<span class=\"cm-variable\">expiredLeases<\/span>, <span class=\"cm-variable\">i<\/span>, <span class=\"cm-variable\">next<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">Lease<\/span><span class=\"cm-operator\">&lt;<\/span><span class=\"cm-variable\">InstanceInfo<\/span><span class=\"cm-operator\">&gt;<\/span> <span class=\"cm-variable\">lease<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">expiredLeases<\/span>.<span class=\"cm-variable\">get<\/span>(<span class=\"cm-variable\">i<\/span>);<\/span>\r\n<span role=\"presentation\">\u200b<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable-3\">String<\/span> <span class=\"cm-variable\">appName<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">lease<\/span>.<span class=\"cm-variable\">getHolder<\/span>().<span class=\"cm-variable\">getAppName<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable-3\">String<\/span> <span class=\"cm-variable\">id<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">lease<\/span>.<span class=\"cm-variable\">getHolder<\/span>().<span class=\"cm-variable\">getId<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">EXPIRED<\/span>.<span class=\"cm-variable\">increment<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">logger<\/span>.<span class=\"cm-variable\">warn<\/span>(<span class=\"cm-string\">\"DS: Registry: expired lease for {}\/{}\"<\/span>, <span class=\"cm-variable\">appName<\/span>, <span class=\"cm-variable\">id<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-comment\">\/\/\u6267\u884c \u670d\u52a1\u4e0b\u7ebf\u5c06\u670d\u52a1\u4ece\u6ce8\u518c\u8868\u6e05\u9664\u6389\u3002<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">internalCancel<\/span>(<span class=\"cm-variable\">appName<\/span>, <span class=\"cm-variable\">id<\/span>, <span class=\"cm-atom\">false<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0  }<\/span>\r\n<span role=\"presentation\">}<\/span>\r\n<span role=\"presentation\">\u200b<\/span><\/pre>\n<h4 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u5254\u9664\u7684\u9650\u5236<\/span><\/h4>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\"> 1.\u81ea\u6211\u4fdd\u62a4\u671f\u95f4\u4e0d\u6e05\u9664\u3002<\/span> <span class=\"md-plain\"> 2.\u5206\u6279\u6b21\u6e05\u9664\u3002<\/span> <span class=\"md-plain\"> 3.\u670d\u52a1\u662f\u9010\u4e2a\u968f\u673a\u5254\u9664\uff0c\u5254\u9664\u5747\u5300\u5206\u5e03\u5728\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u9632\u6b62\u5728\u540c\u4e00\u65f6\u95f4\u5185\u540c\u4e00\u670d\u52a1\u96c6\u7fa4\u4e2d\u7684\u670d\u52a1\u5168\u90e8\u8fc7\u671f\u88ab\u5254\u9664\uff0c\u9020\u6210\u5728\u5927\u91cf\u5254\u9664\u670d\u52a1\u65f6\uff0c\u5e76\u5728\u8fdb\u884c\u81ea\u6211\u4fdd\u62a4\u65f6\uff0c\u4fc3\u4f7f\u7a0b\u5e8f\u5d29\u6e83\u3002<\/span><\/p>\n<h4 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u5254\u9664\u670d\u52a1\u7684\u5b9a\u65f6\u4efb\u52a1<\/span><\/h4>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\"> \u5254\u9664\u670d\u52a1\u662f\u4e2a\u5b9a\u65f6\u4efb\u52a1\uff0c\u7528EvictionTask\u6267\u884c\uff0c\u9ed8\u8ba460\u79d2\u6267\u884c\u4e00\u6b21\uff0c\u5ef6\u65f660\u79d2\u6267\u884c\u3002\u5b9a\u65f6\u5254\u9664\u8fc7\u671f\u670d\u52a1\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u4ee3\u7801\uff1a<\/span><\/p>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"text\" spellcheck=\"false\"><span role=\"presentation\">EurekaServerInitializerConfiguration#start()<\/span>\r\n<span role=\"presentation\">    eurekaServerBootstrap.contextInitialized(EurekaServerInitializerConfiguration.this.servletContext);<\/span>\r\n<span role=\"presentation\">        EurekaServerBoostrap#initEurekaServerContext()<\/span>\r\n<span role=\"presentation\">            registry.openForTraffic(this.applicationInfoManager, registryCount);<\/span>\r\n<span role=\"presentation\">                PeerAwareInstanceRegistryImpl#openForTraffic<\/span>\r\n<span role=\"presentation\">                    AbstractInstanceRegistry#postInit()<\/span><\/pre>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u670d\u52a1\u5254\u9664\u5c06\u4f1a\u904d\u5386registry\u6ce8\u518c\u8868\uff0c\u627e\u51fa\u5176\u4e2d\u6240\u6709\u7684\u8fc7\u671f\u79df\u7ea6\uff0c\u7136\u540e\u6839\u636e\u914d\u7f6e\u6587\u4ef6\u4e2d\u7eed\u79df\u767e\u5206\u6bd4\u9600\u503c\u548c\u5f53\u524d\u6ce8\u518c\u8868\u7684\u79df\u7ea6\u603b\u6570\u91cf\u8ba1\u7b97\u51fa\u6700\u5927\u5141\u8bb8\u7684\u5254\u9664\u79df\u7ea6\u7684\u6570\u91cf(\u5f53\u524d\u6ce8\u518c\u8868\u4e2d\u79df\u7ea6\u603b\u6570\u91cf\u51cf\u53bb\u5f53\u524d\u6ce8\u518c\u8868\u79df\u7ea6\u9600\u503c)\uff0c\u5206\u6279\u6b21\u5254\u9664\u8fc7\u671f\u7684\u670d\u52a1\u5b9e\u4f8b\u79df\u7ea6\u3002\u5bf9\u8fc7\u671f\u7684\u670d\u52a1\u5b9e\u4f8b\u79df\u7ea6\u8c03\u7528AbstractInstanceRegistry#internalCancel\u670d\u52a1\u4e0b\u7ebf\u7684\u65b9\u6cd5\u5c06\u5176\u4ece\u6ce8\u518c\u8868\u4e2d\u6e05\u9664\u6389\u3002<\/span><\/p>\n<h4 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u81ea\u6211\u4fdd\u62a4\u673a\u5236<\/span><\/h4>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u81ea\u6211\u4fdd\u62a4\u673a\u5236\u4e3b\u8981\u5728Eureka Client\u548cEureka Server\u4e4b\u95f4\u5b58\u5728\u7f51\u7edc\u5206\u533a\u7684\u60c5\u51b5\u4e0b\u53d1\u6325\u4fdd\u62a4\u4f5c\u7528\uff0c\u5728\u670d\u52a1\u5668\u7aef\u548c\u5ba2\u6237\u7aef\u90fd\u6709\u5bf9\u5e94\u5b9e\u73b0\u3002\u5047\u8bbe\u5728\u67d0\u79cd\u7279\u5b9a\u7684\u60c5\u51b5\u4e0b(\u5982\u7f51\u7edc\u6545\u969c)\uff0cEureka Client\u548cEureka Server\u65e0\u6cd5\u8fdb\u884c\u901a\u4fe1\uff0c\u6b64\u65f6Eureka Client\u65e0\u6cd5\u5411Eureka Server\u53d1\u8d77\u6ce8\u518c\u548c\u7eed\u7ea6\u8bf7\u6c42\uff0cEureka Server\u4e2d\u5c31\u53ef\u80fd\u56e0\u6ce8\u518c\u8868\u4e2d\u7684\u670d\u52a1\u5b9e\u4f8b\u79df\u7ea6\u51fa\u73b0\u5927\u91cf\u8fc7\u671f\u800c\u9762\u4e34\u88ab\u5254\u9664\u7684\u5371\u9669\uff0c\u7136\u800c\u6b64\u65f6\u7684Eureka Client\u53ef\u80fd\u662f\u5904\u4e8e\u5065\u5eb7\u72b6\u6001\u7684(\u53ef\u63a5\u53d7\u670d\u52a1\u8bbf\u95ee)\uff0c\u5982\u679c\u76f4\u63a5\u5c06\u6ce8\u518c\u8868\u4e2d\u5927\u91cf\u8fc7\u671f\u7684\u670d\u52a1\u5b9e\u4f8b\u79df\u7ea6\u5254\u9664\u663e\u7136\u662f\u4e0d\u5408\u7406\u7684\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u9488\u5bf9\u8fd9\u79cd\u60c5\u51b5\uff0cEureka\u8bbe\u8ba1\u4e86\u201c\u81ea\u6211\u4fdd\u62a4\u673a\u5236\u201d\u3002\u5728Eureka Server\u5904\uff0c\u5982\u679c\u51fa\u73b0\u5927\u91cf\u7684\u670d\u52a1\u5b9e\u4f8b\u8fc7\u671f\u88ab\u5254\u9664\u7684\u73b0\u8c61\uff0c\u90a3\u4e48\u8be5Server\u8282\u70b9\u5c06\u8fdb\u5165\u81ea\u6211\u4fdd\u62a4\u6a21\u5f0f\uff0c\u4fdd\u62a4\u6ce8\u518c\u8868\u4e2d\u7684\u4fe1\u606f\u4e0d\u518d\u88ab\u5254\u9664\uff0c\u5728\u901a\u4fe1\u7a33\u5b9a\u540e\u518d\u9000\u51fa\u8be5\u6a21\u5f0f\uff1b\u5728Eureka Client\u5904\uff0c\u5982\u679c\u5411Eureka Server\u6ce8\u518c\u5931\u8d25\uff0c\u5c06\u5feb\u901f\u8d85\u65f6\u5e76\u5c1d\u8bd5\u4e0e\u5176\u4ed6\u7684Eureka Server\u8fdb\u884c\u901a\u4fe1\u3002\u201c\u81ea\u6211\u4fdd\u62a4\u673a\u5236\u201d\u7684\u8bbe\u8ba1\u5927\u5927\u63d0\u9ad8\u4e86Eureka\u7684\u53ef\u7528\u6027\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u6709\u5173\u81ea\u6211\u4fdd\u62a4\u673a\u5236\u7684\u6d41\u7a0b\u56fe\uff1a<\/span><\/p>\n<h2 class=\"md-end-block md-heading\"><span class=\"md-plain\"><img loading=\"lazy\" class=\"size-full wp-image-894 aligncenter\" src=\"http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/\u81ea\u6211\u4fdd\u62a4\u6d41\u7a0b\u56fe.png\" alt=\"\" width=\"1010\" height=\"862\" srcset=\"http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/\u81ea\u6211\u4fdd\u62a4\u6d41\u7a0b\u56fe.png 1010w, http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/\u81ea\u6211\u4fdd\u62a4\u6d41\u7a0b\u56fe-300x256.png 300w, http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/\u81ea\u6211\u4fdd\u62a4\u6d41\u7a0b\u56fe-768x655.png 768w\" sizes=\"(max-width: 1010px) 100vw, 1010px\" \/><\/span><\/h2>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u670d\u52a1\u4e0b\u7ebf<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\"> Eureka Client\u5728\u5e94\u7528\u9500\u6bc1\u65f6\uff0c\u4f1a\u5411Eureka Server\u53d1\u9001\u670d\u52a1\u4e0b\u7ebf\u8bf7\u6c42\uff0c\u6e05\u9664\u6ce8\u518c\u8868\u4e2d\u5173\u4e8e\u672c\u5e94\u7528\u7684\u79df\u7ea6\uff0c\u907f\u514d\u65e0\u6548\u7684\u670d\u52a1\u8c03\u7528\u3002\u5728\u670d\u52a1\u5254\u9664\u7684\u8fc7\u7a0b\u4e2d\uff0c\u4e5f\u662f\u901a\u8fc7\u670d\u52a1\u4e0b\u7ebf\u7684\u903b\u8f91\u5b8c\u6210\u5bf9\u5355\u4e2a\u670d\u52a1\u5b9e\u4f8b\u8fc7\u671f\u79df\u7ea6\u7684\u6e05\u9664\u5de5\u4f5c\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5bf9\u5e94\u4ee3\u7801\uff1acom.netflix.eureka.resources.InstanceResource \u7684<\/span><\/p>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"java\" spellcheck=\"false\"><span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-meta\">@DELETE<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-keyword\">public<\/span> <span class=\"cm-variable\">Response<\/span> <span class=\"cm-def\">cancelLease<\/span>(<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-meta\">@HeaderParam<\/span>(<span class=\"cm-variable\">PeerEurekaNode<\/span>.<span class=\"cm-variable\">HEADER_REPLICATION<\/span>) <span class=\"cm-variable-3\">String<\/span> <span class=\"cm-variable\">isReplication<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0  ......<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable-3\">boolean<\/span> <span class=\"cm-variable\">isSuccess<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">registry<\/span>.<span class=\"cm-variable\">cancel<\/span>(<span class=\"cm-variable\">app<\/span>.<span class=\"cm-variable\">getName<\/span>(), <span class=\"cm-variable\">id<\/span>, <span class=\"cm-string\">\"true\"<\/span>.<span class=\"cm-variable\">equals<\/span>(<span class=\"cm-variable\">isReplication<\/span>));<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0  ......<\/span>\r\n<span role=\"presentation\"> \u00a0  }<\/span><\/pre>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u7ee7\u7eed\u8ffd\u8e2a\uff1a<\/span><\/p>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"text\" spellcheck=\"false\"><span role=\"presentation\">InstanceResource#cancelLease<\/span>\r\n<span role=\"presentation\">    PeerAwareInstanceRegistryImpl#cancel \/\/\u6b64\u65b9\u6cd5\u4e2d\u8fd8\u6709\u5c06\u53d6\u6d88\u64cd\u4f5c\u590d\u5236\u7ed9\u5176\u4ed6eureka\u8282\u70b9\u7684\u903b\u8f91<\/span>\r\n<span role=\"presentation\">        AbstractInstanceRegistry#cancel<\/span>\r\n<span role=\"presentation\">            AbstractInstanceRegistry#internalCancel<\/span><\/pre>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u6700\u7ec8\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\uff1a<\/span><\/p>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"java\" spellcheck=\"false\"><span role=\"presentation\"><span class=\"cm-keyword\">protected<\/span> <span class=\"cm-variable-3\">boolean<\/span> <span class=\"cm-def\">internalCancel<\/span>(<span class=\"cm-variable-3\">String<\/span> <span class=\"cm-variable\">appName<\/span>, <span class=\"cm-variable-3\">String<\/span> <span class=\"cm-variable\">id<\/span>, <span class=\"cm-variable-3\">boolean<\/span> <span class=\"cm-variable\">isReplication<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-keyword\">try<\/span> {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-comment\">\/\/\u5148\u83b7\u53d6\u8bfb\u9501\uff0c\u9632\u6b62\u88ab\u5176\u4ed6\u7ebf\u7a0b\u4fee\u6539<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">read<\/span>.<span class=\"cm-variable\">lock<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">CANCEL<\/span>.<span class=\"cm-variable\">increment<\/span>(<span class=\"cm-variable\">isReplication<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-comment\">\/\/\u6839\u636eappName\u83b7\u53d6\u670d\u52a1\u5b9e\u4f8b\u96c6\u7fa4\u3002<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">Map<\/span><span class=\"cm-operator\">&lt;<\/span><span class=\"cm-variable-3\">String<\/span>, <span class=\"cm-variable\">Lease<\/span><span class=\"cm-operator\">&lt;<\/span><span class=\"cm-variable\">InstanceInfo<\/span><span class=\"cm-operator\">&gt;&gt;<\/span> <span class=\"cm-variable\">gMap<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">registry<\/span>.<span class=\"cm-variable\">get<\/span>(<span class=\"cm-variable\">appName<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">Lease<\/span><span class=\"cm-operator\">&lt;<\/span><span class=\"cm-variable\">InstanceInfo<\/span><span class=\"cm-operator\">&gt;<\/span> <span class=\"cm-variable\">leaseToCancel<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-atom\">null<\/span>;<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-comment\">\/\/  \u5728\u5185\u5b58\u4e2d\u53d6\u6d88\u5b9e\u4f8b id\u7684\u670d\u52a1<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-variable\">gMap<\/span> <span class=\"cm-operator\">!=<\/span> <span class=\"cm-atom\">null<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">leaseToCancel<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">gMap<\/span>.<span class=\"cm-variable\">remove<\/span>(<span class=\"cm-variable\">id<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-comment\">\/\/\u6dfb\u52a0\u5230\u6700\u8fd1\u4e0b\u7ebf\u670d\u52a1\u7684\u7edf\u8ba1\u961f\u5217<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">recentCanceledQueue<\/span>.<span class=\"cm-variable\">add<\/span>(<span class=\"cm-keyword\">new<\/span> <span class=\"cm-variable\">Pair<\/span><span class=\"cm-operator\">&lt;<\/span><span class=\"cm-variable-3\">Long<\/span>, <span class=\"cm-variable-3\">String<\/span><span class=\"cm-operator\">&gt;<\/span>(<span class=\"cm-variable\">System<\/span>.<span class=\"cm-variable\">currentTimeMillis<\/span>(), <span class=\"cm-variable\">appName<\/span> <span class=\"cm-operator\">+<\/span> <span class=\"cm-string\">\"(\"<\/span> <span class=\"cm-operator\">+<\/span> <span class=\"cm-variable\">id<\/span> <span class=\"cm-operator\">+<\/span> <span class=\"cm-string\">\")\"<\/span>));<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">InstanceStatus<\/span> <span class=\"cm-variable\">instanceStatus<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">overriddenInstanceStatusMap<\/span>.<span class=\"cm-variable\">remove<\/span>(<span class=\"cm-variable\">id<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-variable\">instanceStatus<\/span> <span class=\"cm-operator\">!=<\/span> <span class=\"cm-atom\">null<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">logger<\/span>.<span class=\"cm-variable\">debug<\/span>(<span class=\"cm-string\">\"Removed instance id {} from the overridden map which has value {}\"<\/span>, <span class=\"cm-variable\">id<\/span>, <span class=\"cm-variable\">instanceStatus<\/span>.<span class=\"cm-variable\">name<\/span>());<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-comment\">\/\/ \u5f80\u4e0b\u5224\u65adleaseToCancel\u662f\u5426\u4e3a\u7a7a\uff0c\u79df\u7ea6\u4e0d\u5b58\u5728\uff0c\u8fd4\u56defalse<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-variable\">leaseToCancel<\/span> <span class=\"cm-operator\">==<\/span> <span class=\"cm-atom\">null<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">CANCEL_NOT_FOUND<\/span>.<span class=\"cm-variable\">increment<\/span>(<span class=\"cm-variable\">isReplication<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">logger<\/span>.<span class=\"cm-variable\">warn<\/span>(<span class=\"cm-string\">\"DS: Registry: cancel failed because Lease is not registered for: {}\/{}\"<\/span>, <span class=\"cm-variable\">appName<\/span>, <span class=\"cm-variable\">id<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">return<\/span> <span class=\"cm-atom\">false<\/span>;<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0  } <span class=\"cm-keyword\">else<\/span> {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-comment\">\/\/\u82e5\u5b58\u5728\uff0c\u8bbe\u7f6e\u79df\u7ea6\u4e0b\u7ebf\u65f6\u95f4<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">leaseToCancel<\/span>.<span class=\"cm-variable\">cancel<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">InstanceInfo<\/span> <span class=\"cm-variable\">instanceInfo<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">leaseToCancel<\/span>.<span class=\"cm-variable\">getHolder<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable-3\">String<\/span> <span class=\"cm-variable\">vip<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-atom\">null<\/span>;<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable-3\">String<\/span> <span class=\"cm-variable\">svip<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-atom\">null<\/span>;<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-variable\">instanceInfo<\/span> <span class=\"cm-operator\">!=<\/span> <span class=\"cm-atom\">null<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-comment\">\/\/\u83b7\u53d6\u6301\u6709\u79df\u7ea6\u7684\u670d\u52a1\u4fe1\u606f\uff0c\u6807\u8bb0\u670d\u52a1\u5b9e\u4f8b\u4e3ainstanceInfo.setActionType(ActionType.DELETED);<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">instanceInfo<\/span>.<span class=\"cm-variable\">setActionType<\/span>(<span class=\"cm-variable\">ActionType<\/span>.<span class=\"cm-variable\">DELETED<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-comment\">\/\/\u6dfb\u52a0\u5230\u79df\u7ea6\u53d8\u66f4\u8bb0\u5f55\u961f\u5217<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">recentlyChangedQueue<\/span>.<span class=\"cm-variable\">add<\/span>(<span class=\"cm-keyword\">new<\/span> <span class=\"cm-variable\">RecentlyChangedItem<\/span>(<span class=\"cm-variable\">leaseToCancel<\/span>));<span class=\"cm-comment\">\/\/\u7528\u4e8eeureka client\u7684\u589e\u91cf\u62c9\u53d6\u6ce8\u518c\u8868\u4fe1\u606f\u3002<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">instanceInfo<\/span>.<span class=\"cm-variable\">setLastUpdatedTimestamp<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">vip<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">instanceInfo<\/span>.<span class=\"cm-variable\">getVIPAddress<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">svip<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">instanceInfo<\/span>.<span class=\"cm-variable\">getSecureVipAddress<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">invalidateCache<\/span>(<span class=\"cm-variable\">appName<\/span>, <span class=\"cm-variable\">vip<\/span>, <span class=\"cm-variable\">svip<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">logger<\/span>.<span class=\"cm-variable\">info<\/span>(<span class=\"cm-string\">\"Cancelled instance {}\/{} (replication={})\"<\/span>, <span class=\"cm-variable\">appName<\/span>, <span class=\"cm-variable\">id<\/span>, <span class=\"cm-variable\">isReplication<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0  } <span class=\"cm-keyword\">finally<\/span> {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">read<\/span>.<span class=\"cm-variable\">unlock<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0  }<\/span>\r\n<span role=\"presentation\">\u200b<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-keyword\">synchronized<\/span> (<span class=\"cm-variable\">lock<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-keyword\">this<\/span>.<span class=\"cm-variable\">expectedNumberOfClientsSendingRenews<\/span> <span class=\"cm-operator\">&gt;<\/span> <span class=\"cm-number\">0<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-comment\">\/\/ Since the client wants to cancel it, reduce the number of clients to send renews.<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">this<\/span>.<span class=\"cm-variable\">expectedNumberOfClientsSendingRenews<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-keyword\">this<\/span>.<span class=\"cm-variable\">expectedNumberOfClientsSendingRenews<\/span> <span class=\"cm-operator\">-<\/span> <span class=\"cm-number\">1<\/span>;<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">updateRenewsPerMinThreshold<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0  }<\/span>\r\n<span role=\"presentation\">\u200b<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-keyword\">return<\/span> <span class=\"cm-atom\">true<\/span>;<\/span>\r\n<span role=\"presentation\">}<\/span><\/pre>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u4e0a\u8ff0\u4ee3\u7801\u4e3b\u8981\u529f\u80fd\uff1a \u9996\u5148\u901a\u8fc7registry\u6839\u636e\u670d\u52a1\u540d\u548c\u670d\u52a1\u5b9e\u4f8bid\u67e5\u8be2\u5173\u4e8e\u670d\u52a1\u5b9e\u4f8b\u7684\u79df\u7ea6Lease\u662f\u5426\u5b58\u5728\uff0c\u7edf\u8ba1\u6700\u8fd1\u8bf7\u6c42\u4e0b\u7ebf\u7684\u670d\u52a1\u5b9e\u4f8b\u7528\u4e8eEureka Server\u4e3b\u9875\u5c55\u793a\u3002\u5982\u679c\u79df\u7ea6\u4e0d\u5b58\u5728\uff0c\u8fd4\u56de\u4e0b\u7ebf\u5931\u8d25\uff1b\u5982\u679c\u79df\u7ea6\u5b58\u5728\uff0c\u4eceregistry\u6ce8\u518c\u8868\u4e2d\u79fb\u9664\uff0c\u8bbe\u7f6e\u79df\u7ea6\u7684\u4e0b\u7ebf\u65f6\u95f4\uff0c\u540c\u65f6\u5728\u6700\u8fd1\u79df\u7ea6\u53d8\u66f4\u8bb0\u5f55\u961f\u5217\u4e2d\u6dfb\u52a0\u65b0\u7684\u4e0b\u7ebf\u8bb0\u5f55\uff0c\u4ee5\u7528\u4e8eEureka Client\u7684\u589e\u91cf\u5f0f\u83b7\u53d6\u6ce8\u518c\u8868\u4fe1\u606f\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><img loading=\"lazy\" class=\"size-full wp-image-895 aligncenter\" src=\"http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/Eureka\u670d\u52a1\u4e0b\u7ebf.png\" alt=\"\" width=\"738\" height=\"877\" srcset=\"http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/Eureka\u670d\u52a1\u4e0b\u7ebf.png 738w, http:\/\/prayerlaputa.com\/wp-content\/uploads\/2020\/09\/Eureka\u670d\u52a1\u4e0b\u7ebf-252x300.png 252w\" sizes=\"(max-width: 738px) 100vw, 738px\" \/><\/p>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u96c6\u7fa4\u540c\u6b65 <\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\"> \u5982\u679cEureka Server\u662f\u901a\u8fc7\u96c6\u7fa4\u7684\u65b9\u5f0f\u8fdb\u884c\u90e8\u7f72\uff0c\u90a3\u4e48\u4e3a\u4e86\u7ef4\u62a4\u6574\u4e2a\u96c6\u7fa4\u4e2dEureka Server\u6ce8\u518c\u8868\u6570\u636e\u7684\u4e00\u81f4\u6027\uff0c\u52bf\u5fc5\u9700\u8981\u4e00\u4e2a\u673a\u5236\u540c\u6b65Eureka Server\u96c6\u7fa4\u4e2d\u7684\u6ce8\u518c\u8868\u6570\u636e\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">Eureka Server\u96c6\u7fa4\u540c\u6b65\u5305\u542b\u4e24\u4e2a\u90e8\u5206\uff1a<\/span><\/p>\n<ul class=\"ul-list\" data-mark=\"-\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">Eureka Server\u5728\u542f\u52a8\u8fc7\u7a0b\u4e2d\u4ece\u5b83\u7684peer\u8282\u70b9\u4e2d\u62c9\u53d6\u6ce8\u518c\u8868\u4fe1\u606f\uff0c\u5e76\u5c06\u8fd9\u4e9b\u670d\u52a1\u5b9e\u4f8b\u7684\u4fe1\u606f\u6ce8\u518c\u5230\u672c\u5730\u6ce8\u518c\u8868\u4e2d\uff1b<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">Eureka Server\u6bcf\u6b21\u5bf9\u672c\u5730\u6ce8\u518c\u8868\u8fdb\u884c\u64cd\u4f5c\u65f6\uff0c\u540c\u65f6\u4f1a\u5c06\u64cd\u4f5c\u540c\u6b65\u5230\u5b83\u7684peer\u8282\u70b9\u4e2d\uff0c\u8fbe\u5230\u96c6\u7fa4\u6ce8\u518c\u8868\u6570\u636e\u7edf\u4e00\u7684\u76ee\u7684\u3002<\/span><\/p>\n<\/li>\n<\/ul>\n<h4 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u542f\u52a8\u62c9\u53d6\u522b\u7684peer<\/span><\/h4>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">Eureka Server\u542f\u52a8\u7c7b\u4e2d\uff0c<\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>EurekaServerAutoConfiguration<\/code><\/span><span class=\"md-plain\">\u901a\u8fc7@Import\u6ce8\u89e3\u52a0\u8f7d<\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>EurekaServerInitializerConfiguration<\/code><\/span><\/p>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"text\" spellcheck=\"false\"><span role=\"presentation\">EurekaServerInitializerConfiguration#start()<\/span>\r\n<span role=\"presentation\">    eurekaServerBootstrap.contextInitialized(...)<\/span>\r\n<span role=\"presentation\">        EurekaServerBootstrap#initEurekaServerContext()<\/span>\r\n<span role=\"presentation\">            PeerAwareInstanceRegistryImpl#syncUp();<\/span><\/pre>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u4ee3\u7801\u5b9e\u73b0\uff1a<\/span><\/p>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"java\" spellcheck=\"false\"><span role=\"presentation\"><span class=\"cm-keyword\">public<\/span> <span class=\"cm-variable-3\">int<\/span> <span class=\"cm-def\">syncUp<\/span>() {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-comment\">\/\/ Copy entire entry from neighboring DS node<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable-3\">int<\/span> <span class=\"cm-variable\">count<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-number\">0<\/span>;<\/span>\r\n<span role=\"presentation\">\u200b<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">for<\/span> (<span class=\"cm-variable-3\">int<\/span> <span class=\"cm-variable\">i<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-number\">0<\/span>; ((<span class=\"cm-variable\">i<\/span> <span class=\"cm-operator\">&lt;<\/span> <span class=\"cm-variable\">serverConfig<\/span>.<span class=\"cm-variable\">getRegistrySyncRetries<\/span>()) <span class=\"cm-operator\">&amp;&amp;<\/span> (<span class=\"cm-variable\">count<\/span> <span class=\"cm-operator\">==<\/span> <span class=\"cm-number\">0<\/span>)); <span class=\"cm-variable\">i<\/span><span class=\"cm-operator\">++<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-variable\">i<\/span> <span class=\"cm-operator\">&gt;<\/span> <span class=\"cm-number\">0<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">try<\/span> {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">Thread<\/span>.<span class=\"cm-variable\">sleep<\/span>(<span class=\"cm-variable\">serverConfig<\/span>.<span class=\"cm-variable\">getRegistrySyncRetryWaitMs<\/span>());<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  } <span class=\"cm-keyword\">catch<\/span> (<span class=\"cm-variable\">InterruptedException<\/span> <span class=\"cm-variable\">e<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">logger<\/span>.<span class=\"cm-variable\">warn<\/span>(<span class=\"cm-string\">\"Interrupted during registry transfer..\"<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">break<\/span>;<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">Applications<\/span> <span class=\"cm-variable\">apps<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">eurekaClient<\/span>.<span class=\"cm-variable\">getApplications<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">for<\/span> (<span class=\"cm-variable\">Application<\/span> <span class=\"cm-variable\">app<\/span> : <span class=\"cm-variable\">apps<\/span>.<span class=\"cm-variable\">getRegisteredApplications<\/span>()) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">for<\/span> (<span class=\"cm-variable\">InstanceInfo<\/span> <span class=\"cm-variable\">instance<\/span> : <span class=\"cm-variable\">app<\/span>.<span class=\"cm-variable\">getInstances<\/span>()) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">try<\/span> {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-variable\">isRegisterable<\/span>(<span class=\"cm-variable\">instance<\/span>)) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">register<\/span>(<span class=\"cm-variable\">instance<\/span>, <span class=\"cm-variable\">instance<\/span>.<span class=\"cm-variable\">getLeaseInfo<\/span>().<span class=\"cm-variable\">getDurationInSecs<\/span>(), <span class=\"cm-atom\">true<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">count<\/span><span class=\"cm-operator\">++<\/span>;<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  } <span class=\"cm-keyword\">catch<\/span> (<span class=\"cm-variable\">Throwable<\/span> <span class=\"cm-variable\">t<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">logger<\/span>.<span class=\"cm-variable\">error<\/span>(<span class=\"cm-string\">\"During DS init copy\"<\/span>, <span class=\"cm-variable\">t<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">return<\/span> <span class=\"cm-variable\">count<\/span>;<\/span>\r\n<span role=\"presentation\"> \u00a0  }<\/span><\/pre>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\"> \u770b\u5faa\u73af\uff1a\u610f\u601d\u662f\uff0c\u5982\u679c\u662fi\u7b2c\u4e00\u6b21\u8fdb\u6765\uff0c\u4e3a0\uff0c\u4e0d\u591f\u7b49\u5f85\u7684\u4ee3\u7801\uff0c\u76f4\u63a5\u6267\u884c\u4e0b\u9762\u7684\u62c9\u53d6\u670d\u52a1\u5b9e\u4f8b\u3002<\/span> <span class=\"md-plain\"> \u5c06\u81ea\u5df1\u4f5c\u4e3a\u4e00\u4e2aeureka client\uff0c\u62c9\u53d6\u6ce8\u518c\u8868\u3002\u5e76\u901a\u8fc7register(instance, instance.getLeaseInfo().getDurationInSecs(), true)\u6ce8\u518c\u5230\u81ea\u8eab\u7684\u6ce8\u518c\u8868\u4e2d\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">Eureka Server\u4e5f\u662f\u4e00\u4e2aEureka Client\uff0c\u5728\u542f\u52a8\u7684\u65f6\u5019\u4e5f\u4f1a\u8fdb\u884cDiscoveryClient\u7684\u521d\u59cb\u5316\uff0c\u4f1a\u4ece\u5176\u5bf9\u5e94\u7684Eureka Server\u4e2d\u62c9\u53d6\u5168\u91cf\u7684\u6ce8\u518c\u8868\u4fe1\u606f\u3002\u5728Eureka Server\u96c6\u7fa4\u90e8\u7f72\u7684\u60c5\u51b5\u4e0b\uff0cEureka Server\u4ece\u5b83\u7684peer\u8282\u70b9\u4e2d\u62c9\u53d6\u5230\u6ce8\u518c\u8868\u4fe1\u606f\u540e\uff0c\u5c06\u904d\u5386\u8fd9\u4e2aApplications\uff0c\u5c06\u6240\u6709\u7684\u670d\u52a1\u5b9e\u4f8b\u901a\u8fc7AbstractRegistry#register\u65b9\u6cd5\u6ce8\u518c\u5230\u81ea\u8eab\u6ce8\u518c\u8868\u4e2d\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">EurekaServerBootstrap#initEurekaServerContext()\u4e2d\u6709\u5982\u4e0b\u4ee3\u7801\uff1a<\/span><\/p>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"text\" spellcheck=\"false\"><span role=\"presentation\">        \u3002\u3002\u3002<\/span>\r\n<span role=\"presentation\">        \/\/ Copy registry from neighboring eureka node<\/span>\r\n<span role=\"presentation\">        int registryCount = this.registry.syncUp();<\/span>\r\n<span role=\"presentation\">        this.registry.openForTraffic(this.applicationInfoManager, registryCount);<\/span>\r\n<span role=\"presentation\">        \u3002\u3002\u3002<\/span><\/pre>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5f53\u6267\u884c\u5b8c\u4e0a\u9762\u7684syncUp\u903b\u8f91\u540e\uff0c\u5728\u4e0b\u9762\u7684openForTraffic\uff0c<\/span><span class=\"md-pair-s \"><strong><span class=\"md-plain\">\u5f00\u542f\u6b64server\u63a5\u53d7\u522b\u7684client\u6ce8\u518c\uff0c\u62c9\u53d6\u6ce8\u518c\u8868\u7b49\u64cd\u4f5c\u3002\u800c\u5728\u5b83\u9996\u6b21\u62c9\u53d6\u5176\u4ed6peer\u8282\u70b9\u65f6\uff0c\u662f\u4e0d\u5141\u8bb8client\u7684\u901a\u4fe1\u8bf7\u6c42\u7684\u3002<\/span><\/strong><\/span><\/p>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"java\" spellcheck=\"false\"><span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-keyword\">public<\/span> <span class=\"cm-variable-3\">void<\/span> <span class=\"cm-def\">openForTraffic<\/span>(<span class=\"cm-variable\">ApplicationInfoManager<\/span> <span class=\"cm-variable\">applicationInfoManager<\/span>, <span class=\"cm-variable-3\">int<\/span> <span class=\"cm-variable\">count<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-comment\">\/\/ Renewals happen every 30 seconds and for a minute it should be a factor of 2.<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">this<\/span>.<span class=\"cm-variable\">expectedNumberOfClientsSendingRenews<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">count<\/span>;<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">updateRenewsPerMinThreshold<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">logger<\/span>.<span class=\"cm-variable\">info<\/span>(<span class=\"cm-string\">\"Got {} instances from neighboring DS node\"<\/span>, <span class=\"cm-variable\">count<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">logger<\/span>.<span class=\"cm-variable\">info<\/span>(<span class=\"cm-string\">\"Renew threshold is: {}\"<\/span>, <span class=\"cm-variable\">numberOfRenewsPerMinThreshold<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">this<\/span>.<span class=\"cm-variable\">startupTime<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">System<\/span>.<span class=\"cm-variable\">currentTimeMillis<\/span>();<\/span>\r\n<span class=\"cm-tab-wrap-hack\" role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-comment\">\/\/\u5982\u679ccount=0\uff0c\u6ca1\u6709\u62c9\u53d6\u5230\u6ce8\u518c\u8868\u4fe1\u606f\uff0c\u5c06\u6b64\u503c\u8bbe\u4e3atrue\uff0c\u8868\u793a\u5176\u4ed6peer\u6765\u53d6\u7a7a\u7684\u5b9e\u4f8b\u4fe1\u606f\uff0c\u610f\u5473\u7740\uff0c\u5c06\u4e0d\u5141\u8bb8client\u4ece\u6b64server\u83b7\u53d6\u6ce8\u518c\u8868\u4fe1\u606f\u3002\u5982\u679ccount&gt;0\uff0c\u5c06\u6b64\u503c\u8bbe\u7f6e\u4e3afalse\uff0c\u5141\u8bb8client\u6765\u83b7\u53d6\u6ce8\u518c\u8868\u3002   <\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-variable\">count<\/span> <span class=\"cm-operator\">&gt;<\/span> <span class=\"cm-number\">0<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">this<\/span>.<span class=\"cm-variable\">peerInstancesTransferEmptyOnStartup<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-atom\">false<\/span>;<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">DataCenterInfo<\/span>.<span class=\"cm-variable\">Name<\/span> <span class=\"cm-variable\">selfName<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">applicationInfoManager<\/span>.<span class=\"cm-variable\">getInfo<\/span>().<span class=\"cm-variable\">getDataCenterInfo<\/span>().<span class=\"cm-variable\">getName<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable-3\">boolean<\/span> <span class=\"cm-variable\">isAws<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">Name<\/span>.<span class=\"cm-variable\">Amazon<\/span> <span class=\"cm-operator\">==<\/span> <span class=\"cm-variable\">selfName<\/span>;<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-variable\">isAws<\/span> <span class=\"cm-operator\">&amp;&amp;<\/span> <span class=\"cm-variable\">serverConfig<\/span>.<span class=\"cm-variable\">shouldPrimeAwsReplicaConnections<\/span>()) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">logger<\/span>.<span class=\"cm-variable\">info<\/span>(<span class=\"cm-string\">\"Priming AWS connections for all replicas..\"<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">primeAwsReplicas<\/span>(<span class=\"cm-variable\">applicationInfoManager<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">logger<\/span>.<span class=\"cm-variable\">info<\/span>(<span class=\"cm-string\">\"Changing status to UP\"<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">applicationInfoManager<\/span>.<span class=\"cm-variable\">setInstanceStatus<\/span>(<span class=\"cm-variable\">InstanceStatus<\/span>.<span class=\"cm-variable\">UP<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">super<\/span>.<span class=\"cm-variable\">postInit<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0  }<\/span><\/pre>\n<h4 class=\"md-end-block md-heading\"><span class=\"md-plain\">Server\u4e4b\u95f4\u6ce8\u518c\u8868\u4fe1\u606f\u7684\u540c\u6b65\u590d\u5236<\/span><\/h4>\n<p class=\"md-end-block md-p\"><span class=\"md-pair-s \"><strong><span class=\"md-plain\">\u4e3a\u4e86\u4fdd\u8bc1Eureka Server\u96c6\u7fa4\u8fd0\u884c\u65f6\u6ce8\u518c\u8868\u4fe1\u606f\u7684\u4e00\u81f4\u6027\uff0c\u6bcf\u4e2aEureka Server\u5728\u5bf9\u672c\u5730\u6ce8\u518c\u8868\u8fdb\u884c\u7ba1\u7406\u64cd\u4f5c\u65f6\uff0c\u4f1a\u5c06\u76f8\u5e94\u7684\u64cd\u4f5c\u540c\u6b65\u5230\u6240\u6709peer\u8282\u70b9\u4e2d\u3002<\/span><\/strong><\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5728\u5916\u90e8\u8c03\u7528server\u7684restful\u65b9\u6cd5\u65f6\uff0c\u5728com.netflix.eureka.resources\u5305\u4e0b\u7684ApplicationResource\u8d44\u6e90\u4e2d\uff0c\u67e5\u770b\u6bcf\u4e2a\u670d\u52a1\u7684\u64cd\u4f5c\u3002\u6bd4\u5982\u670d\u52a1\u6ce8\u518cpublic Response addInstance(\uff0c\u6b64\u65b9\u6cd5\u4e2d\u6709<\/span> <span class=\"md-plain\"> registry.register(info, &#8220;true&#8221;.equals(isReplication));\u70b9\u8fdb\u53bb\u5b9e\u73b0\u7c7b\uff1areplicateToPeers(Action.Register, info.getAppName(), info.getId(), info, null, isReplication);\u8fd9\u662f\u4e00\u79cd\u60c5\u51b5\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5728PeerAwareInstanceRegistryImpl\u7c7b\u4e2d\uff0c\u5176\u4ed6\u64cd\u4f5c\uff0c\u5982cancel\uff0crenew\u7b49\u4e2d\u90fd\u6709replicateToPeers\uff0c<\/span> <span class=\"md-plain\"> \u6b64\u65b9\u6cd5\u4e2d\u6709\u4e2apeerEurekaNodes\uff0c\u4ee3\u8868\u4e00\u4e2a\u53ef\u540c\u6b65\u6570\u636e\u7684eureka Server\u7684\u96c6\u5408\uff0c\u5982\u679c\u6ce8\u518c\u8868\u6709\u53d8\u5316\uff0c\u5411\u6b64\u4e2d\u7684peer\u8282\u70b9\u540c\u6b65\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\"> replicateToPeers\u65b9\u6cd5\uff0c\u5b83\u5c06\u904d\u5386Eureka Server\u4e2dpeer\u8282\u70b9\uff0c\u5411\u6bcf\u4e2apeer\u8282\u70b9\u53d1\u9001\u540c\u6b65\u8bf7\u6c42\u3002<\/span><\/p>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"java\" spellcheck=\"false\"><span role=\"presentation\"><span class=\"cm-keyword\">private<\/span> <span class=\"cm-variable-3\">void<\/span> <span class=\"cm-def\">replicateToPeers<\/span>(<span class=\"cm-variable\">Action<\/span> <span class=\"cm-variable\">action<\/span>, <span class=\"cm-variable-3\">String<\/span> <span class=\"cm-variable\">appName<\/span>, <span class=\"cm-variable-3\">String<\/span> <span class=\"cm-variable\">id<\/span>,<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">InstanceInfo<\/span> <span class=\"cm-variable\">info<\/span> <span class=\"cm-comment\">\/* optional *\/<\/span>,<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">InstanceStatus<\/span> <span class=\"cm-variable\">newStatus<\/span> <span class=\"cm-comment\">\/* optional *\/<\/span>, <span class=\"cm-variable-3\">boolean<\/span> <span class=\"cm-variable\">isReplication<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">Stopwatch<\/span> <span class=\"cm-variable\">tracer<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">action<\/span>.<span class=\"cm-variable\">getTimer<\/span>().<span class=\"cm-variable\">start<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">try<\/span> {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-variable\">isReplication<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">numberOfReplicationsLastMin<\/span>.<span class=\"cm-variable\">increment<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-comment\">\/\/ If it is a replication already, do not replicate again as this will create a poison replication<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-variable\">peerEurekaNodes<\/span> <span class=\"cm-operator\">==<\/span> <span class=\"cm-variable\">Collections<\/span>.<span class=\"cm-variable\">EMPTY_LIST<\/span> <span class=\"cm-operator\">||<\/span> <span class=\"cm-variable\">isReplication<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">return<\/span>;<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\">\u200b<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">for<\/span> (<span class=\"cm-keyword\">final<\/span> <span class=\"cm-variable\">PeerEurekaNode<\/span> <span class=\"cm-variable\">node<\/span> : <span class=\"cm-variable\">peerEurekaNodes<\/span>.<span class=\"cm-variable\">getPeerEurekaNodes<\/span>()) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-comment\">\/\/ If the url represents this host, do not replicate to yourself.<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-variable\">peerEurekaNodes<\/span>.<span class=\"cm-variable\">isThisMyUrl<\/span>(<span class=\"cm-variable\">node<\/span>.<span class=\"cm-variable\">getServiceUrl<\/span>())) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">continue<\/span>;<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">replicateInstanceActionsToPeers<\/span>(<span class=\"cm-variable\">action<\/span>, <span class=\"cm-variable\">appName<\/span>, <span class=\"cm-variable\">id<\/span>, <span class=\"cm-variable\">info<\/span>, <span class=\"cm-variable\">newStatus<\/span>, <span class=\"cm-variable\">node<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0  } <span class=\"cm-keyword\">finally<\/span> {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">tracer<\/span>.<span class=\"cm-variable\">stop<\/span>();<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0  }<\/span><\/pre>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\"> \u6b64replicateInstanceActionsToPeers\u65b9\u6cd5\u4e2d\uff0c\u7c7bPeerEurekaNode\u7684\u5b9e\u4f8bnode\u7684\u5404\u79cd\u65b9\u6cd5\uff0ccancel\uff0cregister\uff0c\u7b49\uff0c\u7528\u4e86batchingDispatcher.process(\uff0c\u4f5c\u7528\u662f\u5c06\u540c\u4e00\u65f6\u95f4\u6bb5\u5185\uff0c\u76f8\u540c\u670d\u52a1\u5b9e\u4f8b\u7684\u76f8\u540c\u64cd\u4f5c\u5c06\u4f7f\u7528\u76f8\u540c\u7684\u4efb\u52a1\u7f16\u53f7\uff0c\u5728\u8fdb\u884c\u540c\u6b65\u590d\u5236\u7684\u65f6\u5019\uff0c\u5c06\u6839\u636e\u4efb\u52a1\u7f16\u53f7\u5408\u5e76\u64cd\u4f5c\uff0c<\/span><span class=\"md-pair-s \"><strong><span class=\"md-plain\">\u51cf\u5c11\u540c\u6b65\u64cd\u4f5c\u7684\u6570\u91cf\u548c\u7f51\u7edc\u6d88\u8017\uff0c\u4f46\u662f\u540c\u65f6\u4e5f\u9020\u6210\u4e86\u540c\u6b65\u590d\u5236\u7684\u5ef6\u65f6\u6027\uff0c\u4e0d\u6ee1\u8db3CAP\u4e2d\u7684C\uff08\u5f3a\u4e00\u81f4\u6027\uff09\u3002<\/span> <span class=\"md-plain\"> \u6240\u4ee5Eureka\uff0c\u53ea\u6ee1\u8db3AP\u3002<\/span><\/strong><\/span><\/p>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"java\" spellcheck=\"false\"><span role=\"presentation\"><span class=\"cm-comment\">\/\/\u793a\u4f8b\uff1aPeerEurekaNode<\/span><\/span>\r\n<span role=\"presentation\"><span class=\"cm-keyword\">public<\/span> <span class=\"cm-variable-3\">void<\/span> <span class=\"cm-def\">cancel<\/span>(<span class=\"cm-keyword\">final<\/span> <span class=\"cm-variable-3\">String<\/span> <span class=\"cm-variable\">appName<\/span>, <span class=\"cm-keyword\">final<\/span> <span class=\"cm-variable-3\">String<\/span> <span class=\"cm-variable\">id<\/span>) <span class=\"cm-keyword\">throws<\/span> <span class=\"cm-variable\">Exception<\/span> {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-variable-3\">long<\/span> <span class=\"cm-variable\">expiryTime<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">System<\/span>.<span class=\"cm-variable\">currentTimeMillis<\/span>() <span class=\"cm-operator\">+<\/span> <span class=\"cm-variable\">maxProcessingDelayMs<\/span>;<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-variable\">batchingDispatcher<\/span>.<span class=\"cm-variable\">process<\/span>(<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">taskId<\/span>(<span class=\"cm-string\">\"cancel\"<\/span>, <span class=\"cm-variable\">appName<\/span>, <span class=\"cm-variable\">id<\/span>),<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">new<\/span> <span class=\"cm-variable\">InstanceReplicationTask<\/span>(<span class=\"cm-variable\">targetHost<\/span>, <span class=\"cm-variable\">Action<\/span>.<span class=\"cm-variable\">Cancel<\/span>, <span class=\"cm-variable\">appName<\/span>, <span class=\"cm-variable\">id<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-meta\">@Override<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">public<\/span> <span class=\"cm-variable\">EurekaHttpResponse<\/span><span class=\"cm-operator\">&lt;<\/span><span class=\"cm-variable-3\">Void<\/span><span class=\"cm-operator\">&gt;<\/span> <span class=\"cm-variable\">execute<\/span>() {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">return<\/span> <span class=\"cm-variable\">replicationClient<\/span>.<span class=\"cm-variable\">cancel<\/span>(<span class=\"cm-variable\">appName<\/span>, <span class=\"cm-variable\">id<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\">\u200b<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-meta\">@Override<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">public<\/span> <span class=\"cm-variable-3\">void<\/span> <span class=\"cm-variable\">handleFailure<\/span>(<span class=\"cm-variable-3\">int<\/span> <span class=\"cm-variable\">statusCode<\/span>, <span class=\"cm-variable-3\">Object<\/span> <span class=\"cm-variable\">responseEntity<\/span>) <span class=\"cm-keyword\">throws<\/span> <span class=\"cm-variable\">Throwable<\/span> {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">super<\/span>.<span class=\"cm-variable\">handleFailure<\/span>(<span class=\"cm-variable\">statusCode<\/span>, <span class=\"cm-variable\">responseEntity<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-variable\">statusCode<\/span> <span class=\"cm-operator\">==<\/span> <span class=\"cm-number\">404<\/span>) {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">logger<\/span>.<span class=\"cm-variable\">warn<\/span>(<span class=\"cm-string\">\"{}: missing entry.\"<\/span>, <span class=\"cm-variable\">getTaskName<\/span>());<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0  },<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">expiryTime<\/span><\/span>\r\n<span role=\"presentation\"> \u00a0  );<\/span>\r\n<span role=\"presentation\">}<\/span><\/pre>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\"> \u901a\u8fc7Eureka Server\u5728\u542f\u52a8\u8fc7\u7a0b\u4e2d\u521d\u59cb\u5316\u672c\u5730\u6ce8\u518c\u8868\u4fe1\u606f\u548cEureka Server\u96c6\u7fa4\u95f4\u7684\u540c\u6b65\u590d\u5236\u64cd\u4f5c\uff0c\u6700\u7ec8\u8fbe\u5230\u4e86\u96c6\u7fa4\u4e2dEureka Server\u6ce8\u518c\u8868\u4fe1\u606f\u4e00\u81f4\u7684\u76ee\u7684\u3002<\/span><\/p>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u83b7\u53d6\u6ce8\u518c\u8868\u4e2d\u670d\u52a1\u5b9e\u4f8b\u4fe1\u606f<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">Eureka Server\u4e2d\u83b7\u53d6\u6ce8\u518c\u8868\u7684\u670d\u52a1\u5b9e\u4f8b\u4fe1\u606f\u4e3b\u8981\u901a\u8fc7\u4e24\u4e2a\u65b9\u6cd5\u5b9e\u73b0\uff1a<\/span><\/p>\n<ul class=\"ul-list\" data-mark=\"-\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">AbstractInstanceRegistry#getApplicationsFromMultipleRegions\u4ece\u591a\u5730\u533a\u83b7\u53d6\u5168\u91cf\u6ce8\u518c\u8868\u6570\u636e<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">AbstractInstanceRegistry#getApplicationDeltasFromMultipleRegions\u4ece\u591a\u5730\u533a\u83b7\u53d6\u589e\u91cf\u5f0f\u6ce8\u518c\u8868\u6570\u636e\u3002<\/span><\/p>\n<\/li>\n<\/ul>\n<h5 class=\"md-end-block md-heading\"><span class=\"md-plain\">1\u3001\u5168\u91cf<\/span><\/h5>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\"> \u4e0a\u9762\u8bb2\u5230\u4ece\u8282\u70b9\u590d\u5236\u6ce8\u518c\u4fe1\u606f\u7684\u65f6\u5019\uff0c\u7528\u65b9\u6cd5public int syncUp() \uff0c\u4e00\u884cApplications apps = eurekaClient.getApplications();\u70b9\u8fdb\u53bb\u5b9e\u73b0\u7c7b\uff0c\u6709\u4e00\u884cgetApplicationsFromAllRemoteRegions(); \u4e0b\u9762getApplicationsFromMultipleRegions\uff0c\u4f5c\u7528\u4ece\u591a\u4e2a\u5730\u533a\u4e2d\u83b7\u53d6\u5168\u91cf\u6ce8\u518c\u8868\u4fe1\u606f\uff0c\u5e76\u5c01\u88c5\u6210Applications\u8fd4\u56de\uff0c\u5b83\u9996\u5148\u4f1a\u5c06\u672c\u5730\u6ce8\u518c\u8868registry\u4e2d\u7684\u6240\u6709\u670d\u52a1\u5b9e\u4f8b\u4fe1\u606f\u63d0\u53d6\u51fa\u6765\u5c01\u88c5\u5230Applications\u4e2d\uff0c\u518d\u6839\u636e\u662f\u5426\u9700\u8981\u62c9\u53d6Region\u7684\u6ce8\u518c\u4fe1\u606f\uff0c\u5c06\u8fdc\u7a0b\u62c9\u53d6\u8fc7\u6765\u7684Application\u653e\u5230\u4e0a\u9762\u7684Applications\u4e2d\u3002\u6700\u540e\u5f97\u5230\u4e00\u4e2a\u5168\u91cf\u7684Applications\u3002<\/span><\/p>\n<h5 class=\"md-end-block md-heading\"><span class=\"md-plain\">2\u3001\u589e\u91cf<\/span><\/h5>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5728\u524d\u9762\u63d0\u5230\u63a5\u53d7\u670d\u52a1\u6ce8\u518c\uff0c\u63a5\u53d7\u5fc3\u8df3\u7b49\u65b9\u6cd5\u4e2d\uff0c\u90fd\u6709recentlyChangedQueue.add(new RecentlyChangedItem(lease));\u4f5c\u7528\u662f\u5c06\u65b0\u53d8\u52a8\u7684\u670d\u52a1\u653e\u5230\u6700\u8fd1\u53d8\u5316\u7684\u670d\u52a1\u5b9e\u4f8b\u4fe1\u606f\u961f\u5217\u4e2d\uff0c\u7528\u4e8e\u8bb0\u5f55\u589e\u91cf\u662f\u6ce8\u518c\u8868\u4fe1\u606f\u3002getApplicationDeltasFromMultipleRegions\uff0c\u5b9e\u73b0\u4e86\u4ece\u8fdc\u5904eureka server\u4e2d\u83b7\u53d6\u589e\u91cf\u5f0f\u6ce8\u518c\u8868\u4fe1\u606f\u7684\u80fd\u529b\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\"> \u5728EurekaServer\u5bf9\u5916restful\u4e2d\uff0c\u5728com.netflix.eureka.resources\u4e0b\uff0c <\/span> <span class=\"md-plain\"> @GET<\/span> <span class=\"md-plain\"> public Response getApplication(@PathParam(&#8220;version&#8221;) String version,<\/span> <span class=\"md-plain\"> @HeaderParam(&#8220;Accept&#8221;) final String acceptHeader,<\/span> <span class=\"md-plain\"> @HeaderParam(EurekaAccept.HTTP_X_EUREKA_ACCEPT) String eurekaAccept) {<\/span> <span class=\"md-plain\"> \u5176\u4e2d\u6709\u4e00\u53e5\uff1aString payLoad = responseCache.get(cacheKey);\u5728responseCache\u521d\u59cb\u5316\u7684\u65f6\u5019\uff0c\u5b83\u7684\u6784\u9020\u65b9\u6cd5ResponseCacheImpl(EurekaServerConfig serverConfig, ServerCodecs serverCodecs, AbstractInstanceRegistry registry) {\u4e2d\uff0cValue value = generatePayload(key);\u70b9\u8fdb\u53bb\u6709\u4e00\u53e5\uff1aregistry.getApplicationDeltasFromMultipleRegions(key.getRegions()));<\/span><span class=\"md-pair-s \"><strong><span class=\"md-plain\">\u4ece\u8fdc\u7a0b\u83b7\u53d6delta\u589e\u91cf\u6ce8\u518c\u4fe1\u606f\u3002\u4f46\u662f\u8fd9\u4e2a\u53ea\u662f\u5411client\u63d0\u4f9b\uff0c\u4e0d\u5411server\u63d0\u4f9b\uff0c\u56e0\u4e3aserver\u53ef\u4ee5\u901a\u8fc7\u6bcf\u6b21\u53d8\u66f4\u81ea\u52a8\u540c\u6b65\u5230peer\u3002<\/span><\/strong><\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\"> \u83b7\u53d6\u589e\u91cf\u5f0f\u6ce8\u518c\u8868\u4fe1\u606f\u5c06\u4f1a\u4ecerecentlyChangedQueue\u4e2d\u83b7\u53d6\u6700\u8fd1\u53d8\u5316\u7684\u670d\u52a1\u5b9e\u4f8b\u4fe1\u606f\u3002recentlyChangedQueue\u4e2d\u7edf\u8ba1\u4e86\u8fd13\u5206\u949f\u5185\u8fdb\u884c\u6ce8\u518c\u3001\u4fee\u6539\u548c\u5254\u9664\u7684\u670d\u52a1\u5b9e\u4f8b\u4fe1\u606f\uff0c\u5728\u670d\u52a1\u6ce8\u518cAbstractInstanceRegistry#registry\u3001\u63a5\u53d7\u5fc3\u8df3\u8bf7\u6c42AbstractInstanceRegistry#renew\u548c\u670d\u52a1\u4e0b\u7ebfAbstractInstanceRegistry#internalCancel\u7b49\u65b9\u6cd5\u4e2d\u5747\u53ef\u89c1\u5230recentlyChangedQueue\u5bf9\u8fd9\u4e9b\u670d\u52a1\u5b9e\u4f8b\u8fdb\u884c\u767b\u8bb0\uff0c\u7528\u4e8e\u8bb0\u5f55\u589e\u91cf\u5f0f\u6ce8\u518c\u8868\u4fe1\u606f\u3002#getApplicationsFromMultipleRegions\u65b9\u6cd5\u540c\u6837\u63d0\u4f9b\u4e86\u4ece\u8fdc\u7a0bRegion\u7684Eureka Server\u83b7\u53d6\u589e\u91cf\u5f0f\u6ce8\u518c\u8868\u4fe1\u606f\u7684\u80fd\u529b\u3002<\/span><\/p>\n<h2 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u53c2\u8003\u8d44\u6599<\/span><\/h2>\n<ul class=\"ul-list\" data-mark=\"-\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-meta-i-c md-link md-expand\"><a spellcheck=\"false\" href=\"https:\/\/github.com\/bjmashibing\/InternetArchitect\/tree\/master\/20%20%E6%9E%B6%E6%9E%84%E5%B8%88%E4%B8%89%E6%9C%9F%20SpringCloud%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84\/%E5%B8%B8%E8%80%81%E5%B8%88%E7%BD%91%E7%BA%A6%E8%BD%A6%E9%A1%B9%E7%9B%AE%E9%A2%84%E4%B9%A0%E8%B5%84%E6%96%99\/%E6%8C%89%E7%BB%84%E4%BB%B6%E5%8C%BA%E5%88%86\"><span class=\"md-plain\">spring cloud\u516c\u5f00\u8bfe\u8d44\u6599<\/span><\/a><\/span><\/p>\n<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u8bf4\u660e \u82e5\u65e0\u7279\u522b\u8bf4\u660e\uff0c\u672c\u6587\u6240\u6d89\u53ca\u7684\u4ee3\u7801\u7248\u672c\u4e3aspring boot\/cloud 2.2.6\u3002 eureka se <a href='http:\/\/prayerlaputa.com\/?p=889' class='excerpt-more'>[&#8230;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[97,18],"tags":[106,98,50],"_links":{"self":[{"href":"http:\/\/prayerlaputa.com\/index.php?rest_route=\/wp\/v2\/posts\/889"}],"collection":[{"href":"http:\/\/prayerlaputa.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/prayerlaputa.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/prayerlaputa.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/prayerlaputa.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=889"}],"version-history":[{"count":2,"href":"http:\/\/prayerlaputa.com\/index.php?rest_route=\/wp\/v2\/posts\/889\/revisions"}],"predecessor-version":[{"id":897,"href":"http:\/\/prayerlaputa.com\/index.php?rest_route=\/wp\/v2\/posts\/889\/revisions\/897"}],"wp:attachment":[{"href":"http:\/\/prayerlaputa.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=889"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/prayerlaputa.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=889"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/prayerlaputa.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=889"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}