docs/Spring全家桶/SpringCloud/SpringCloudLoadBalancer.md
ǰãҰMall汾ȫ ͨGatewayصʱService Unavailable⡣ŲԭʱΪؾRibbonˣΪNetflixԴһRibbonѽά״̬Ƽʹõ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 # ûС
ÿԶ̵дԶͷĻLoadBalancerRequestTransformerͨԶԭʼһת
ҪúLoadBalancerRequestTransformerBeanʵǽServiceInstanceinstanceId뵽ͷX-InstanceIdУ
/**
Ȼnacos-user-serviceеĴ룬ӡȡͷX-InstanceIdϢ
/**
ʽӿڽвԣ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