springcloud-eureka集群-自定义负载均衡规则

1、首先在服务调用者项目中实现IRule接口,用随机数控制调用服务的端口

import java.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端口的规则来执行

猜你喜欢

转载自blog.csdn.net/Keith003/article/details/82216569