Ribbon、LoadBalance
消费端在使用restTemplate调用服务端时,对于负载均衡有两种实现方式。
使用Ngnix来完成负载均衡,此时,需要在Nginx上进行服务端的相关配置,可以认为Nginx是跟服务端捆绑在一起的。使用Ribbon来完成负载均衡,此时Ribbon是与消费端捆绑在一起的。 总结:如果想把负载均衡放在客户端,使用Ribbon;如果想把负载均衡放在服务端,则使用Nginx。
Ribbon + LoadBalance
Ribbon依赖已经包含在Eureka依赖当中,不需要导入额外的依赖,直接与Eureka配套使用即可。使用的方法也非常简单。使用注解@LoadBalanced即可赋予RestTemplate负载均衡的能力。
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
然后在调用服务时,写上微服务的名称即可( public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";)
@RestController
@Slf4j
public class OrderController {
public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
@Resource
private RestTemplate restTemplate;
@GetMapping(value = "/consumer/payment/get/{id}")
public CommonResult
return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
}
}
默认使用的是轮询负载均衡策略。 一共有以下几种轮询策略:
OpenFeign
OpenFeign相较于Ribbon更加轻便了,都不需要手动调用RestTemplate。 需要的依赖:
配置:
server.port=80
eureka.client.register-with-eureka=false
#集群版
eureka.client.service-url.defaultZone=http://eureka7001.com:7001/eureka/, http://eureka7002.com:7002/eureka/
#单机版
eureka.client.service-url.defaultZone=http://eureka7001.com:7001/eureka/
# 根据自己的情况选择用哪个
主启动类:
@SpringBootApplication
@EnableFeignClients
public class OrderFeignMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderFeignMain80.class, args);
}
}
需要加上注释EnableFeignClients Controller层demo:
@RestController
@Slf4j
public class OrderFeignController {
@Resource
private PaymentFeignService paymentFeignService;
@GetMapping(value = "/consumer/payment/get/{id}")
public CommonResult getPaymentById(@PathVariable("id") Long id) {
CommonResult
return ret;
}
@GetMapping(value = "/consumer/payment/feign/timeout")
public String getPort(){
return paymentFeignService.paymentFeignTimeout();
}
}
Service层Demo:
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService {
@GetMapping(value = "/payment/get/{id}")
public CommonResult
@GetMapping(value = "/payment/feign/timeout")
public String paymentFeignTimeout();
}
这里记得要加@FeignClient注解,value为微服务的名称。通过微服务名称 + 路径来调用接口。
参考阅读
发表评论