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();
    }
}
相关推荐
gameatp4 分钟前
从 Windows 到 Linux 服务器的全自动部署教程(免密登录 + 压缩 + 上传 + 启动)
linux·服务器·windows
一匹电信狗5 分钟前
【C++】异常详解(万字解读)
服务器·c++·算法·leetcode·小程序·stl·visual studio
玩转以太网1 小时前
3 种方式玩转网络继电器!W55MH32 实现网页 + 阿里云 + 本地控制互通
网络·物联网·阿里云
reduceanxiety2 小时前
第四章 Linux实用操作
linux·运维·服务器
How_doyou_do3 小时前
关于casdoor重定向问题
网络
小木话安全4 小时前
ISO27001 高阶架构 之 支持 -2
网络·安全·职场和发展·学习方法
獭.獭.4 小时前
Linux -- 文件【下】
linux·服务器·文件系统·软硬链接·inode·ext2
破刺不会编程6 小时前
socket编程UDP
linux·运维·服务器·网络·c++·网络协议·udp
Warren989 小时前
Lua 脚本在 Redis 中的应用
java·前端·网络·vue.js·redis·junit·lua
NEXU512 小时前
Linux:套接字
linux·服务器·网络