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负载均衡内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java过滤html标签获取纯文本信息的实例

    java过滤html标签获取纯文本信息的实例

    今天小编就为大家分享一篇java过滤html标签获取纯文本信息的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Sentinel热点key限流的实现详解

    Sentinel热点key限流的实现详解

    这篇文章主要介绍了Sentinel热点key限流的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Ubuntu 16.04 安装 java 8的方法

    Ubuntu 16.04 安装 java 8的方法

    这篇文章主要介绍了Ubuntu 16.04 安装 java 8的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • JAVA加密算法- 非对称加密算法(DH,RSA)的详细介绍

    JAVA加密算法- 非对称加密算法(DH,RSA)的详细介绍

    这篇文章主要介绍了JAVA加密算法- 非对称加密算法(DH,RSA),详细介绍了DH,RSA的用法和示例,需要的朋友可以了解一下。
    2016-11-11
  • Java中this的用法实例总结

    Java中this的用法实例总结

    JAVA中的this是一个非常重要的模块,在编程中有非常重要的地位,擅长用this的人常常可以使程序更加简洁和方便,下面这篇文章主要给大家介绍了关于Java中this用法的相关资料,需要的朋友可以参考下
    2022-08-08
  • mybatis 获取无数据的字段不显示的问题

    mybatis 获取无数据的字段不显示的问题

    这篇文章主要介绍了mybatis 获取无数据的字段不显示的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java字符串技巧之删除标点或最后字符的方法

    Java字符串技巧之删除标点或最后字符的方法

    这篇文章主要介绍了Java字符串技巧之删除标点或最后字符的方法,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11
  • java中重写equals和重写hashCode()

    java中重写equals和重写hashCode()

    这篇文章主要介绍了java中重写equals和重写hashCode()的相关资料,需要的朋友可以参考下
    2017-04-04
  • Java数据结构最清晰图解二叉树前 中 后序遍历

    Java数据结构最清晰图解二叉树前 中 后序遍历

    树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形象表示
    2022-01-01
  • 解决SpringBoot的@DeleteMapping注解的方法不被调用问题

    解决SpringBoot的@DeleteMapping注解的方法不被调用问题

    这篇文章主要介绍了解决SpringBoot的@DeleteMapping注解的方法不被调用问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01

最新评论