{"id":362,"date":"2022-04-16T10:30:02","date_gmt":"2022-04-16T02:30:02","guid":{"rendered":"https:\/\/blog.lijiajia.top\/?p=362"},"modified":"2026-06-19T21:33:14","modified_gmt":"2026-06-19T13:33:14","slug":"springcloud%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%ef%bc%9aribbon%e8%b4%9f%e8%bd%bd%e5%9d%87%e8%a1%a1111","status":"publish","type":"post","link":"https:\/\/blog.ttwow.top\/?p=362","title":{"rendered":"SpringCloud\u5b66\u4e60\u7b14\u8bb0\uff1aRibbon\u8d1f\u8f7d\u5747\u8861(\u4e94)"},"content":{"rendered":"<h2>\u6982\u8ff0<\/h2>\n<h3>\u4ecb\u7ecd\uff1a<\/h3>\n<p>ribbon\uff1a \u7f8e[\u02c8r\u026ab\u0259n]\u82f1['r\u026ab\u0259n]<\/p>\n<p>Spring Cloud Ribbon\u662f\u57fa\u4e8eNetflix Ribbon\u5b9e\u73b0\u7684\u4e00\u5957<strong>\u5ba2\u6237\u7aef<\/strong>       <strong>\u8d1f\u8f7d\u5747\u8861<\/strong>\u7684\u5de5\u5177\u3002<\/p>\n<p>\u7b80\u5355\u7684\u8bf4\uff0cRibbon\u662fNetflix\u53d1\u5e03\u7684\u5f00\u6e90\u9879\u76ee\uff0c\u4e3b\u8981\u529f\u80fd\u662f\u63d0\u4f9b\u5ba2\u6237\u7aef\u7684\u8f6f\u4ef6\u8d1f\u8f7d\u5747\u8861\u7b97\u6cd5\uff0c\u5c06Netflix\u7684\u4e2d\u95f4\u5c42\u670d\u52a1\u8fde\u63a5\u5728\u4e00\u8d77\u3002Ribbon\u5ba2\u6237\u7aef\u7ec4\u4ef6\u63d0\u4f9b\u4e00\u7cfb\u5217\u5b8c\u5584\u7684\u914d\u7f6e\u9879\u5982\u8fde\u63a5\u8d85\u65f6\uff0c\u91cd\u8bd5\u7b49\u3002\u7b80\u5355\u7684\u8bf4\uff0c\u5c31\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u4e2d\u5217\u51faLoad Balancer\uff08\u7b80\u79f0LB\uff09\u540e\u9762\u6240\u6709\u7684\u673a\u5668\uff0cRibbon\u4f1a\u81ea\u52a8\u7684\u5e2e\u52a9\u4f60\u57fa\u4e8e\u67d0\u79cd\u89c4\u5219\uff08\u5982\u7b80\u5355\u8f6e\u8be2\uff0c\u968f\u673a\u8fde\u63a5\u7b49\uff09\u53bb\u8fde\u63a5\u8fd9\u4e9b\u673a\u5668\u3002\u6211\u4eec\u4e5f\u5f88\u5bb9\u6613\u4f7f\u7528Ribbon\u5b9e\u73b0\u81ea\u5b9a\u4e49\u7684\u8d1f\u8f7d\u5747\u8861\u7b97\u6cd5\u3002<\/p>\n<h3>\u529f\u80fd\uff1a<\/h3>\n<p>LB\uff08\u8d1f\u8f7d\u5747\u8861\uff09<\/p>\n<p>LB\uff0c\u5373\u8d1f\u8f7d\u5747\u8861(Load Balance)\uff0c\u5728\u5fae\u670d\u52a1\u6216\u5206\u5e03\u5f0f\u96c6\u7fa4\u4e2d\u7ecf\u5e38\u7528\u7684\u4e00\u79cd\u5e94\u7528\u3002<br \/>\n\u8d1f\u8f7d\u5747\u8861\u7b80\u5355\u7684\u8bf4\u5c31\u662f\u5c06\u7528\u6237\u7684\u8bf7\u6c42\u5e73\u644a\u7684\u5206\u914d\u5230\u591a\u4e2a\u670d\u52a1\u4e0a\uff0c\u4ece\u800c\u8fbe\u5230\u7cfb\u7edf\u7684HA\u3002<br \/>\n\u5e38\u89c1\u7684\u8d1f\u8f7d\u5747\u8861\u6709\u8f6f\u4ef6Nginx\uff0cLVS\uff0c\u786c\u4ef6 F5\u7b49\u3002<br \/>\n\u76f8\u5e94\u7684\u5728\u4e2d\u95f4\u4ef6\uff0c\u4f8b\u5982\uff1adubbo\u548cSpringCloud\u4e2d\u5747\u7ed9\u6211\u4eec\u63d0\u4f9b\u4e86\u8d1f\u8f7d\u5747\u8861\uff0cSpringCloud\u7684\u8d1f\u8f7d\u5747\u8861\u7b97\u6cd5\u53ef\u4ee5\u81ea\u5b9a\u4e49\u3002 <\/p>\n<h3>\u5b98\u7f51\u8d44\u6599\uff1a<\/h3>\n<p><a href=\"https:\/\/github.com\/Netflix\/ribbon\/wiki\/Getting-Started\">https:\/\/github.com\/Netflix\/ribbon\/wiki\/Getting-Started<\/a><\/p>\n<h2>Ribbon\u914d\u7f6e\u521d\u6b65<\/h2>\n<p>1.\u4fee\u6539microservicecloud-consumer-dept-80\u5de5\u7a0b<\/p>\n<p>2.\u4fee\u6539pom.xml\u6587\u4ef6<\/p>\n<pre><code class=\"language-xml\"> &lt;!-- Ribbon\u76f8\u5173 --&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.cloud&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-cloud-starter-eureka&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.cloud&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-cloud-starter-ribbon&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.cloud&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-cloud-starter-config&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;<\/code><\/pre>\n<p>3.\u4fee\u6539application.yml   \u8ffd\u52a0eureka\u7684\u670d\u52a1\u6ce8\u518c\u5730\u5740<\/p>\n<pre><code class=\"language-yaml\">server:\n  port: 80\n\neureka:\n  client:\n    register-with-eureka: false\n    service-url:\n      defaultZone: http:\/\/eureka7001.com:7001\/eureka\/,http:\/\/eureka7002.com:7002\/eureka\/,http:\/\/eureka7003.com:7003\/eureka\/<\/code><\/pre>\n<p>4.\u5bf9ConfigBean\u8fdb\u884c\u65b0\u6ce8\u89e3@LoadBalanced    \u83b7\u5f97Rest\u65f6\u52a0\u5165Ribbon\u7684\u914d\u7f6e<\/p>\n<pre><code class=\"language-java\">@Configuration\npublic class ConfigBean {\n\n    @Bean\n    @LoadBalanced\n    public RestTemplate getRestTemplate(){\n        return new RestTemplate();\n    }\n}<\/code><\/pre>\n<p>5.\u4e3b\u542f\u52a8\u7c7bDeptConsumer80_App\u6dfb\u52a0@EnableEurekaClient<\/p>\n<pre><code class=\"language-java\">@SpringBootApplication\n@EnableEurekaClient\npublic class ConsumerDeptApplication_80 {\n\n    public static void main(String[] args) {\n\n        SpringApplication.run(ConsumerDeptApplication_80.class,args);\n    }\n}<\/code><\/pre>\n<p>6.\u4fee\u6539DeptController_Consumer\u5ba2\u6237\u7aef\u8bbf\u95ee\u7c7b<\/p>\n<pre><code class=\"language-java\">private static final String REST_URL_PREFIX = &quot;http:\/\/MICROSERVICECLOUD-DEPT&quot;;<\/code><\/pre>\n<p>7.\u5148\u542f\u52a83\u4e2aeureka\u96c6\u7fa4\u540e\uff0c\u518d\u542f\u52a8microservicecloud-provider-dept-8001\u5e76\u6ce8\u518c\u8fdbeureka<\/p>\n<p>8.\u542f\u52a8microservicecloud-consumer-dept-80<\/p>\n<p>9.\u6d4b\u8bd5<\/p>\n<p><a href=\"http:\/\/localhost\/consumer\/dept\/get\/1\">http:\/\/localhost\/consumer\/dept\/get\/1<\/a><\/p>\n<p><a href=\"http:\/\/localhost\/consumer\/dept\/list\">http:\/\/localhost\/consumer\/dept\/list<\/a><\/p>\n<p><a href=\"http:\/\/localhost\/consumer\/dept\/add?dname=\u5927\u6570\u636e\u90e8\">http:\/\/localhost\/consumer\/dept\/add?dname=\u5927\u6570\u636e\u90e8<\/a><\/p>\n<p>10.\u5c0f\u603b\u7ed3<\/p>\n<p>Ribbon\u548cEureka\u6574\u5408\u540eConsumer\u53ef\u4ee5\u76f4\u63a5\u8c03\u7528\u670d\u52a1\u800c\u4e0d\u7528\u518d\u5173\u5fc3\u5730\u5740\u548c\u7aef\u53e3\u53f7<\/p>\n<h2>Ribbon\u8d1f\u8f7d\u5747\u8861<\/h2>\n<p>1.\u67b6\u6784\u8bf4\u660e<br \/>\n<div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/04\/image-1650422320981.png'><img class=\"lazyload lazyload-style-11\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/04\/image-1650422320981.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<p>Ribbon\u5728\u5de5\u4f5c\u65f6\u5206\u6210\u4e24\u6b65<br \/>\n\u7b2c\u4e00\u6b65\u5148\u9009\u62e9 EurekaServer ,\u5b83\u4f18\u5148\u9009\u62e9\u5728\u540c\u4e00\u4e2a\u533a\u57df\u5185\u8d1f\u8f7d\u8f83\u5c11\u7684server.<br \/>\n\u7b2c\u4e8c\u6b65\u518d\u6839\u636e\u7528\u6237\u6307\u5b9a\u7684\u7b56\u7565\uff0c\u5728\u4eceserver\u53d6\u5230\u7684\u670d\u52a1\u6ce8\u518c\u5217\u8868\u4e2d\u9009\u62e9\u4e00\u4e2a\u5730\u5740\u3002<br \/>\n\u5176\u4e2dRibbon\u63d0\u4f9b\u4e86\u591a\u79cd\u7b56\u7565\uff1a\u6bd4\u5982\u8f6e\u8be2\u3001\u968f\u673a\u548c\u6839\u636e\u54cd\u5e94\u65f6\u95f4\u52a0\u6743\u3002<\/p>\n<p>2.\u53c2\u8003microservicecloud-provider-dept-8001\uff0c\u65b0\u5efa\u4e24\u4efd\uff0c\u5206\u522b\u547d\u540d\u4e3a8002\uff0c8003<\/p>\n<p>3.\u65b0\u5efa8002\/8003\u6570\u636e\u5e93\uff0c\u5404\u81ea\u5fae\u670d\u52a1\u5206\u522b\u8fde\u5404\u81ea\u7684\u6570\u636e\u5e93<\/p>\n<pre><code class=\"language-sql\">\nDROP DATABASE IF EXISTS cloudDB02;\n\nCREATE DATABASE cloudDB02 CHARACTER SET UTF8;\n\nUSE cloudDB02;\n\nCREATE TABLE dept\n(\n  deptno BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,\n  dname VARCHAR(60),\n  db_source   VARCHAR(60)\n);\n\nINSERT INTO dept(dname,db_source) VALUES(&#039;\u5f00\u53d1\u90e8&#039;,DATABASE());\nINSERT INTO dept(dname,db_source) VALUES(&#039;\u4eba\u4e8b\u90e8&#039;,DATABASE());\nINSERT INTO dept(dname,db_source) VALUES(&#039;\u8d22\u52a1\u90e8&#039;,DATABASE());\nINSERT INTO dept(dname,db_source) VALUES(&#039;\u5e02\u573a\u90e8&#039;,DATABASE());\nINSERT INTO dept(dname,db_source) VALUES(&#039;\u8fd0\u7ef4\u90e8&#039;,DATABASE());\n\nSELECT * FROM dept;\n<\/code><\/pre>\n<pre><code class=\"language-sql\">DROP DATABASE IF EXISTS cloudDB03;\n\nCREATE DATABASE cloudDB03 CHARACTER SET UTF8;\n\nUSE cloudDB03;\n\nCREATE TABLE dept\n(\n  deptno BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,\n  dname VARCHAR(60),\n  db_source   VARCHAR(60)\n);\n\nINSERT INTO dept(dname,db_source) VALUES(&#039;\u5f00\u53d1\u90e8&#039;,DATABASE());\nINSERT INTO dept(dname,db_source) VALUES(&#039;\u4eba\u4e8b\u90e8&#039;,DATABASE());\nINSERT INTO dept(dname,db_source) VALUES(&#039;\u8d22\u52a1\u90e8&#039;,DATABASE());\nINSERT INTO dept(dname,db_source) VALUES(&#039;\u5e02\u573a\u90e8&#039;,DATABASE());\nINSERT INTO dept(dname,db_source) VALUES(&#039;\u8fd0\u7ef4\u90e8&#039;,DATABASE());\n\nSELECT * FROM dept;<\/code><\/pre>\n<p>4.\u4fee\u65398002\/8003\u5404\u81eaYML<\/p>\n<p>\u7aef\u53e3<\/p>\n<p>\u6570\u636e\u5e93\u94fe\u63a5<\/p>\n<p>\u5bf9\u5916\u66b4\u9732\u7684\u7edf\u4e00\u7684\u670d\u52a1\u5b9e\u4f8b\u540d<\/p>\n<pre><code class=\"language-yaml\">spring:\n   application:\n    name: microservicecloud-dept <\/code><\/pre>\n<p>5.\u542f\u52a83\u4e2aeureka\u96c6\u7fa4\u914d\u7f6e\u533a<\/p>\n<p>6.\u542f\u52a83\u4e2aDept\u5fae\u670d\u52a1\u5e76\u5404\u81ea\u6d4b\u8bd5\u901a\u8fc7<\/p>\n<p><a href=\"http:\/\/localhost:8001\/dept\/list\">http:\/\/localhost:8001\/dept\/list<\/a><\/p>\n<p><a href=\"http:\/\/localhost:8002\/dept\/list\">http:\/\/localhost:8002\/dept\/list<\/a><\/p>\n<p><a href=\"http:\/\/localhost:8003\/dept\/list\">http:\/\/localhost:8003\/dept\/list<\/a><\/p>\n<p>7.\u542f\u52a8microservicecloud-consumer-dept-80<\/p>\n<p>8.\u5ba2\u6237\u7aef\u901a\u8fc7Ribbo\u5b8c\u6210\u8d1f\u8f7d\u5747\u8861\u5e76\u8bbf\u95ee\u4e0a\u4e00\u6b65\u7684Dept\u5fae\u670d\u52a1<\/p>\n<p><a href=\"http:\/\/localhost\/consumer\/dept\/list\">http:\/\/localhost\/consumer\/dept\/list<\/a><\/p>\n<p>\u6ce8\u610f\u89c2\u5bdf\u770b\u5230\u8fd4\u56de\u7684\u6570\u636e\u5e93\u540d\u5b57\uff0c\u5404\u4e0d\u76f8\u540c\uff0c\u8d1f\u8f7d\u5747\u8861\u5b9e\u73b0<\/p>\n<p>9.\u603b\u7ed3\uff1a<\/p>\n<p>Ribbon\u5176\u5b9e\u5c31\u662f\u4e00\u4e2a\u8f6f\u8d1f\u8f7d\u5747\u8861\u7684\u5ba2\u6237\u7aef\u7ec4\u4ef6\uff0c<br \/>\n\u4ed6\u53ef\u4ee5\u548c\u5176\u4ed6\u6240\u9700\u8bf7\u6c42\u7684\u5ba2\u6237\u7aef\u7ed3\u5408\u4f7f\u7528\uff0c\u548ceureka\u7ed3\u5408\u53ea\u662f\u5176\u4e2d\u7684\u4e00\u4e2a\u5b9e\u4f8b\u3002<\/p>\n<h2>Ribbon\u6838\u5fc3\u7ec4\u4ef6IRule<\/h2>\n<p>IRule\uff1a\u6839\u636e\u7279\u5b9a\u7b97\u6cd5\u4e2d\u4ece\u670d\u52a1\u5217\u8868\u4e2d\u9009\u53d6\u4e00\u4e2a\u8981\u8bbf\u95ee\u7684\u670d\u52a1<\/p>\n<p>RoundRobinRule: \u8f6e\u8be2<\/p>\n<p>RandomRule: \u968f\u673a<\/p>\n<p>AvailabilityFilteringRule:  <\/p>\n<p>\u4f1a\u5148\u8fc7\u6ee4\u6389\u7531\u4e8e\u591a\u6b21\u8bbf\u95ee\u6545\u969c\u800c\u5904\u4e8e\u65ad\u8def\u5668\u8df3\u95f8\u72b6\u6001\u7684\u670d\u52a1\uff0c<br \/>\n\u8fd8\u6709\u5e76\u53d1\u7684\u8fde\u63a5\u6570\u91cf\u8d85\u8fc7\u9608\u503c\u7684\u670d\u52a1\uff0c\u7136\u540e\u5bf9\u5269\u4f59\u7684\u670d\u52a1\u5217\u8868\u6309\u7167\u8f6e\u8be2\u7b56\u7565\u8fdb\u884c\u8bbf\u95ee<\/p>\n<p>WeightedResponseTimeRule:<\/p>\n<p>\u6839\u636e\u5e73\u5747\u54cd\u5e94\u65f6\u95f4\u8ba1\u7b97\u6240\u6709\u670d\u52a1\u7684\u6743\u91cd\uff0c\u54cd\u5e94\u65f6\u95f4\u8d8a\u5feb\u670d\u52a1\u6743\u91cd\u8d8a\u5927\u88ab\u9009\u4e2d\u7684\u6982\u7387\u8d8a\u9ad8\u3002<br \/>\n\u521a\u542f\u52a8\u65f6\u5982\u679c\u7edf\u8ba1\u4fe1\u606f\u4e0d\u8db3\uff0c\u5219\u4f7f\u7528RoundRobinRule\u7b56\u7565\uff0c\u7b49\u7edf\u8ba1\u4fe1\u606f\u8db3\u591f\uff0c<br \/>\n\u4f1a\u5207\u6362\u5230WeightedResponseTimeRule<\/p>\n<p>RetryRule:<\/p>\n<p>\u5148\u6309\u7167RoundRobinRule\u7684\u7b56\u7565\u83b7\u53d6\u670d\u52a1\uff0c\u5982\u679c\u83b7\u53d6\u670d\u52a1\u5931\u8d25\u5219\u5728\u6307\u5b9a\u65f6\u95f4\u5185\u4f1a\u8fdb\u884c\u91cd\u8bd5\uff0c\u83b7\u53d6\u53ef\u7528\u7684\u670d\u52a1<\/p>\n<p>BestAvailableRule:<\/p>\n<p>\u4f1a\u5148\u8fc7\u6ee4\u6389\u7531\u4e8e\u591a\u6b21\u8bbf\u95ee\u6545\u969c\u800c\u5904\u4e8e\u65ad\u8def\u5668\u8df3\u95f8\u72b6\u6001\u7684\u670d\u52a1\uff0c\u7136\u540e\u9009\u62e9\u4e00\u4e2a\u5e76\u53d1\u91cf\u6700\u5c0f\u7684\u670d\u52a1<\/p>\n<p>ZoneAvoidanceRule:<\/p>\n<p>\u9ed8\u8ba4\u89c4\u5219,\u590d\u5408\u5224\u65adserver\u6240\u5728\u533a\u57df\u7684\u6027\u80fd\u548cserver\u7684\u53ef\u7528\u6027\u9009\u62e9\u670d\u52a1\u5668<\/p>\n<pre><code class=\"language-java\">@Bean\npublic IRule myRule(){\n    return new RandomRule();    \/\/\u968f\u673a\n}<\/code><\/pre>\n<h2>Ribbon\u81ea\u5b9a\u4e49<\/h2>\n<p>1)\u4fee\u6539microservicecloud-consumer-dept-80<\/p>\n<p>2)\u4e3b\u542f\u52a8\u7c7b\u6dfb\u52a0@RibbonClient<\/p>\n<p>\u5728\u542f\u52a8\u8be5\u5fae\u670d\u52a1\u7684\u65f6\u5019\u5c31\u80fd\u53bb\u52a0\u8f7d\u6211\u4eec\u7684\u81ea\u5b9a\u4e49Ribbon\u914d\u7f6e\u7c7b\uff0c\u4ece\u800c\u4f7f\u914d\u7f6e\u751f\u6548\uff0c\u5f62\u5982\uff1a<\/p>\n<pre><code class=\"language-java\">@RibbonClient(name=&quot;MICROSERVICECLOUD-DEPT&quot;,configuration= MySelfRule.class)<\/code><\/pre>\n<p>3)\u6ce8\u610f\u914d\u7f6e\u7ec6\u8282<\/p>\n<p>\u5b98\u65b9\u6587\u6863\u660e\u786e\u7ed9\u51fa\u4e86\u8b66\u544a\uff1a<br \/>\n\u8fd9\u4e2a\u81ea\u5b9a\u4e49\u914d\u7f6e\u7c7b\u4e0d\u80fd\u653e\u5728@ComponentScan\u6240\u626b\u63cf\u7684\u5f53\u524d\u5305\u4e0b\u4ee5\u53ca\u5b50\u5305\u4e0b\uff0c<br \/>\n\u5426\u5219\u6211\u4eec\u81ea\u5b9a\u4e49\u7684\u8fd9\u4e2a\u914d\u7f6e\u7c7b\u5c31\u4f1a\u88ab\u6240\u6709\u7684Ribbon\u5ba2\u6237\u7aef\u6240\u5171\u4eab\uff0c\u4e5f\u5c31\u662f\u8bf4<br \/>\n\u6211\u4eec\u8fbe\u4e0d\u5230\u7279\u6b8a\u5316\u5b9a\u5236\u7684\u76ee\u7684\u4e86\u3002<\/p>\n<p>4)\u6b65\u9aa4<\/p>\n<p>\u65b0\u5efapackage com.rule<\/p>\n<pre><code class=\"language-java\">package com.rule;\n\nimport com.netflix.loadbalancer.IRule;\nimport com.netflix.loadbalancer.RandomRule;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\npublic class MySelfRule\n{\n    @Bean\n    public IRule myRule()\n    {\n        return new RandomRule();\/\/Ribbon\u9ed8\u8ba4\u662f\u8f6e\u8be2\uff0c\u6211\u81ea\u5b9a\u4e49\u4e3a\u968f\u673a\n    }\n}<\/code><\/pre>\n<p>\u4fee\u6539\u4e3b\u542f\u52a8\u7c7b<\/p>\n<pre><code class=\"language-java\">@SpringBootApplication\n@EnableEurekaClient\n@RibbonClient(name=&quot;MICROSERVICECLOUD-DEPT&quot;,configuration= MySelfRule.class)\npublic class ConsumerDeptApplication_80 {\n\n    public static void main(String[] args) {\n\n        SpringApplication.run(ConsumerDeptApplication_80.class,args);\n    }\n}<\/code><\/pre>\n<p>\u6d4b\u8bd5<\/p>\n<p><a href=\"http:\/\/localhost\/consumer\/dept\/list\">http:\/\/localhost\/consumer\/dept\/list<\/a><\/p>\n<p>5)\u81ea\u5b9a\u4e49\u89c4\u5219\u6df1\u5ea6\u89e3\u6790<\/p>\n<p>\u95ee\u9898\uff1a\u4f9d\u65e7\u8f6e\u8be2\u7b56\u7565\uff0c\u4f46\u662f\u52a0\u4e0a\u65b0\u9700\u6c42\uff0c\u6bcf\u4e2a\u670d\u52a1\u5668\u8981\u6c42\u88ab\u8c03\u75285\u6b21\u3002\u4e5f\u5373<br \/>\n\u4ee5\u524d\u662f\u6bcf\u53f0\u673a\u5668\u4e00\u6b21\uff0c\u73b0\u5728\u662f\u6bcf\u53f0\u673a\u56685\u6b21<\/p>\n<p>\u89e3\u6790\u6e90\u7801\uff1a<a href=\"https:\/\/github.com\/Netflix\/ribbon\/blob\/master\/ribbon-loadbalancer\/src\/main\/java\/com\/netflix\/loadbalancer\/RandomRule.java\">https:\/\/github.com\/Netflix\/ribbon\/blob\/master\/ribbon-loadbalancer\/src\/main\/java\/com\/netflix\/loadbalancer\/RandomRule.java<\/a><\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/04\/image-1650422478521.png'><img class=\"lazyload lazyload-style-11\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/04\/image-1650422478521.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<p>\u53c2\u8003\u6e90\u7801\u4fee\u6539\u4e3a\u6211\u4eec\u9700\u6c42\u8981\u6c42\u7684RandomRule_Diy.java<\/p>\n<pre><code class=\"language-java\">public class RandomRule_Diy extends AbstractLoadBalancerRule {\n\n    private int total = 0;    \/\/\u603b\u5171\u88ab\u8c03\u7528\u7684\u6b21\u6570\uff0c\u76ee\u524d\u8981\u6c42\u6bcf\u53f0\u88ab\u8c03\u75285\u6b21\n    private int currentIndex = 0;\/\/\u5f53\u524d\u63d0\u4f9b\u670d\u52a1\u7684\u673a\u5668\u53f7\n\n    public Server choose(ILoadBalancer lb, Object key) {\n        if (lb == null) {\n            return null;\n        }\n        Server server = null;\n\n        while (server == null) {\n            if (Thread.interrupted()) {\n                return null;\n            }\n            List&lt;Server&gt; upList = lb.getReachableServers();\n            List&lt;Server&gt; allList = lb.getAllServers();\n\n            int serverCount = allList.size();\n            if (serverCount == 0) {\n                \/*\n                 * No servers. End regardless of pass, because subsequent passes\n                 * only get more restrictive.\n                 *\/\n                return null;\n            }\n\n\/\/            int index = rand.nextInt(serverCount);\n\/\/            server = upList.get(index);\n            if(total &lt; 5)\n            {\n                server = upList.get(currentIndex);\n                total++;\n            }else {\n                total = 0;\n                currentIndex++;\n                if(currentIndex &gt;= upList.size())\n                {\n                    currentIndex = 0;\n                }\n\n            }\n\n            if (server == null) {\n                \/*\n                 * The only time this should happen is if the server list were\n                 * somehow trimmed. This is a transient condition. Retry after\n                 * yielding.\n                 *\/\n                Thread.yield();\n                continue;\n            }\n\n            if (server.isAlive()) {\n                return (server);\n            }\n\n            \/\/ Shouldn&#039;t actually happen.. but must be transient or a bug.\n            server = null;\n            Thread.yield();\n        }\n\n        return server;\n\n    }\n\n    @Override\n    public Server choose(Object key) {\n        return choose(getLoadBalancer(), key);\n    }\n\n    @Override\n    public void initWithNiwsConfig(IClientConfig clientConfig) {\n\n    }\n}<\/code><\/pre>\n<p>\u8c03\u7528<\/p>\n<p>MySelfRule.java<\/p>\n<pre><code class=\"language-java\">    @Bean\n    public IRule myRule()\n    {\n        \/\/return new RandomRule();\/\/Ribbon\u9ed8\u8ba4\u662f\u8f6e\u8be2\uff0c\u6211\u81ea\u5b9a\u4e49\u4e3a\u968f\u673a\n        return new RandomRule_Diy();\n    }<\/code><\/pre>\n<p>\u4e3b\u542f\u52a8\u7c7b<\/p>\n<pre><code class=\"language-java\">@RibbonClient(name=&quot;MICROSERVICECLOUD-DEPT&quot;,configuration= MySelfRule.class)<\/code><\/pre>\n<p>\u6d4b\u8bd5<\/p>\n<p><a href=\"http:\/\/localhost\/consumer\/dept\/list\">http:\/\/localhost\/consumer\/dept\/list<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6982\u8ff0 \u4ecb\u7ecd\uff1a ribbon\uff1a \u7f8e[\u02c8r\u026ab\u0259n]\u82f1[&#8216;r\u026ab\u0259n] Spring Cloud Ribbon\u662f\u57fa [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[126],"tags":[70],"class_list":["post-362","post","type-post","status-publish","format-standard","hentry","category-java-microservices","tag-springcloud"],"_links":{"self":[{"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=\/wp\/v2\/posts\/362","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=362"}],"version-history":[{"count":1,"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=\/wp\/v2\/posts\/362\/revisions"}],"predecessor-version":[{"id":2114,"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=\/wp\/v2\/posts\/362\/revisions\/2114"}],"wp:attachment":[{"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=362"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=362"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=362"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}