SpringCloud之LoadBalancer负载均衡器的简单使用

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: RoundRobin: 轮询策略,意思循环往复的的服务进行选取。

loadbalancer用于对提供服务的集群做一个节点的选取规则。


如图所示,load balancer集成在调用方



示例


  1. 创建loadbalance-base模块,并引入相关依赖


<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
</dependencies>

版本信息

<properties>  
    <spring-boot.version>2.4.2</spring-boot.version>
        <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
        <nacos.version>2021.1</nacos.version>
        <spring-cloud.version>2020.0.1</spring-cloud.version>
        <spring-cloud-bootstrap.version>3.0.3</spring-cloud-bootstrap.version>
        <spring-cloud-loadbalancer.version>3.0.1</spring-cloud-loadbalancer.version>
</properties>
  1. 创建服务提供者模块loadbalancer-provider-service


  • 主类
@EnableDiscoveryClient
@SpringBootApplication
public class LoadBalanceProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(LoadBalanceProviderApplication.class, args);
    }
}
  • 配置
spring:
  application:
    name: loadbalance-provider-service
  cloud:
    nacos:
      config:
        group: loadbalance-group
        namespace: loadbalance
        server-addr: 192.168.56.102:8848
        file-extension: yml
        prefix: ${spring.application.name}
      discovery:
        group: loadbalance-group
        namespace: loadbalance
        server-addr: 192.168.56.102:8848
        weight: 5

server:
  port: 8082
  • 服务类
@RestController
public class TestController {
    @Value("${server.port}")
    private int port;

    @GetMapping("/service")
    public String test(){
        return "provicer servvice: [from port]:" + port;
    }
}
  • 启动nacos,创建响应的命名空间,并开启多实例服务,分别开启8081,和8082的两个loadbalance-provider-service服务实例


  1. 创建loadbalancer-consumer-service


  • 主类
@SpringBootApplication
@EnableDiscoveryClient
public class LoadBalanceConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(LoadBalanceConsumerApplication.class, args);
    }
}
  • restTemplate配置类,此处必须在restTemplate上加上@LoadBalanced注解
@Configuration
public class LoadConfiguration {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
  • 服务类,restTemplate调用host:port改为服务提供者的名称
@RestController
public class TestController {
    @Resource
    private RestTemplate restTemplate;

    @GetMapping("/service")
    public String test(){
      
        return restTemplate.getForObject("http://loadbalance-provider-service/service", String.class);
    }
}
  • 配置
spring:
  application:
    name: loadbalance-consumer-service
  cloud:
    nacos:
      config:
        group: loadbalance-group
        namespace: loadbalance
        server-addr: 192.168.56.102:8848
        file-extension: yml
        prefix: ${spring.application.name}
      discovery:
        group: loadbalance-group
        namespace: loadbalance
        server-addr: 192.168.56.102:8848
        weight: 1

server:
  port: 9091
  • 启动loadbalacer-consumer-service服务


访问localhost:9091/service,并多次刷新,可以看到8081,和8082两个服务交替

provicer servvice: [from port]:8081
provicer servvice: [from port]:8082
provicer servvice: [from port]:8081
provicer servvice: [from port]:8082
provicer servvice: [from port]:8081
provicer servvice: [from port]:8082
....

Load Balancer提供的策略


RoundRobin: 轮询策略,意思循环往复的的服务进行选取。

Random: 随机策略,随机对服务选取一个节点

Load Balancer的默认负载策略

RoundRobin: 轮询策略,意思循环往复的的服务进行选取。


替换默认的负载策略,使用随机策略模式

新建RandomLoadBalanceConfiguration配置类,将随机策略配置进去



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

按照官方说法配置类The classes you pass as @LoadBalancerClient or @LoadBalancerClients configuration arguments should either not be annotated with @Configuration or be outside component scan scope.


配置类不能加@Configuation注解或者要放在不被Spring容器扫描到的地方,意思要放在和主类平级的包下,不能放在主类的包或者子包。


在主类或者某个能被扫描到的配置类上加上@LoadBalancerClients


1.配置全局策略



@LoadBalancerClients(defaultConfiguration = WeightLoadBalanceConfiguration.class)
  1. 针对服务配置策略
@LoadBalancerClients({
        @LoadBalancerClient(name = "loadbalance-provider-service", configuration = RandomLoadBalanceConfiguration.class)
})

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
5月前
|
负载均衡 算法 Java
Spring Cloud全解析:负载均衡算法
本文介绍了负载均衡的两种方式:集中式负载均衡和进程内负载均衡,以及常见的负载均衡算法,包括轮询、随机、源地址哈希、加权轮询、加权随机和最小连接数等方法,帮助读者更好地理解和应用负载均衡技术。
138 2
|
3月前
|
缓存 负载均衡 算法
slb支持多种负载均衡算法
slb支持多种负载均衡算法
111 6
|
28天前
|
存储 弹性计算 负载均衡
活动实践 | ALB 实现跨地域负载均衡
本方案通过阿里云的云企业网(CEN)、转发路由器(TR)、专有网络(VPC)、云服务器(ECS)和应用型负载均衡(ALB),实现跨地域的应用负载均衡。它扩展了系统的吞吐能力,提升了可用性和安全性。用户可通过资源编排服务(ROS)一键部署,并进行负载测试验证。清理资源也简便快捷。
|
2月前
|
弹性计算 负载均衡 网络协议
ECS中实现nginx4层7层负载均衡和ALB/NLB原SLB负载均衡
通过本文的介绍,希望您能深入理解并掌握如何在ECS中实现Nginx四层和七层负载均衡,以及如何使用ALB和NLB进行高效的负载均衡配置,以提高系统的性能和可靠性。
163 9
|
3月前
|
缓存 负载均衡 监控
slb基于DNS的负载均衡
slb基于DNS的负载均衡
148 8
|
3月前
|
运维 负载均衡 安全
|
3月前
|
负载均衡 算法 Java
除了 Ribbon,Spring Cloud 中还有哪些负载均衡组件?
这些负载均衡组件各有特点,在不同的场景和需求下,可以根据项目的具体情况选择合适的负载均衡组件来实现高效、稳定的服务调用。
172 5
|
2月前
|
负载均衡 Java Nacos
常见的Ribbon/Spring LoadBalancer的负载均衡策略
自SpringCloud 2020版起,Ribbon被弃用,转而使用Spring Cloud LoadBalancer。Ribbon支持轮询、随机、加权响应时间和重试等负载均衡策略;而Spring Cloud LoadBalancer则提供轮询、随机及Nacos负载均衡策略,基于Reactor实现,更高效灵活。
151 0
|
3月前
|
负载均衡 算法
SLB-Backend的负载均衡算法
【10月更文挑战第19天】
71 5
|
5月前
|
负载均衡 Java Nacos
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
微服务介绍、SpringCloud、服务拆分和远程调用、Eureka注册中心、Ribbon负载均衡、Nacos注册中心
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡

热门文章

最新文章