配置微服务负载均衡的两种方式

说明:在微服务开发中,每个服务是通过服务名称来区分的,当两个微服务名称相同时,注册中心会视为这两个服务是相同的。配置对应的负载均衡策略,当其他服务发送请求过来的时,可以对这两个微服务进行规则访问。

搭建环境

创建两个服务,订单服务(端口8081)、用户服务(开启两个,一个端口8082、一个8084),查询订单时,订单服务会发请求给用户服务,查询该订单对应的用户信息。注册中心使用的是eureka(端口8083),服务间通信使用RestTemplate。

配置微服务负载均衡的两种方式_第1张图片

(手动注入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));
    }

四个程序全部启动,默认情况,负载均衡策略是轮询,即两个用户服务是被轮流访问的;

配置微服务负载均衡的两种方式_第2张图片

方式一:配置文件设置

在订单服务的配置文件中,增加下面这行配置,可配置对应的负载均衡策略,com.netflix.loadbalancer.RandomRule 为随机访问;

# 给userservice配置负载均衡规则(随机访问),配置在欲访问该服务的一端,而不是服务端
userservice.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

配置微服务负载均衡的两种方式_第3张图片

另外,还有其他访问策略,可在(DefaultClientConfigImpl)类中查找

配置微服务负载均衡的两种方式_第4张图片

方式二:添加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接口中,找到如下实现类,都是对应的负载均衡策略;

配置微服务负载均衡的两种方式_第5张图片

把方式一添加的配置注释掉,重启订单服务,可以看到用户服务被随机访问

配置微服务负载均衡的两种方式_第6张图片

总结

在Eureka、@LoadBalanced的情况下,相同微服务的负载均衡是轮询,可通过以上两种方式配置服务的负载均衡策略,不同的是,方式一可以针对某一服务设置负载均衡测试,而方式二是全局设置。

你可能感兴趣的:(微服务,负载均衡,架构)