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