SpringCloud之loadbalancer负载均衡组件实战详解

 更新时间:2023年06月15日 16:45:25   作者:吃猫的鱼_ 创作等级LV.3  
LoadBalancer是Spring Cloud官方提供的负载均衡组件,可用于替代Ribbon,这篇文章主要介绍了SpringCloud之loadbalancer负载均衡组件,需要的朋友可以参考下

SpringCloud之loadbalancer负载均衡组件

概述

Spring Cloud 2020版本后,默认移除了对Netflix的依赖,作为负载均衡组件的Ribbon被弃用了,官方默认推荐使用的是Loadbalancer

LoadBalancer简介

LoadBalancerSpring Cloud官方提供的负载均衡组件,可用于替代Ribbon。其使用方式与Ribbon基本兼容,可以从Ribbon进行平滑过渡。

使用

依赖

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

RestTemplate配置

@Configuration
public class RestTemplateConfig {
    @Bean
    @ConfigurationProperties(prefix = "rest.template.config")
    public HttpComponentsClientHttpRequestFactory customHttpRequestFactory() {
        return new HttpComponentsClientHttpRequestFactory();
    }
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate(customHttpRequestFactory());
    }
}

服务提供者接口

@RestController
@RequestMapping("/user")
public class UserLoadBalancerController {
    @Autowired
    private RestTemplate restTemplate;
    @Value("${service-url.nacos-user-service}")
    private String userServiceUrl;
    @GetMapping("/{id}")
    public CommonResult getUser(@PathVariable Long id) {
        return restTemplate.getForObject(userServiceUrl + "/user/{1}", CommonResult.class, id);
    }
}

服务实例缓存

  • LoadBalancer为了提高性能,不会在每次请求时去获取实例列表,而是将服务实例列表进行了本地缓存。
  • 默认的缓存时间为35s,为了减少服务不可用还会被选择的可能性,我们可以进行如下配置。
spring:
  cloud:
    loadbalancer:
      cache: # 负载均衡缓存配置
        enabled: true # 开启缓存
        ttl: 5s # 设置缓存时间
        capacity: 256 # 设置缓存大小

HTTP请求转换

如果你想在每次远程调用中传入自定义的请求头的话,可以试试LoadBalancerRequestTransformer,通过它可以对原始请求进行一定的转换。

  • 首先我们需要配置好LoadBalancerRequestTransformerBean实例,这里我们将ServiceInstanceinstanceId放入到请求头X-InstanceId中;
@Configuration
public class LoadBalancerConfig {
    @Bean
    public LoadBalancerRequestTransformer transformer() {
        return new LoadBalancerRequestTransformer() {
            @Override
            public HttpRequest transformRequest(HttpRequest request, ServiceInstance instance) {
                return new HttpRequestWrapper(request) {
                    @Override
                    public HttpHeaders getHeaders() {
                        HttpHeaders headers = new HttpHeaders();
                        headers.putAll(super.getHeaders());
                        headers.add("X-InstanceId", instance.getInstanceId());
                        return headers;
                    }
                };
            }
        };
    }
}

在服务提供接口中打印请求头

@RestController
@RequestMapping("/user")
public class UserController {
    @GetMapping("/{id}")
    public CommonResult<User> getUser(@PathVariable Long id) {
        User user = userService.getUser(id);
        LOGGER.info("根据id获取用户信息,用户名称为:{}", user.getUsername());
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = servletRequestAttributes.getRequest();
        String instanceId = request.getHeader("X-InstanceId");
        if (StrUtil.isNotEmpty(instanceId)) {
            LOGGER.info("获取到自定义请求头:X-InstanceId={}", instanceId);
        }
        return new CommonResult<>(user);
    }
}

到此这篇关于SpringCloud之loadbalancer负载均衡组件的文章就介绍到这了,更多相关SpringCloud loadbalancer负载均衡内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot应用gradle Plugin示例详解

    Springboot应用gradle Plugin示例详解

    这篇文章主要介绍了Springboot应用gradle Plugin详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • SpringCloud笔记(Hoxton)Netflix之Ribbon负载均衡示例代码

    SpringCloud笔记(Hoxton)Netflix之Ribbon负载均衡示例代码

    这篇文章主要介绍了SpringCloud笔记HoxtonNetflix之Ribbon负载均衡,Ribbon是管理HTTP和TCP服务客户端的负载均衡器,Ribbon具有一系列带有名称的客户端(Named Client),对SpringCloud Ribbon负载均衡相关知识感兴趣的朋友一起看看吧
    2022-06-06
  • sharding-jdbc中的事务详细解读

    sharding-jdbc中的事务详细解读

    这篇文章主要介绍了sharding-jdbc中的事务详细解读,sharding-jdbc在分库分表方面提供了很大的便利性,在使用DB的时候,通常都会涉及到事务这个概念,而在分库分表的环境上再加上事务,就会使事情变得复杂起来,需要的朋友可以参考下
    2023-12-12
  • Java修改maven的默认jdk版本为1.7的方法

    Java修改maven的默认jdk版本为1.7的方法

    这篇文章主要介绍了Java修改maven的默认jdk版本为1.7的方法,需要的朋友可以参考下
    2018-02-02
  • swagger注解@ApiModelProperty失效情况的解决

    swagger注解@ApiModelProperty失效情况的解决

    这篇文章主要介绍了swagger注解@ApiModelProperty失效情况的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 浅谈JAVA并发之ReentrantLock

    浅谈JAVA并发之ReentrantLock

    本文主要介绍了基于AQS实现的ReentrantLock(重入锁),感兴趣的同学,可以参考下。
    2021-06-06
  • Sentinel 断路器在Spring Cloud使用详解

    Sentinel 断路器在Spring Cloud使用详解

    Sentinel是阿里巴巴开源的一款微服务流量控制组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性,本文介绍Sentinel 断路器在Spring Cloud使用,感兴趣的朋友一起看看吧
    2025-02-02
  • 教你用JDK编译Java文件的方法

    教你用JDK编译Java文件的方法

    这篇文章主要介绍了教你用JDK编译Java文件的方法,分步骤给大家介绍了设置环境变量的方法,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • IDEA下SpringBoot指定配置文件启动项目的全过程

    IDEA下SpringBoot指定配置文件启动项目的全过程

    我们在使用springboot项目开发的时候,每次切换环境跑项目的时候,都得修改配置文件的数据库地址,这样来回修改感觉很麻烦,这篇文章主要给大家介绍了关于IDEA下SpringBoot指定配置文件启动项目的相关资料,需要的朋友可以参考下
    2023-06-06
  • JAVA随机打乱数组顺序的方法

    JAVA随机打乱数组顺序的方法

    这篇文章主要介绍了JAVA随机打乱数组顺序的方法,包含了随机数的应用及数组的排序等操作,是Java操作数组的典型应用,需要的朋友可以参考下
    2014-11-11

最新评论