SpringCloud——负载均衡

一.负载均衡

1.问题提出

上一篇文章写了服务注册和服务发现的相关内容。这里再提出一个新问题,如果我给一个服务开了多个端口,这几个端口都可以访问服务。

例如,在上一篇文章的基础上,我又新开了9091和9092端口,现在重新启动服务,查看访问的端口号:

通过运行发现,无论我怎么刷新,访问的永远是一个端口:

2.LoadBalance

负载均衡是高并发高可用系统中的必不可少的关键组件。我们上面的问题就可以使用负载均衡来解决。负载均衡可以按照一定规则分配资源。

负载均衡分为服务端负载均衡客户端负载均衡

1)服务端负载均衡

在服务端采用负载均衡算法分配资源,常用的有Nginx。

2)客户端负载均衡

在客户端采用负载均衡算法分配资源,客户端从注册中心获取服务列表,在发送请求前通过负载均衡算法选择⼀个服务器,然后进行访问。

二.SpringCloudLoadBalancer

SpringCloud从2020.0.1版本开始移除了Ribbon组件,使用SpringCloudLoadBalancer组件来代替Ribbon实现客户端负载均衡

1.添加注解

给 RestTemplate 添加注解**@LoadBalanced**:

java 复制代码
@Configuration
public class BeanConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

2.修改远程调用代码

将IP和端口号改成应用名:

java 复制代码
@Resource
RestTemplate restTemplate;

@RequestMapping("/{orderId}")
public OrderInfo getOrderById(@PathVariable("orderId") Integer orderId) {
    OrderInfo orderInfo = orderMapper.selectByOrderId(orderId);
    //String url = "http://127.0.0.1:9090/product/"+ orderInfo.getProductId();
    String url = "http://product-service/product/"+ orderInfo.getProductId();
    ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
    orderInfo.setProductInfo(productInfo);
    return orderInfo;
}

然后启动验证即可。

3.负载均衡策略

SpringCloudLoadBalancer仅支持两种负载均衡策略:

1)轮询:服务器轮流处理用户请求;

2)随机选择:随机选择一个服务器处理请求。

SpringCloudLoadBalancer默认的负载均衡策略是轮询,当然我们也可以将其改成随机选择,具体方法在SpringCloud官网也有介绍。

java 复制代码
public class LoadBalancerConfig {
    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
                                                            LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new RandomLoadBalancer(loadBalancerClientFactory
                .getLazyProvider(name, ServiceInstanceListSupplier.class),
                name);
    }
}

接着在RestTemplate配置类上,使用@LoadBalancerClient或@LoadBalancerClients注解,两个注解的区别在于有没有多个服务提供者。

这两个注解有两个注解属性:

1)name:负载均衡对哪个服务生效;

2)configuration:使用哪个负载均衡策略。

java 复制代码
@LoadBalancerClient(name = "product-service",configuration = LoadBalancerConfig.class)
@Configuration
public class BeanConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
相关推荐
好好学操作系统2 分钟前
autodl 保存 数据 跨区
linux·运维·服务器
KingRumn5 分钟前
Linux同步机制之信号量
linux·服务器·网络
嵌入式学习菌5 分钟前
SPIFFS文件系统
服务器·物联网
旺仔Sec5 分钟前
2026年度河北省职业院校技能竞赛“Web技术”(高职组)赛项竞赛任务
运维·服务器·前端
BullSmall26 分钟前
linux 根据端口查看进程
linux·运维·服务器
herinspace30 分钟前
管家婆软件年结存后快马商城操作注意事项
服务器·数据库·windows
嘻哈baby35 分钟前
DDNS动态域名解析方案对比与实战配置
网络
Hard but lovely1 小时前
linux:----进程守护化(Daemon)&&会话的原理
linux·运维·服务器
捷米研发三部1 小时前
Profinet转ModbusTCP网关:实现西门子1200PLC与打标卡稳定通讯
网络
芝麻馅汤圆儿1 小时前
sockperf 工具
linux·服务器·数据库