{"id":1802,"date":"2023-03-27T22:46:37","date_gmt":"2023-03-27T14:46:37","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=1802"},"modified":"2023-04-23T21:10:48","modified_gmt":"2023-04-23T13:10:48","slug":"spring-cloud-gray-sample-debugging-record","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/03\/27\/spring-cloud-gray-sample-debugging-record\/","title":{"rendered":"Spring Cloud Gray Sample \u8c03\u8bd5\u8bb0\u5f55"},"content":{"rendered":"<h3>\u4f9d\u6b21\u8fd0\u884c\u5e94\u7528<\/h3>\n<pre><code class=\"language-bash\">nohup java -Dfile.encoding=UTF-8 -jar spring-cloud-gray-eureka-sample-C.1.0.1-SNAPSHOT.jar &gt; eureka.log 2&gt;&amp;1 &amp;\nnohup java -Dfile.encoding=UTF-8 -jar spring-cloud-gray-server-sample-C.1.0.1-SNAPSHOT.jar &gt; server.log 2&gt;&amp;1 &amp;\nnohup java -Dfile.encoding=UTF-8 -jar spring-cloud-gray-server2-sample-C.1.0.1-SNAPSHOT.jar &gt; server2.log 2&gt;&amp;1 &amp;\nnohup java -Dfile.encoding=UTF-8 -jar spring-cloud-gray-service-a-sample-C.1.0.1-SNAPSHOT.jar &gt; service-a.log 2&gt;&amp;1 &amp;\nnohup java -Dfile.encoding=UTF-8 -jar spring-cloud-gray-service-a1-sample-C.1.0.1-SNAPSHOT.jar &gt; service-a1.log 2&gt;&amp;1 &amp;\nnohup java -Dfile.encoding=UTF-8 -jar spring-cloud-gray-service-b-sample-C.1.0.1-SNAPSHOT.jar &gt; service-b.log 2&gt;&amp;1 &amp;\nnohup java -Dfile.encoding=UTF-8 -jar spring-cloud-gray-stream-sample-C.1.0.1-SNAPSHOT.jar &gt; stream.log 2&gt;&amp;1 &amp;\nnohup java -Dfile.encoding=UTF-8 -jar spring-cloud-gray-zuul-sample-C.1.0.1-SNAPSHOT.jar &gt; zuul.log 2&gt;&amp;1 &amp;<\/code><\/pre>\n<p><!-- more --><\/p>\n<p>\u4fee\u6539\u6570\u636e\u5e93\u7f16\u7801<\/p>\n<pre><code class=\"language-sql\">ALTER DATABASE gray_service CHARACTER SET utf8 COLLATE utf8_general_ci;<\/code><\/pre>\n<p>\u5728\u7ba1\u63a7\u7aef\u6570\u636e\u5e93\u6dfb\u52a0\u7ba1\u7406\u5458\u8d26\u53f7\uff0c\u7528\u6237\u540d:<code>admin<\/code> \u5bc6\u7801:<code>abc123<\/code><\/p>\n<pre><code class=\"language-sql\">insert into `user` ( `user_id`, `account`, `name`, `password`, `roles`, `status`, `create_time`, `operator`, `operate_time`) values ( &#039;admin&#039;, &#039;admin&#039;, &#039;Admin&#039;, &#039;e7a57e51394e91cba19deca3337bfab0&#039;, &#039;admin&#039;, &#039;1&#039;, now(), &#039;admin&#039;, now());<\/code><\/pre>\n<p>\u670d\u52a1\u540d\u957f\u5ea6\u9650\u5236\u6539\u4e3a64<\/p>\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>\u7ba1\u63a7\u7aef\u524d\u7aef\u90e8\u7f72<\/h3>\n<pre><code class=\"language-bash\">$ npm i\n$ npm run dev<\/code><\/pre>\n<h3>\u6d4b\u8bd5\u8bbf\u95ee\u8def\u5f84<\/h3>\n<ul>\n<li>zuul -&gt; service-b -&gt; service-a: <a target=\"_blank\" rel=\"noopener\" href=\"http:\/\/127.0.0.1:20301\/gateway\/service-b\/api\/test\/restTemplateGet\">http:\/\/127.0.0.1:20301\/gateway\/service-b\/api\/test\/restTemplateGet<\/a><\/li>\n<li>zuul -&gt; service-a: <a target=\"_blank\" rel=\"noopener\" href=\"http:\/\/127.0.0.1:20301\/gateway\/service-a\/api\/test\/get\">http:\/\/127.0.0.1:20301\/gateway\/service-a\/api\/test\/get<\/a><\/li>\n<li>service-b -&gt; service-a: <a target=\"_blank\" rel=\"noopener\" href=\"http:\/\/127.0.0.1:20102\/api\/test\/restTemplateGet\">http:\/\/127.0.0.1:20102\/api\/test\/restTemplateGet<\/a><\/li>\n<\/ul>\n<h3>\u65e5\u5fd7\u53ca\u62a5\u8b66<\/h3>\n<p>\uff081\uff09\u65e5\u5fd7\u8fc7\u6ee4\uff1a<code>ERROR [service-a,,,] 1082 --- [ling-1-thread-1] c.s.g.c.p.e.l.LongPollingWorker<\/code><\/p>\n<p>\u5426\u5219\u91cd\u542fServer\u7aef\u4f1a\u6709\u62a5\u8b66<\/p>\n<p>\uff082\uff09Load balancer does not have available server for client \u4e0d\u4f1a\u4ea7\u751f<code>ERROR<\/code>\u7ea7\u522b\u65e5\u5fd7\uff0c\u53ef\u4ee5\u4e0d\u7528\u8fc7\u6ee4<\/p>\n<pre><code>WARN 28887 --- [io-20301-exec-3] o.s.c.n.z.filters.post.SendErrorFilter   : Error during filtering\n    com.netflix.zuul.exception.ZuulException: Forwarding error\n    Caused by: com.netflix.client.ClientException: Load balancer does not have available server for client: service-b<\/code><\/pre>\n<h3>\u670d\u52a1\u53d1\u73b0<\/h3>\n<p>\u5982\u679c\u4f7f\u7528Nacos\u505a\u670d\u52a1\u53d1\u73b0\uff0c\u6700\u5408\u7406\u7684\u662f\u5c06Eureka\u4f9d\u8d56\u6392\u9664\u6389\uff0c\u5728<code>gray-client-starter<\/code>\u4e2d\u9ed8\u8ba4\u4f9d\u8d56\u4e86<code>eureka-plugin<\/code><\/p>\n<pre><code class=\"language-xml\">&lt;dependency&gt;\n    &lt;groupId&gt;cn.springcloud.gray&lt;\/groupId&gt;\n    &lt;artifactId&gt;spring-cloud-starter-gray-client&lt;\/artifactId&gt;\n    &lt;version&gt;${project.version}&lt;\/version&gt;\n    &lt;exclusions&gt;\n        &lt;exclusion&gt;\n            &lt;groupId&gt;cn.springcloud.gray&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-cloud-gray-plugin-webmvc&lt;\/artifactId&gt;\n        &lt;\/exclusion&gt;\n    &lt;\/exclusions&gt;\n    &lt;exclusions&gt;\n        &lt;exclusion&gt;\n            &lt;groupId&gt;cn.springcloud.gray&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-cloud-gray-plugin-eureka&lt;\/artifactId&gt;\n        &lt;\/exclusion&gt;\n    &lt;\/exclusions&gt;\n&lt;\/dependency&gt;<\/code><\/pre>\n<h3>\u76f8\u5173\u95ee\u9898<\/h3>\n<p>\uff081\uff09\u670d\u52a1\u5217\u8868\u4e2d\u5b9e\u4f8b\u6570\u548c\u7070\u5ea6\u6570\u662f\u5b9a\u65f6\u53bb\u68c0\u67e5\u7684\uff0c\u4f1a\u6ede\u540e\uff0c\u4e0d\u5f71\u54cd\u6b63\u5e38\u529f\u80fd<\/p>\n<p>\uff082\uff09\u5148\u542f\u52a8\u5fae\u670d\u52a1\u4e00\u6bb5\u65f6\u95f4\uff0c\u5728\u53bb\u542f\u52a8<code>gray-Server<\/code>\u3002\u8fd9\u79cd\u60c5\u51b5\u7070\u5ea6\u4e0d\u4f1a\u7acb\u5373\u751f\u6548\uff0c\u6700\u957f\u9700\u8981\u7b49\u4e00\u5206\u949f<\/p>\n<p>\uff083\uff09<code>spring-cloud-gray-client-netflix<\/code>\u4e2d\u7528\u5230<code>hystrix<\/code>\u3002\u800c\u516c\u53f8\u6846\u67b6\u9650\u6d41\u7528<code>sentinel<\/code>\u3002\u8fd9\u79cd\u60c5\u51b5\u4e0d\u7528\u6539\u9020\uff0c<code>hystrix<\/code>\u6709\u7ebf\u7a0b\u6c60\u9694\u79bb\u6a21\u5f0f\u9700\u8981\u7279\u522b\u6269\u5c55\uff0c<code>sentinel<\/code>\u662f\u4f7f\u7528\u4fe1\u53f7\u91cf\u9694\u79bb\u7684<\/p>\n<p>\uff084\uff09\u4f7f\u7528Nacos\u505a\u670d\u52a1\u53d1\u73b0\uff0c\u624b\u52a8\u4fee\u6539<code>instance Status up -&gt; down<\/code>\u4fee\u6539\u6210\u529f\u3002\u91cd\u65b0\u4fee\u6539\u56de\u6765\u65f6\u5019\u62a5\u9519<code>404<\/code>\uff0c\u8fd9\u662f\u56e0\u4e3aNacos\u6ca1\u6709\u627e\u5230\u91cd\u65b0\u5c06\u670d\u52a1\u5b9e\u4f8b\u6539\u4e3aUP\u7684\u63a5\u53e3 <\/p>\n<p>\uff085\uff09track\u9700\u8981\u914d\u5168\u7070\u5ea6\u8ffd\u8e2a\u53bb\u7528\u7684\u3002\u5982\u679c\u60f3\u5728\u94fe\u8def\u4e2d\u4f20\u9012\uff0c\u9700\u8981\u4f7f\u7528\u7070\u5ea6\u8ffd\u8e2a\uff0c\u6700\u597d\u662f\u5165\u53e3\u5904\uff0c\u4f8b\u5982\u7f51\u5173<\/p>\n<p>\uff086\uff09\u7248\u672c\u7070\u5ea6\u4f7f\u7528<code>eureka.instance.metadata-map.version<\/code>\u53c2\u6570\u5b9a\u4e49\u7248\u672c<\/p>\n<p>\uff087\uff09\u5982\u679c\u5f00\u542f\u7070\u5ea6\u5b9e\u4f8b\uff0c\u5e76\u4e14\u6ca1\u6709\u914d\u7f6e\u7070\u5ea6\u7b56\u7565\uff0c\u6216\u8005\u7070\u5ea6\u7b56\u7565\u4e0d\u6ee1\u8db3\uff0c\u5219\u4f1a\u8def\u7531\u5230\u6b63\u5e38\u5b9e\u4f8b\uff0c\u5982\u679c\u6b63\u5e38\u5b9e\u4f8b\u4e0d\u5b58\u5728\uff0c\u5219\u4f1a\u62a5\u5b9e\u4f8b\u627e\u4e0d\u5230\u9519\u8bef<\/p>\n<p>\uff088\uff09\u51b3\u7b56\u5220\u9664Bug\uff1a\u5220\u9664\u51b3\u7b56\uff0c\u4f46\u53d6\u5230\u7684\u51b3\u7b56\u8fd8\u662f\u8001\u7684<\/p>\n<p>\u89e3\u51b3\uff1a\u5c06<code>del_flag=1<\/code>\u7684\u51b3\u7b56\u914d\u7f6e\u5168\u90e8\u5220\u9664\u518d\u91cd\u542f\u5373\u53ef\uff0c\u9700\u8981\u91cd\u542fserver\u7aef\u548cclient\u7aef\uff0c\u914d\u7f6e\u5220\u9664\u8fd9\u5757\u611f\u89c9\u786e\u5b9e\u6709\u4e2aBug<\/p>\n<p>\uff089\uff09\u7070\u5ea6\u8ffd\u8e2a\u53ea\u9700\u914d\u7f6e\u4e0a\u6e38\u94fe\u8def\uff0c\u5f53\u524d\u5e94\u7528\u65e0\u9700\u914d\u7f6e<\/p>\n<p>\uff0810\uff09\u7070\u5ea6\u8ffd\u8e2a\u540c\u4e00\u4e2a\u914d\u7f6e\u52a1\u5fc5\u914d\u5728\u4e00\u8d77\uff0c\u5206\u5f00\u914d\u6709\u95ee\u9898\uff0c\u5982<\/p>\n<ul>\n<li>\u6b63\u786e\uff1a<code>HttpHeader: role,source<\/code><\/li>\n<li>\u9519\u8bef\uff1a<code>HttpHeader: role<\/code> + <code>HttpHeader: source<\/code>\uff0c\u53ea\u6709\u6700\u65b0\u914d\u7f6e\u7684\u6709\u6548<\/li>\n<\/ul>\n<p>\u5e76\u4e14\u5220\u9664\u4efb\u610f\u4e00\u6761\uff0c\u4f1a\u628a\u90a3\u79cd\u7c7b\u578b\u7684\u8ffd\u8e2a\u5168\u5220\u4e86<\/p>\n<p>\uff0811\uff09\u7070\u5ea6\u8ffd\u8e2a\u4e0d\u80fd\u4fee\u6539<code>Name<\/code>\u5b57\u6bb5\uff0c\u53ef\u4ee5\u4fee\u6539<code>infos<\/code>\u4fe1\u606f<\/p>\n<p>\uff0812\uff09IP\u8ffd\u8e2aHttpIP\u7684<code>Infos<\/code>\u65e0\u9700\u914d\u7f6e\uff0c\u7559\u7a7a\u5373\u53ef<\/p>\n<p>\uff0813\uff09\u4f7f\u7528\u7248\u672c\u7070\u5ea6\u7684\u8bdd\uff0c \u53ef\u4ee5\u4e0d\u7528\u7070\u5ea6\u9501\u5b9a<\/p>\n<p>\uff0814\uff09\u6ca1\u7528Docker instanctId\u53ef\u4ee5\u786e\u5b9a\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u5148\u8bbe\u7f6e\u7070\u5ea6\u9501\u5b9a\uff0c\u6253\u5f00\u7070\u5ea6\u5f00\u5173\uff0c\u5c31\u4e0d\u4f1a\u6709\u6b63\u5e38\u6d41\u91cf\u8bbf\u95ee\u3002\u7528\u4e86Docker\u9700\u8981\u6ce8\u610finstanceId\uff0c\u5982\u679cinstanceId\u662f\u968fip\u53d8\u5316\u7684\u8bdd\uff0c\u5c31\u5efa\u8bae\u4f7f\u7528\u7248\u672c\u7070\u5ea6<\/p>\n<p>\uff0815\uff09\u7070\u5ea6\u51b3\u7b56\u548c\u7070\u5ea6\u8ffd\u8e2a\u4e2d\u7684\u81ea\u5b9a\u4e49\u540d\u79f0\uff1a\u662f\u6307\u81ea\u5df1\u6269\u5c55\u7684<code>GrayDecisionFactory<\/code>\u548c<code>GrayInfoTracker<\/code><\/p>\n<p>\uff0816\uff09\u7070\u5ea6\u51b3\u7b56\u4e2d\u7684Attribute\u548cAttributes\u914d\u7f6e\uff1a\u662f\u81ea\u5b9a\u4e49\u7684\u4e00\u4e9b\u4fe1\u606f\uff0c\u5e76\u4e0d\u662f\u4ece\u8bf7\u6c42\u4e2d\u76f4\u63a5\u83b7\u53d6\u7684\u3002\u5728\u4e1a\u52a1\u4ee3\u7801\u4e2d\uff0c\u6216\u8005\u662f<code>Filter<\/code>, <code>Interceptor<\/code>\u7b49\u8fdb\u884c\u5b9a\u4e49\u914d\u7f6e<\/p>\n<p>\uff0817\uff09<code>TrackAttribute<\/code>\uff1a\u6839\u636e\u7070\u5ea6\u8ffd\u8e2a\u8bb0\u5f55\u7684\u5c5e\u6027\u503c\u8fdb\u884c\u5224\u65ad<\/p>\n<p>\uff0818\uff09\u9ed8\u8ba4\u60c5\u51b5\u4e0bPOST\u53c2\u6570\u662f\u4e0d\u662f\u4e0d\u53ef\u4ee5\u8ffd\u8e2a\uff1a\u5982\u679c\u662frequestbody\u4e2d\u7684\u53c2\u6570\uff0c\u5efa\u8bae\u4e0d\u8981\u8ffd\u8e2a\uff0c\u4f46querystring\u4e2d\u7684\u53c2\u6570\u53ef\u4ee5\u8bbe\u8ba1\u8ffd\u8e2a<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4f9d\u6b21\u8fd0\u884c\u5e94\u7528 nohup java -Dfile.encoding=UTF-8 -jar spring-clo [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[448],"tags":[450,449],"class_list":["post-1802","post","type-post","status-publish","format-standard","hentry","category-release","tag-spring-cloud-gray","tag-449"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1802","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=1802"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1802\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=1802"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=1802"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=1802"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}