、LoadBalance
定制化开发消费端在使用调用服务端时,定制化开发对于负载均衡有两种实现方式。
- 使用Ngnix定制化开发来完成负载均衡,此时,需要在Nginx上进行服务端的相关配置,可以认为Nginx是跟服务端捆绑在一起的。
- 使用Ribbon来完成负载均衡,此时Ribbon是与消费端捆绑在一起的。
总结:如果想把负载均衡放在客户端,使用Ribbon;如果想把负载均衡放在服务端,则使用Nginx。
Ribbon + LoadBalance
Ribbon依赖已经包含在依赖当中,不需要导入额外的依赖,直接与Eureka配套使用即可。使用的方法也非常简单。使用注解@LoadBalanced
即可赋予RestTemplate负载均衡的能力。
@Configurationpublic class ApplicationContextConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate(){ return new RestTemplate(); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
然后在调用服务时,写上微服务的名称即可( public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
)
@RestController@Slf4jpublic class OrderController { public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE"; @Resource private RestTemplate restTemplate; @GetMapping(value = "/consumer/payment/get/{id}") public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) { return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
默认使用的是轮询负载均衡策略。
一共有以下几种轮询策略:
OpenFeign
OpenFeign相较于Ribbon更加轻便了,都不需要手动调用RestTemplate。
需要的依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
- 1
- 2
- 3
- 4
配置:
server.port=80eureka.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/# 根据自己的情况选择用哪个
- 1
- 2
- 3
- 4
- 5
- 6
- 7
主启动类:
@SpringBootApplication@EnableFeignClientspublic class OrderFeignMain80 { public static void main(String[] args) { SpringApplication.run(OrderFeignMain80.class, args); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
需要加上注释EnableFeignClients
Controller层demo:
@RestController@Slf4jpublic class OrderFeignController { @Resource private PaymentFeignService paymentFeignService; @GetMapping(value = "/consumer/payment/get/{id}") public CommonResult getPaymentById(@PathVariable("id") Long id) { CommonResult<Payment> ret = paymentFeignService.getPaymentById(id); return ret; } @GetMapping(value = "/consumer/payment/feign/timeout") public String getPort(){ return paymentFeignService.paymentFeignTimeout(); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
Service层Demo:
@Component@FeignClient(value = "CLOUD-PAYMENT-SERVICE")public interface PaymentFeignService { @GetMapping(value = "/payment/get/{id}") public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id); @GetMapping(value = "/payment/feign/timeout") public String paymentFeignTimeout();}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
这里记得要加@FeignClient
注解,value
为微服务的名称。通过微服务名称 + 路径来调用接口。