作用
Feign旨在使编写java Http客户端更容易,使用Ribbon—+RestTemplate,利用RestTemplate对http请求进行封装,形成了一套模板化调用方法。但是在实际开发中,由于服务依赖调用可能不止一处,往往一个接口会被多出调用,所以通常都会针对每个微服务自行封装一些可续断来包装,我们只需要创建一个接口并使用注解的方式来配置,即可往常对服务提供放的接口绑定,简化了Spring cloud Ribbon,自动封装服务调用客户端的开发量,Feign继承了Ribbon,优雅简单的通过接口实现服务调用
Feign和OpenFeign
Feign是Spring Cloud组件中的一个轻量级的Rest风格的http服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务,调用使用Feign注解的接口,即可调用服务注册中心的服务
OpenFign是在Feign基础上支持了SpringMvc的注解,如@RequestMapping等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务
简单实现
controller
package com.jia.learn.controller;
import com.jia.learn.entities.CommonResult;
import com.jia.learn.entities.Payment;
import com.jia.learn.service.PaymentFeignService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* @program: SpringCloudLearn
* @description
* @author: LIANG
* @create: 2021-12-12 15:32
**/
@RestController
@RequestMapping("/consumer")
public class OpenFeignOrderController {
@Resource
private PaymentFeignService paymentFeignService;
@GetMapping(value = "payment/get/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) {
return paymentFeignService.getPaymentById(id);
}
}
service Feign接口
package com.jia.learn.service;
import com.jia.learn.entities.CommonResult;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* @program: SpringCloudLearn
* @description
* @author: LIANG
* @create: 2021-12-12 15:23
**/
@Component
//@FeignClient注解配置对应服务
@FeignClient(value = "cloud-payment-service")
public interface PaymentFeignService {
@GetMapping(value = "payment/get/{id}")
CommonResult getPaymentById (@PathVariable("id") Long id);
}
启动类
package com.jia.learn;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* @program: SpringCloudLearn
* @description
* @author: LIANG
* @create: 2021-12-12 15:12
**/
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
//开启Feign
@EnableFeignClients
public class OpenFeienOrder8000 {
public static void main(String[] args) {
SpringApplication.run(OpenFeienOrder8000.class,args);
}
}
配置
Ribbon负载均衡,超时时间等
# 服务名
cloud-payment-service:
ribbon:
#配置规则
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #配置规则 随机
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #配置规则 轮询
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule #配置规则 重试
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule #配置规则 响应时间权重
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule #配置规则
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
#请求连接超时时间
ConnectTimeout: 5000
#请求处理的超时时间
ReadTimeout: 1000
#对所有请求都进行重试
OkToRetryOnAllOperations: true
#切换实例的重试次数
MaxAutoRetriesNextServer: 2
#对当前实例的重试次数
MaxAutoRetries: 1
增强日志
-
NONE:(默认)不显示任何日志
-
BASIC:仅记录请求方法 URL,响应状态码以及执行时间
-
HEADERS:BASIC+请求头和响应头
-
FULL:HEADERS+请求和相应的正文和数据
package com.jia.learn.config; import feign.Logger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @program: SpringCloudLearn * @description * @author: LIANG * @create: 2021-12-12 17:08 **/ @Configuration public class FeignConfig { @Bean Logger.Level feignLoggerLevel(){ return Logger.Level.FULL; } }
logging: level: # feign日志以什么级别监控哪个接口 com.jia.learn.service.PaymentFeignService: debug