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 getPaymentById(@PathVariable("id") Long id) {

return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);

}

}

默认使用的是轮询负载均衡策略。 一共有以下几种轮询策略:

OpenFeign

OpenFeign相较于Ribbon更加轻便了,都不需要手动调用RestTemplate。 需要的依赖:

org.springframework.cloud

spring-cloud-starter-openfeign

配置:

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 ret = paymentFeignService.getPaymentById(id);

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 getPaymentById(@PathVariable("id") Long id);

@GetMapping(value = "/payment/feign/timeout")

public String paymentFeignTimeout();

}

这里记得要加@FeignClient注解,value为微服务的名称。通过微服务名称 + 路径来调用接口。

参考阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: