springcloud-eureka叢集-自定義負載均衡規則
阿新 • • 發佈:2019-01-01
1、首先在服務呼叫者專案中實現IRule介面,用隨機數控制呼叫服務的埠
importjava.util.List; import java.util.Random; import com.netflix.loadbalancer.ILoadBalancer; import com.netflix.loadbalancer.IRule; import com.netflix.loadbalancer.Server; /** * 自定義負載均衡規則 */ public class MyRule implements IRule { private ILoadBalancer lb;public Server choose(Object key) { Random r = new Random(); int randomNum = r.nextInt(10); List<Server> servers = lb.getAllServers(); if(randomNum > 7) { Server s = getServerByPort(servers, 8081); return s; } return getServerByPort(servers, 8082); } privateServer getServerByPort(List<Server> servers, int port) { for(Server s : servers) { if(s.getPort() == port) { return s; } } return null; } public void setLoadBalancer(ILoadBalancer lb) { this.lb = lb; } public ILoadBalancer getLoadBalancer() { returnlb; } }
2、將該介面注入spring容器
@Configuration public class BaseConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate(){ return new RestTemplate(); } @Bean public IRule getRule(){ return new MyRule(); } }
或者在application.yml中加入配置
eureka-service: ribbon: NFLoadBalancerRuleClassName: 包路徑.MyRule
3、編寫controller測試類,eureka-service是服務提供者的spring.application.name
@RestController public class MyRestController { @Autowired private RestTemplate restTemplate; /** * 呼叫服務提供者的介面 * * @param id * @return */ @GetMapping(value = "/getUser/{id}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public String getUser(@PathVariable Integer id) { String templateUrl = "http://eureka-service/getUser/" + id; String result = restTemplate.getForObject(templateUrl, String.class); return result; } }
在服務提供者專案中編寫controller介面,為服務呼叫者提供服務,該介面將服務提供者例項的url返回,用來驗證自定義負載均衡規則。
@GetMapping(value = "/getUser/{id}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public User getUser(@PathVariable Integer id, HttpServletRequest request){ User user = new User(); user.setId(id); user.setUsername("中文"); user.setPassword("123"); user.setPort(request.getRequestURL().toString()); return user; }啟動專案並測試介面,這裡的服務埠的呼叫會按照隨機數大於7呼叫8081埠,否則呼叫8082埠的規則來執行