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