1. 程式人生 > >springcloud-eureka叢集-自定義負載均衡規則

springcloud-eureka叢集-自定義負載均衡規則

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); } private
Server 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() { return
lb; } }

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埠的規則來執行