{"id":1804,"date":"2023-03-27T22:48:28","date_gmt":"2023-03-27T14:48:28","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=1804"},"modified":"2023-04-22T09:25:07","modified_gmt":"2023-04-22T01:25:07","slug":"spring-cloud-gray-access-and-deployment-record","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/03\/27\/spring-cloud-gray-access-and-deployment-record\/","title":{"rendered":"Spring Cloud Gray \u63a5\u5165\u53ca\u90e8\u7f72\u8bb0\u5f55"},"content":{"rendered":"<h3>\u5c0f\u6280\u5de7<\/h3>\n<ul>\n<li>\u5982\u679c\u7070\u5ea6\u5b9e\u4f8b\u4e0d\u751f\u6548\uff0c\u53ef\u5c1d\u8bd5\u5c06<code>Gray Status<\/code>\u5148\u7f6e\u4e3a<code>CLOSE<\/code>\uff0c\u518d\u7f6e\u4e3a<code>OPEN<\/code><\/li>\n<li>\u5982\u679c<code>HttpTrack<\/code>\u4e0d\u8d77\u4f5c\u7528\uff0c\u53ef\u5c1d\u8bd5\u91cd\u65b0\u914d\u7f6e\u63d0\u4ea4<\/li>\n<\/ul>\n<h3>\u6570\u636e\u5e93\u7f16\u7801<\/h3>\n<p><!-- more --><\/p>\n<pre><code class=\"language-sql\">ALTER DATABASE gray_service CHARACTER SET utf8 COLLATE utf8_general_ci;<\/code><\/pre>\n<h3>\u6570\u636e\u5e93\u5b57\u6bb5\u957f\u5ea6<\/h3>\n<pre><code class=\"language-sql\">ALTER TABLE `gray_service` CHANGE `service_id` `service_id` VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;\nALTER TABLE `user_service_authority` CHANGE `service_id` `service_id` VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL;\nALTER TABLE `gray_track` CHANGE `service_id` `service_id` VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL;\nALTER TABLE `gray_instance` CHANGE `instance_id` `instance_id` VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;\nALTER TABLE `gray_instance` CHANGE `service_id` `service_id` VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL;\nALTER TABLE `route_policy_record` CHANGE `resource` `resource` VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL;\nALTER TABLE `gray_event_log` CHANGE `source_id` `source_id` VARCHAR(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL;<\/code><\/pre>\n<h3>\u7aef\u53e3\u5f00\u653e<\/h3>\n<blockquote>\n<p><code>gray-server<\/code>\u7684\u7aef\u53e3\u9700\u8981\u5bf9\u6240\u6709<code>gray-client<\/code>\u53ca\u7ba1\u7406\u524d\u7aef\u5f00\u53d1<\/p>\n<\/blockquote>\n<h3>\u4e00\u76f4\u62a5\u8bb0\u5f55\u4e0bip<\/h3>\n<p>\u4e00\u76f4\u62a5\uff1a<code>\u8bb0\u5f55\u4e0bip:192.168.10.88<\/code>\uff0c\u5176\u4e2d<code>192.168.10.88<\/code>\u662f\u6ce8\u518c\u4e2d\u5fc3\u7684IP<br \/>\n\u89e3\u51b3\uff1a\u5220\u9664traceIP<br \/>\n\u5206\u6790\uff1atraceIP\u4e0d\u7528\u5728\u6bcf\u4e2a\u670d\u52a1\u6dfb\u52a0\u3002\u4e00\u822c\u53ea\u9700\u8981\u5728\u6d41\u91cf\u5165\u53e3\u6dfb\u52a0\u5373\u53ef\uff0c\u6bd4\u5982\u7f51\u5173\uff0c\u4f1a\u5168\u94fe\u8def\u4f20\u9012\u4e0b\u53bb\uff08\u53ef\u6dfb\u52a0<code>HttpReceive<\/code>\uff09\u3002\u5728\u6bcf\u4e2a\u670d\u52a1\u6dfb\u52a0traceIP\uff0c\u53cd\u800c\u4f1a\u8986\u76d6\u6389\u7528\u6237\u7684ip<\/p>\n<pre><code class=\"language-java\">2020-10-15 09:15:05.015 [cn-appblog-provider-test][ DEBUG] [5108] [nio-8862-exec-9] [5185f3bd86d5af0b] [5185f3bd86d5af0b] [false] --- [cn.springcloud.gray.web.tracker.HttpIPGrayInfoTracker] [call] [18] : \u8bb0\u5f55\u4e0bip:192.168.10.88\n2020-10-15 09:16:05.075 [cn-appblog-provider-test][ DEBUG] [5108] [nio-8862-exec-9] [7c99bf7eb98b6d62] [7c99bf7eb98b6d62] [false] --- [cn.springcloud.gray.web.tracker.HttpIPGrayInfoTracker] [call] [18] : \u8bb0\u5f55\u4e0bip:192.168.10.88<\/code><\/pre>\n<h3>LongPollingWorker\u76d1\u542c\u9519\u8bef<\/h3>\n<blockquote>\n<p>\u53d1\u751f\u573a\u666f\uff1a<code>gray-server<\/code>\u91cd\u542f\u6216\u5b95\u673a<\/p>\n<p>\u6ce8\u610f\u65e5\u5fd7\u7ea7\u522b\u662f<code>ERROR<\/code><\/p>\n<\/blockquote>\n<pre><code class=\"language-java\">2020-10-21 18:09:06.938 [cn-appblog-provider-test][ ERROR] [116537] [ling-1-thread-1] [] [] [] --- [cn.springcloud.gray.client.plugin.event.longpolling.LongPollingWorker] [listenEvents] [78] : \u76d1\u542c\u5931\u8d251\u6b21\njava.lang.RuntimeException: java.net.ConnectException: Connection refused\n    at cn.springcloud.gray.routing.connectionpoint.RoutingConnectionPoint.executeOrMock(RoutingConnectionPoint.java:41)\n    at cn.springcloud.gray.client.netflix.resttemplate.GrayClientHttpRequestIntercptor.intercept(GrayClientHttpRequestIntercptor.java:64)\n    at org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:92)\n    at brave.spring.web.TracingClientHttpRequestInterceptor.intercept(TracingClientHttpRequestInterceptor.java:53)\n    at org.springframework.cloud.sleuth.instrument.web.client.LazyTracingClientHttpRequestInterceptor.intercept(TraceWebClientAutoConfiguration.java:306)\n    at org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:92)\n    at org.springframework.http.client.InterceptingClientHttpRequest.executeInternal(InterceptingClientHttpRequest.java:76)\n    at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48)\n    at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53)\n    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:735)\n    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:691)\n    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:589)\n    at cn.springcloud.gray.communication.http.RestTemplateAgent.request(RestTemplateAgent.java:57)\n    at cn.springcloud.gray.client.plugin.event.longpolling.GrayEventRemoteClient.request(GrayEventRemoteClient.java:106)\n    at cn.springcloud.gray.client.plugin.event.longpolling.GrayEventRemoteClient.listeningNewestStatus(GrayEventRemoteClient.java:68)\n    at cn.springcloud.gray.client.plugin.event.longpolling.LongPollingWorker.listening(LongPollingWorker.java:115)\n    at cn.springcloud.gray.client.plugin.event.longpolling.LongPollingWorker.listenEvents(LongPollingWorker.java:76)\n    at cn.springcloud.gray.client.plugin.event.longpolling.LongPollingWorker$$Lambda$752\/494951073.run(Unknown Source)\n    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)\n    at java.util.concurrent.FutureTask.run(FutureTask.java:266)\n    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)\n    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)\n    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)\n    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)\n    at java.lang.Thread.run(Thread.java:745)\nCaused by: java.net.ConnectException: Connection refused\n    at java.net.PlainSocketImpl.socketConnect(Native Method)\n    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)<\/code><\/pre>\n<pre><code class=\"language-java\">2020-10-14 13:59:06.492 [cn-appblog-provider-test][ ERROR] [103347] [ling-1-thread-1] [] [] [] --- [cn.springcloud.gray.client.plugin.event.longpolling.LongPollingWorker] [listenEvents] [78] : \u76d1\u542c\u5931\u8d251\u6b21\norg.springframework.web.client.HttpClientErrorException$BadRequest: 400 null\n    at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:79)\n    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:122)\n    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:102)\n    at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)\n    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:778)\n    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:736)\n    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:691)\n    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:589)\n    at cn.springcloud.gray.communication.http.RestTemplateAgent.request(RestTemplateAgent.java:57)\n    at cn.springcloud.gray.client.plugin.event.longpolling.GrayEventRemoteClient.request(GrayEventRemoteClient.java:106)\n    at cn.springcloud.gray.client.plugin.event.longpolling.GrayEventRemoteClient.listeningNewestStatus(GrayEventRemoteClient.java:68)\n    at cn.springcloud.gray.client.plugin.event.longpolling.LongPollingWorker.listening(LongPollingWorker.java:115)\n    at cn.springcloud.gray.client.plugin.event.longpolling.LongPollingWorker.listenEvents(LongPollingWorker.java:76)\n    at cn.springcloud.gray.client.plugin.event.longpolling.LongPollingWorker$$Lambda$752\/1286771084.run(Unknown Source)\n    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)\n    at java.util.concurrent.FutureTask.run(FutureTask.java:266)\n    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)\n    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)\n    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)\n    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)\n    at java.lang.Thread.run(Thread.java:745)<\/code><\/pre>\n<h3>gray-server\u8fde\u63a5\u8d85\u65f6<\/h3>\n<p>\u8bbf\u95ee\u8d85\u65f6\uff1a\u5982\u7aef\u53e3\u672a\u5f00\u653e\u7b49\u539f\u56e0<\/p>\n<pre><code class=\"language-java\">2020-10-22 09:21:38.071 [cn-appblog-provider-test][ ERROR] [19265] [           main] [] [] [] --- [cn.springcloud.gray.communication.HttpInformationClient] [requestData] [139] : \u83b7\u53d6\u6240\u6709\u7070\u5ea6\u4fe1\u606f\u5931\u8d25:java.net.ConnectException: Connection timed out (Connection timed out)\njava.lang.RuntimeException: java.net.ConnectException: Connection timed out (Connection timed out)\n    at cn.springcloud.gray.routing.connectionpoint.RoutingConnectionPoint.executeOrMock(RoutingConnectionPoint.java:41)\n    at cn.springcloud.gray.client.netflix.resttemplate.GrayClientHttpRequestIntercptor.intercept(GrayClientHttpRequestIntercptor.java:64)\n    at org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:92)\n    at brave.spring.web.TracingClientHttpRequestInterceptor.intercept(TracingClientHttpRequestInterceptor.java:53)\n    at org.springframework.cloud.sleuth.instrument.web.client.LazyTracingClientHttpRequestInterceptor.intercept(TraceWebClientAutoConfiguration.java:306)\n    at org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:92)\n    at org.springframework.http.client.InterceptingClientHttpRequest.executeInternal(InterceptingClientHttpRequest.java:76)\n    at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48)\n    at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53)\n    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:735)\n    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:691)\n    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:589)\n    at cn.springcloud.gray.communication.http.RestTemplateAgent.request(RestTemplateAgent.java:57)\n    at cn.springcloud.gray.communication.HttpInformationClient.request(HttpInformationClient.java:118)\n    at cn.springcloud.gray.communication.HttpInformationClient.requestData(HttpInformationClient.java:132)\n    at cn.springcloud.gray.communication.HttpInformationClient.allInfos(HttpInformationClient.java:48)\n    at cn.springcloud.gray.communication.InformationClientDecorator$3.execute(InformationClientDecorator.java:70)\n    at cn.springcloud.gray.communication.InformationClientDecorator$3.execute(InformationClientDecorator.java:67)\n    at cn.springcloud.gray.communication.RetryableInformationClient.execute(RetryableInformationClient.java:30)\n    at cn.springcloud.gray.communication.InformationClientDecorator.allInfos(InformationClientDecorator.java:67)\n    at cn.springcloud.gray.refresh.GrayInformationRefresher.load(GrayInformationRefresher.java:62)\n    at cn.springcloud.gray.refresh.GrayInformationRefresher.refresh(GrayInformationRefresher.java:57)\n    at cn.springcloud.gray.refresh.SimpleRefreshDriver.refresh(SimpleRefreshDriver.java:21)\n    at cn.springcloud.gray.client.initialize.DefaultGrayInfosInitializer.doUpdate(DefaultGrayInfosInitializer.java:113)\n    at cn.springcloud.gray.client.initialize.DefaultGrayInfosInitializer.openForWork(DefaultGrayInfosInitializer.java:71)\n    at cn.springcloud.gray.client.initialize.DefaultGrayInfosInitializer.scheduleOpenForWork(DefaultGrayInfosInitializer.java:63)\n    at cn.springcloud.gray.client.initialize.DefaultGrayInfosInitializer.setup(DefaultGrayInfosInitializer.java:47)\n    at cn.springcloud.gray.client.initialize.GrayClientApplicationRunner.initializeGrayInfos(GrayClientApplicationRunner.java:60)\n    at cn.springcloud.gray.client.initialize.GrayClientApplicationRunner.run(GrayClientApplicationRunner.java:52)\n    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:804)\n    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:794)\n    at org.springframework.boot.SpringApplication.run(SpringApplication.java:324)\n    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)\n    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)\n    at com.lianlian.global.thai.gateway.sdk.GatewaySdkApplication.main(GatewaySdkApplication.java:23)\n    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n    at java.lang.reflect.Method.invoke(Method.java:498)\n    at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)\n    at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)\n    at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)\n    at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)\nCaused by: java.net.ConnectException: Connection timed out (Connection timed out)\n    at java.net.PlainSocketImpl.socketConnect(Native Method)\n    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)\n    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)<\/code><\/pre>\n<h3>actuator\u5fc3\u8df3\u8bbf\u95ee\u8def\u5f84\u672a\u88ab\u6388\u6743<\/h3>\n<pre><code class=\"language-java\">[cn.springcloud.gray.server.configuration.OAuth2Config] [commence] [163] : path:\/actuator -&gt; Full authentication is required to access this resource<\/code><\/pre>\n<p>\uff081\uff09\u4fee\u6539\uff1a<code>cn.springcloud.gray.server.configuration.OAuth2Config<\/code>\uff0c<code>permitPathPatterns<\/code>\u52a0\u5165<code>\/actuator\/**<\/code><br \/>\n\uff082\uff09<code>spring-cloud-gray-server<\/code>\u53ca<code>spring-cloud-starter-gray-server<\/code>\u91cd\u65b0<code>mvn install<\/code>\u53ca<code>mvn deploy<\/code><\/p>\n<pre><code class=\"language-java\">@ConditionalOnProperty(value = &quot;gray.server.security.oauth2.enabled&quot;, matchIfMissing = true)\n@Configuration\npublic class OAuth2Config {\n\n    ...\n\n    @Configuration\n    @EnableResourceServer\n    public static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {\n\n        public String[] permitPathPatterns = {\n                &quot;\/**.html&quot;, &quot;\/**.js&quot;, &quot;\/**.css&quot;, &quot;\/**.png&quot;,\n                &quot;\/swagger-resources\/**&quot;, &quot;\/v2\/api-docs&quot;, &quot;\/webjars\/**&quot;,\n                &quot;\/gray\/user\/login&quot;, &quot;\/gray\/user\/login&quot;, &quot;\/gray\/instances\/enable&quot;,\n                &quot;\/gray\/instances&quot;, &quot;\/gray\/trackDefinitions&quot;, &quot;\/gray\/v1\/**&quot;, &quot;\/gray\/v2\/**&quot;,\n                &quot;\/server\/synch\/accept&quot;, &quot;\/actuator\/**&quot;\n        };\n\n        @Autowired\n        private TokenStore tokenStore;\n\n        @Override\n        public void configure(HttpSecurity http) throws Exception {\n            http.formLogin().and()\n                    .authorizeRequests()\n\/\/                    .antMatchers(&quot;\/gray\/user\/login&quot;).permitAll()\n\/\/                    .antMatchers(&quot;\/gray\/user\/login&quot;).permitAll()\n\/\/                    .antMatchers(&quot;\/gray\/instances\/enable&quot;).permitAll()\n\/\/                    .antMatchers(&quot;\/gray\/instances&quot;).permitAll()\n\/\/                    .antMatchers(&quot;\/gray\/trackDefinitions&quot;).permitAll()\n\/\/                    .antMatchers(&quot;\/gray\/v1\/**&quot;, &quot;\/gray\/v2\/**&quot;).permitAll()\n                    .antMatchers(permitPathPatterns).permitAll()\n\n                    .antMatchers(HttpMethod.OPTIONS, &quot;\/**&quot;).permitAll()\n\/\/                    .antMatchers(&quot;\/gray\/service\/**&quot;).authenticated()\n\/\/                    .antMatchers(&quot;\/gray\/policy\/**&quot;).authenticated()\n\/\/                    .antMatchers(&quot;\/gray\/decision\/**&quot;).authenticated()\n\/\/                    .antMatchers(&quot;\/gray\/discover\/**&quot;).authenticated()\n\/\/                    .antMatchers(&quot;\/gray\/track\/**&quot;).authenticated()\n\/\/                    .antMatchers(&quot;\/route\/**&quot;).authenticated()\n                    .anyRequest().authenticated()\n                    .and()\n                    .csrf().disable();\n        }\n\n    ....<\/code><\/pre>\n<h3>Zipkin\u8c03\u7528\u94fe\u62a5\u9519<\/h3>\n<p>\uff081\uff09\u4fee\u6539\uff1a<code>cn.springcloud.gray.client.netflix.ribbon.GrayChooserRule.choose<\/code>\uff0c<code>WARN<\/code>\u65e5\u5fd7\u7ea7\u522b\u6539\u4e3a<code>DEBUG<\/code><br \/>\n\uff082\uff09<code>spring-cloud-gray-client<\/code>\u53ca<code>spring-cloud-starter-gray-client<\/code>\u91cd\u65b0<code>mvn install<\/code>\u53ca<code>mvn deploy<\/code><\/p>\n<pre><code class=\"language-java\">2020-10-14 10:59:32.206 [cn-appblog-provider-test][ DEBUG ] [86752] [ender@60d8c0dc}] [] [] [] --- [cn.springcloud.gray.choose.DefaultServerChooser] [chooseServer] [57] : serviceId: null\n2020-10-14 10:59:32.208 [cn-appblog-provider-test][ WARN  ] [86752] [ender@60d8c0dc}] [] [] [] --- [cn.springcloud.gray.client.netflix.ribbon.GrayChooserRule] [choose] [32] : gray choose server occur exception:null, execute super method.\njava.lang.NullPointerException: null\n    at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:936)\n    at cn.springcloud.gray.SimpleGrayManager.getGrayService(SimpleGrayManager.java:52)\n    at cn.springcloud.gray.GrayManager.hasServiceGray(GrayManager.java:37)\n    at cn.springcloud.gray.DefaultGrayManager.hasServiceGray(DefaultGrayManager.java:22)\n    at cn.springcloud.gray.choose.DefaultServerChooser.chooseServer(DefaultServerChooser.java:60)\n    at cn.springcloud.gray.client.netflix.ribbon.GrayChooserRule.choose(GrayChooserRule.java:23)\n    at com.netflix.loadbalancer.BaseLoadBalancer.chooseServer(BaseLoadBalancer.java:755)\n    at com.netflix.loadbalancer.ZoneAwareLoadBalancer.chooseServer(ZoneAwareLoadBalancer.java:113)\n    at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.getServer(RibbonLoadBalancerClient.java:189)\n    at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.choose(RibbonLoadBalancerClient.java:88)\n    at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.choose(RibbonLoadBalancerClient.java:78)\n    at org.springframework.cloud.sleuth.zipkin2.sender.LoadBalancerClientZipkinLoadBalancer.instance(LoadBalancerClientZipkinLoadBalancer.java:43)\n    at org.springframework.cloud.sleuth.zipkin2.sender.ZipkinRestTemplateSenderConfiguration$1.zipkinUrl(ZipkinRestTemplateSenderConfiguration.java:69)\n    at org.springframework.cloud.sleuth.zipkin2.sender.ZipkinRestTemplateWrapper.doExecute(ZipkinRestTemplateSenderConfiguration.java:160)\n    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:637)\n    at org.springframework.cloud.sleuth.zipkin2.sender.RestTemplateSender.post(RestTemplateSender.java:129)\n    at org.springframework.cloud.sleuth.zipkin2.sender.RestTemplateSender$HttpPostCall.doExecute(RestTemplateSender.java:142)\n    at org.springframework.cloud.sleuth.zipkin2.sender.RestTemplateSender$HttpPostCall.doExecute(RestTemplateSender.java:132)\n    at zipkin2.Call$Base.execute(Call.java:379)\n    at zipkin2.reporter.AsyncReporter$BoundedAsyncReporter.flush(AsyncReporter.java:286)\n    at zipkin2.reporter.AsyncReporter$Builder$1.run(AsyncReporter.java:190)<\/code><\/pre>\n<pre><code class=\"language-java\">@Slf4j\npublic class GrayChooserRule extends ZoneAvoidanceRule {\n\n    private ServerChooser&lt;Server&gt; serverChooser;\n\n    public GrayChooserRule() {\n        serverChooser = GrayClientHolder.getServerChooser();\n    }\n\n    @Override\n    public Server choose(Object key) {\n        try {\n            return serverChooser.chooseServer(getLoadBalancer().getAllServers(), (group, servers) -&gt; {\n                Optional&lt;Server&gt; server = getPredicate().chooseRoundRobinAfterFiltering(servers, key);\n                if (server.isPresent()) {\n                    return server.get();\n                } else {\n                    return null;\n                }\n            });\n        } catch (Exception e) {\n            \/\/log.warn(&quot;gray choose server occur exception:{}, execute super method.&quot;, e.getMessage(), e);\n            log.debug(&quot;gray choose server occur exception:{}, execute super method.&quot;, e.getMessage(), e);\n            return super.choose(key);\n        }\n    }\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u5c0f\u6280\u5de7 \u5982\u679c\u7070\u5ea6\u5b9e\u4f8b\u4e0d\u751f\u6548\uff0c\u53ef\u5c1d\u8bd5\u5c06Gray Status\u5148\u7f6e\u4e3aCLOSE\uff0c\u518d\u7f6e\u4e3aOPEN \u5982\u679cHttpTra [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[450],"class_list":["post-1804","post","type-post","status-publish","format-standard","hentry","category-java","tag-spring-cloud-gray"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1804","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=1804"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1804\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=1804"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=1804"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=1804"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}