说明:在微服务开发中,每个服务是通过服务名称来区分的,当两个微服务名称相同时,注册中心会视为这两个服务是相同的。配置对应的负载均衡策略,当其他服务发送请求过来的时,可以对这两个微服务进行规则访问。
搭建环境
创建两个服务,订单服务(端口8081)、用户服务(开启两个,一个端口8082、一个8084),查询订单时,订单服务会发请求给用户服务,查询该订单对应的用户信息。注册中心使用的是eureka(端口8083),服务间通信使用RestTemplate。
(手动注入RestTemplate对象到IOC容器中,需要增加@LoadBalanced注解,不然程序会无法启动)
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class AddBean {
@LoadBalanced
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
(查询订单信息,需要使用RestTemplate向用户服务查询用户信息)
@Autowired
private OrderMapper orderMapper;
@Autowired
private RestTemplate restTemplate;
@Override
public Order getOrder(Long id) {
Order order = orderMapper.getOrder(id);
// 使用restTemplate的getForEntity()方法向用户模块发送请求
ResponseEntity<User> entity = restTemplate.getForEntity("http://USERSERVICE/user?id=" + order.getUserId(), User.class);
// 响应结果是一个response实例,先判断响应状态码是不是成功
if (entity.getStatusCode().is2xxSuccessful()) {
// 取出响应数据使用
User user = entity.getBody();
order.setUser(user);
}
return order;
}
(在用户服务的Controller类中,打印请求的端口号,用来识别是哪个服务在处理请求)
@Autowired
private HttpServletRequest request;
@GetMapping
public String getUser(Long id){
System.out.println("端口号:" + request.getLocalPort());
return JSONUtil.toJsonStr(userService.getUser(id));
}
四个程序全部启动,默认情况,负载均衡策略是轮询,即两个用户服务是被轮流访问的;
方式一:配置文件设置
在订单服务的配置文件中,增加下面这行配置,可配置对应的负载均衡策略,com.netflix.loadbalancer.RandomRule 为随机访问;
# 给userservice配置负载均衡规则(随机访问),配置在欲访问该服务的一端,而不是服务端
userservice.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
另外,还有其他访问策略,可在(DefaultClientConfigImpl)类中查找
方式二:添加IRule
在配置类中,手动添加IRule(负载均衡策略)对象
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RoundRobinRule;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class AddBean {
@LoadBalanced
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
/**
* 设置负载均衡策略(随机访问)
* @return
*/
@Bean
public IRule randomRule() {
return new RandomRule();
}
}
可以在IRule接口中,找到如下实现类,都是对应的负载均衡策略;
把方式一添加的配置注释掉,重启订单服务,可以看到用户服务被随机访问
总结
在Eureka、@LoadBalanced的情况下,相同微服务的负载均衡是轮询,可通过以上两种方式配置服务的负载均衡策略,不同的是,方式一可以针对某一服务设置负载均衡测试,而方式二是全局设置。