在没有feign之前,我们的客户端使用的是ribbon+restTemplate。
OpenFeign的使用其实就是 微服务调用接口+@FeignClient注解
一、OpenFeign的简单使用
一、新建模块
新建普通maven工程cloud-consumer-feign-order80。
二、修改pom文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>cloud</artifactId> <groupId>com.shang.cloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloud-consumer-feign-order80</artifactId> <dependencies> <!--openfeign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!--eureka client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- 引入自己定义的api通用包,可以使用Payment支付Entity --> <dependency> <groupId>com.shang.cloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--一般基础通用配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> </project>
三、编写yml文件
server: port: 90 #因为不想和Nginx争夺80端口,所以改成了90 eureka: client: register-with-eureka: false service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
四、编写主启动类
@SpringBootApplication @EnableFeignClients //激活并开启feign public class OrderFeignMain80 { public static void main(String[] args) { SpringApplication.run(OrderFeignMain80.class, args); } }
五、编写业务代码
1、service
@Component @FeignClient("CLOUD-PAYMENT-SERVICE") //使用feign public interface PaymentFeignService { @GetMapping(value = "/payment/get/{id}") public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id); }
2、controller
@RestController @Slf4j public class OrderFeignController { @Autowired private PaymentFeignService paymentFeignService; @GetMapping(value = "/consumer/payment/get/{id}") public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){ return paymentFeignService.getPaymentById(id); } }
六、启动测试
先启动7001、7002;在启动8001、8002;最后启动80
在浏览器地址栏输入:
http://localhost:90/consumer/payment/get/1
成功显示
七、OpenFeign中逻辑代码的关系
二、OpenFeign的超时控制
一、在8001的controller类中添加睡眠的方法
使服务运行时间超过1秒
/** * 暂停3秒线程,用于测试OpenFeign的超时控制 * @return */ @GetMapping(value = "/payment/feign/timeout") public String paymentTimeOut(){ try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } return serverPort; }
二、在80的service和controller中分别加上这个睡眠方法
1、service
@GetMapping(value = "payment/feign/timeout") public String paymentFeignTimeOut();
2、controller
@GetMapping(value = "/consumer/payment/feign/timeout") public String paymentFeignTimeOut(){ //客户端一般默认等待1秒钟,但是我们故意停顿3秒 return paymentFeignService.paymentFeignTimeOut(); }
三、运行测试
1、8001自测
先在浏览器地址栏中输入
http://localhost:8001/payment/feign/timeout
三秒后,能正常访问
2、通过80
不能正常访问
四、设置feign客户端超时控制
在80的yml中添加对应的配置
#设置feign客户端超时时间(OpenFeign默认支持ribbon) ribbon: #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间 ReadTimeout: 5000 #指的是建立连接后从服务器读取到可用资源所用的时间 ConnectTimeout: 5000
五、再次运行测试
五秒后,成功访问。
三、OpenFeign日志打印功能
一、配置日志bean
新增config包
@Configuration public class FeignConfig { @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } }
二、在yml中开启日志的客户端
logging: level: # feign日志以什么级别监控哪个接口 com.atguigu.springcloud.service.PaymentFeignService: debug