SpringCloud-整合ribbonjava
1 在customer(服務消費方添加)算法
<!-- Ribbon相關 (ribbon須要和eureka配合使用) --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
2 在yml文件中添加配置文件spring
eureka: client: register-with-eureka: false service-url: defaultZone: http://eureka9001.com:9001/eureka/,http://eureka9002.com:9002/eureka/,http://eureka9003.com:9003/eureka/
3 在RestTemplate 實例化中添加開啓開啓客戶端負載均衡的註解服務器
@Bean @LoadBalanced //開啓負載均衡的工具 public RestTemplate getRestTemlate() { return new RestTemplate(); }
4 在主啓動類中添加開啓eureka客戶端註解app
@SpringBootApplication @EnableEurekaClient public class Customer7001 { public static void main(String[] args) { SpringApplication.run(Customer7001.class, args); } }
5 在配置文件中訪問改成eureka微服務名訪問負載均衡
private static final String REST_URL_PREFIX = "http://SPRINGCLOUD04-PRODECT-8001";
/** * 自指定負載均衡算法 * @author SHF * @version 建立時間:2018年11月29日 下午6:04:28 * @return */ @Bean public IRule myRule() { return new RoundRobinRule();//使用隨機數進行負載均衡 }
自定義ribbon的使用()dom
1 自定義負載均衡規則ide
package com.shi.rule; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.netflix.client.config.IClientConfig; import com.netflix.loadbalancer.AbstractLoadBalancerRule; import com.netflix.loadbalancer.ILoadBalancer; import com.netflix.loadbalancer.Server; /** * 自定義咱們的LB算法規則 * 注意:不能把該類放在@ComponentScan註解包含的全部包及子包下面 * MySelfRule必須不能是spring所掃描的包, * @author SHF * @version 建立時間:2018年11月30日 上午11:32:23 */ public class MyselfRule extends AbstractLoadBalancerRule { private static Logger log = LoggerFactory.getLogger(MyselfRule.class); /* * 需求:讓每一個服務被調用5次以後再切換到下一臺服務器 */ private int total = 0; //總共被調用的次數,目前要求每臺被調用5次 private int currentIndex = 0; //當前提供服務的機器號 public Server choose(ILoadBalancer lb, Object key) { if (lb == null) { return null; } Server server = null; while (server == null) { if (Thread.interrupted()) { return null; } List<Server> upList = lb.getReachableServers(); List<Server> allList = lb.getAllServers();//獲取全部的服務器 int serverCount = allList.size(); if (serverCount == 0) { return null; } //int index = chooseRandomInt(serverCount); if(total < 5) { server = upList.get(currentIndex); total++; }else { total = 0; currentIndex++; if(currentIndex >= upList.size()) { currentIndex = 0; } } if (server == null) { /* * The only time this should happen is if the server list were * somehow trimmed. This is a transient condition. Retry after * yielding. */ Thread.yield(); continue; } if (server.isAlive()) { return (server); } // Shouldn't actually happen.. but must be transient or a bug. server = null; Thread.yield(); } return server; } @Override public Server choose(Object key) { return choose(getLoadBalancer(), key); } @Override public void initWithNiwsConfig(IClientConfig clientConfig) { } }
2 配置rule的對象微服務
/** * 自指定負載均衡算法 * @author SHF * @version 建立時間:2018年11月29日 下午6:04:28 * @return */ @Bean public IRule myselfRule() { //return new RoundRobinRule();//使用隨機數進行負載均衡 return new com.shi.rule.MyselfRule();//使用自定義的負載均衡算法 }
3 在啓動類上面加上註解工具
@RibbonClient(name="SPRINGCLOUD04-PRODECT-8001",configuration=com.shi.rule.MyselfRule.class)