微服务间调用实现负载均衡
客户端实现:
RestTemplate实现
配置注入:
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced // 开启
public RestTemplate getResultTemplate() {
return new RestTemplate();
}
}
用法:
public static final String PAYMENT_URL = "http://CLOUD-PAYMENT";
@Resource
private RestTemplate restTemplate;
@GetMapping("/create")
public CommonRestlt<Payment> create(@RequestBody Payment payment){
return restTemplate.postForObject(PAYMENT_URL+"/payment/create",payment,CommonRestlt.class);
}
ribbon+RestTemplate实现可自定义轮询规则
添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "CLOUD-PAYMENT",configuration = MySelRule.class)
public class OrderMain {
public static void main(String[] args) {
SpringApplication.run(OrderMain.class,args);
}
}
开启RibbonClient定义自己的规则
@Configuration
public class MySelRule {
@Bean
public IRule myRule(){
return new RandomRule();//随机 默认是轮询
}
}
openfeign实现底层也是ribbon+RestTemplate
依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
开启:
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class OrderOpenFeignMain {
public static void main(String[] args) {
SpringApplication.run(OrderOpenFeignMain.class,args);
}
}
用法:定义接口把提供服务的接口copy过来
@Component
@FeignClient(value="CLOUD-PAYMENT",path = "/payment",fallback = PaymentServiceFallBack.class)
public interface PaymentService {
@GetMapping("/queryById/{id}")
CommonRestlt queryById(@PathVariable("id") Integer id);
@GetMapping("/feignTimeout")
String feignTimeout();
}
controller里面调用此接口内的方法,就会转发到提供的服务
@RestController
@RequestMapping("order")
@Slf4j
public class OrderController {
@Resource
private PaymentService paymentService;
@GetMapping("/get/{id}")
public CommonRestlt<Payment> get(@PathVariable("id") Integer id){
System.out.println("************");
return paymentService.queryById(id);
}
@GetMapping("/feignTimeout")
public String feignTimeout(){
return paymentService.feignTimeout();
}
}
默认1秒内提供服务方未应答报错显示超时。此处设置2秒。
ribbon:
# 设置feign读取超时(默认是1秒)
ReadTimeout: 2000
# 设置feign连接超时
ConnectTimeout: 2000
定义fallback方法来处理发生异常的信息
public class PaymentServiceFallBack implements PaymentService {
@Override
public CommonRestlt queryById(Integer id) {
return null;
}
@Override
public String feignTimeout() {
return "feignTimeout请求超时";
}
}
引出后面的服务降级+服务熔断