Back to Javatutorial

LoadBalancer

docs/Spring全家桶/SpringCloud/SpringCloudLoadBalancer.md

1.0.08.8 KB
Original Source

ǰãҰMall΢汾ȫ ͨGatewayصʱ򣬳Service Unavailable⡣ŲԭʱΪؾRibbonˣΪNetflixԴһRibbonѽά״̬ƼʹõLoadbalancerǾLoadbalancerʹã

LoadBalancer

LoadBalancerSpring CloudٷṩĸؾRibbonʹ÷ʽRibbonݣԴRibbonƽɡ

ʹ

LoadBalancerĻʹãǽʹNacosΪעģͨnacos-loadbalancer-servicenacos-user-service໥ʾ

ؾ

ǽʹRestTemplateʾLoadBalancerĸؾ⹦ܡ

  • nacos-loadbalancer-serviceģpom.xmlļLoadBalancer

    <dependency> <groupId>org.springframework.cloud</groupId> spring-cloud-starter-loadbalancer </dependency>
  • Ȼ󴴽Java࣬RestTemplateͬʱʹ@LoadBalancedע⸳为ؾ

    /**

    • RestTemplate

    • Created by macro on 2019/8/29. */ @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()); } }

  • application.ymlпʹԶöRestTemplateĵóʱã

    rest: template: config: # RestTemplateóʱ connectTimeout: 5000 readTimeout: 5000

  • ȻControllerʹRestTemplateԶ̵ã

    /**

    • Created by macro on 2019/8/29. */ @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); }

      @GetMapping("/getByUsername") public CommonResult getByUsername(@RequestParam String username) { return restTemplate.getForObject(userServiceUrl + "/user/getByUsername?username={1}", CommonResult.class, username); }

      @GetMapping("/getEntityByUsername") public CommonResult getEntityByUsername(@RequestParam String username) { ResponseEntity<CommonResult> entity = restTemplate.getForEntity(userServiceUrl + "/user/getByUsername?username={1}", CommonResult.class, username); if (entity.getStatusCode().is2xxSuccessful()) { return entity.getBody(); } else { return new CommonResult("ʧ", 500); } }

      @PostMapping("/create") public CommonResult create(@RequestBody User user) { return restTemplate.postForObject(userServiceUrl + "/user/create", user, CommonResult.class); }

      @PostMapping("/update") public CommonResult update(@RequestBody User user) { return restTemplate.postForObject(userServiceUrl + "/user/update", user, CommonResult.class); }

      @PostMapping("/delete/{id}") public CommonResult delete(@PathVariable Long id) { return restTemplate.postForObject(userServiceUrl + "/user/delete/{1}", null, CommonResult.class, id); } }

  • nacos-user-serviceѾʵЩӿڣṩnacos-loadbalancer-serviceԶ̵ã

  • Ȼһnacos-loadbalancer-servicenacos-user-serviceʱNacosлʾ·

  • ʱͨnacos-loadbalancer-serviceýӿڽвԣᷢnacos-user-serviceӡ־Ϣʹõѯԣʵַhttp://localhost:8308/user/1

ʽ

ȻLoadBalancerʹRestTemplateԶ̵ãʹOpenFeignʽãǾ¡

  • nacos-loadbalancer-serviceģpom.xmlļOpenFeign

    <dependency> <groupId>org.springframework.cloud</groupId> spring-cloud-starter-openfeign </dependency>
  • ȻOpenFeignĿͻ˽ӿҪõķӿԼ÷ʽ

    /**

    • Created by macro on 2019/9/5. */ @FeignClient(value = "nacos-user-service") public interface UserService { @PostMapping("/user/create") CommonResult create(@RequestBody User user);

      @GetMapping("/user/{id}") CommonResult<User> getUser(@PathVariable Long id);

      @GetMapping("/user/getByUsername") CommonResult<User> getByUsername(@RequestParam String username);

      @PostMapping("/user/update") CommonResult update(@RequestBody User user);

      @PostMapping("/user/delete/{id}") CommonResult delete(@PathVariable Long id); }

  • ControllerʹOpenFeignĿͻ˽ӿԶ̷

    /**

    • Created by macro on 2019/8/29. */ @RestController @RequestMapping("/userFeign") public class UserFeignController { @Autowired private UserService userService;

      @GetMapping("/{id}") public CommonResult getUser(@PathVariable Long id) { return userService.getUser(id); }

      @GetMapping("/getByUsername") public CommonResult getByUsername(@RequestParam String username) { return userService.getByUsername(username); }

      @PostMapping("/create") public CommonResult create(@RequestBody User user) { return userService.create(user); }

      @PostMapping("/update") public CommonResult update(@RequestBody User user) { return userService.update(user); }

      @PostMapping("/delete/{id}") public CommonResult delete(@PathVariable Long id) { return userService.delete(id); } }

  • OpenFeignijʱõĻapplication.ymlݣ

    feign: client: config: default: # Feignóʱ connectTimeout: 5000 readTimeout: 5000

  • ͨԽӿڵԶ̷񣬷ֿãʵַhttp://localhost:8308/userFeign/1

ʵ

LoadBalancerΪܣÿʱȥȡʵбǽʵб˱ػ档

ĬϵĻʱΪ35sΪ˼ٷ񲻿ûᱻѡĿԣǿԽá

spring:
  cloud:
    loadbalancer:
      cache: # ؾ⻺
        enabled: true # 
        ttl: 5s # ûʱ
        capacity: 256 # ûС

HTTPת

ÿԶ̵дԶͷĻLoadBalancerRequestTransformerͨԶԭʼһת

  • ҪúLoadBalancerRequestTransformerBeanʵǽServiceInstanceinstanceId뵽ͷX-InstanceIdУ

    /**

    • LoadBalancer
    • Created by macro on 2022/7/26. */ @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; } }; } }; } }
  • Ȼ޸nacos-user-serviceеĴ룬ӡȡͷX-InstanceIdϢ

    /**

    • Created by macro on 2019/8/29. */ @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); } }
  • ʽӿڽвԣnacos-user-servicęӡ־ԶͷѾɹˣʵַhttp://localhost:8308/user/1

    2022-07-26 15:05:19.920 INFO 14344 --- [nio-8206-exec-5] c.macro.cloud.controller.UserController : idȡûϢûΪmacro 2022-07-26 15:05:19.921 INFO 14344 --- [nio-8206-exec-5] c.macro.cloud.controller.UserController : ȡԶͷ:X-InstanceId=192.168.3.227#8206#DEFAULT#DEFAULT_GROUP@@nacos-user-service

ܽ

ͨLoadBalancerһʵǿԷ֣ʹLoadBalancerRibbonʵҪһЩ÷ʽ֮ͬǰʹùRibbonĻϿ޷лLoadBalancer

ο

ٷĵhttps://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer

ĿԴַ

https://github.com/macrozheng/springcloud-learning/tree/master/nacos-loadbalancer-service

ο

https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA https://juejin.cn/post/6931922457741770760 https://github.com/D2C-Cai/herring http://c.biancheng.net/springcloud https://github.com/macrozheng/springcloud-learning