新建新的项目模块,端口号80
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>cloud2020</artifactId> <groupId>com.atguigu.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloud-consumer-fegin-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.atguigu.springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>${project.version}</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> </project>
application.yml。这里没有注册进eureka,这个无所谓的
server: port: 80 eureka: client: #表示是否将自己注册进EurekaServer默认为true。 register-with-eureka: false service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/ #设置feign客户端超时时间(OpenFeign默认支持ribbon) #ribbon: #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间 #ReadTimeout: 5000 #指的是建立连接后从服务器读取到可用资源所用的时间 #ConnectTimeout: 5000 #logging: #level: # feign日志以什么级别监控哪个接口 #com.atguigu.springcloud.service.PaymentFeignService: debug
启动类要加注解。@EnableFeignClients
@SpringBootApplication @EnableFeignClients public class OrderFeginMain80 { public static void main(String[] args) { SpringApplication.run(OrderFeginMain80.class,args); } }
service层也要加注解。@FeignClient(value = "CLOUD-PAYMENT-SERVICE")。这里的value取决于eureka
注意这里的service层是接口加注解
@Component @FeignClient(value = "CLOUD-PAYMENT-SERVICE") public interface PaymentFeginService { //CommonResult<Payment> getPaymentById(@Param("id") Long id); @GetMapping(value = "/payment/get/{id}") public CommonResult getPaymentById(@PathVariable("id") Long id); }这里的service层必须加GetMapping,因为要去调用8001和8002的控制器
这里的接受结果返回类要跟8001和8002的一样
在这里附上8001的控制器
@GetMapping(value = "/payment/get/{id}") public CommonResult getPaymentById(@PathVariable("id") Long id){ Payment payment = paymentService.getPaymentById(id); log.info("*******插入结果"+payment); if (payment!=null){ return new CommonResult(200,"查询成功,端口号:"+serverPort,payment); }else { return new CommonResult(444,"查询失败,查询ID:"+id,null); } }
最后是写控制器
@RestController @Slf4j public class OrderFeginController { @Resource private PaymentFeginService paymentFeginService; @GetMapping(value = "/consumer/payment/get/{id}") public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){ return paymentFeginService.getPaymentById(id); } }
OpenFeign自带轮询。因为他底层用的就是ribbon
效果图
OpenFeign的默认超时时间是1秒
在8001写如控制器,等待3秒
@GetMapping(value = "/payment/feign/timeout") public String paymentFeginTimeout(){ try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } return serverPort; }然后先访问8001,看看能否访问,效果显示没问题,等待3秒既有
80项目的service加方法
@GetMapping(value = "/payment/feign/timeout") public String paymentFeignTimeout();控制器
@GetMapping(value = "/consumer/payment/feign/timeout") public String paymentFeignTimeout() { // OpenFeign客户端一般默认等待1秒钟 return paymentFeginService.paymentFeignTimeout(); }然后走80端口的网页,就会报超时错误
这时通过 application.yml修改ribbon的超时等待时间。这里要注意ribbon前是无空格的
server: port: 80 eureka: client: #表示是否将自己注册进EurekaServer默认为true。 register-with-eureka: false service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/ #设置feign客户端超时时间(OpenFeign默认支持ribbon) ribbon: #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间 ReadTimeout: 5000 #指的是建立连接后从服务器读取到可用资源所用的时间 ConnectTimeout: 5000 #logging: #level: # feign日志以什么级别监控哪个接口 #com.atguigu.springcloud.service.PaymentFeignService: debug
然后跑起来可以访问了。
在这里我遇到坑,就是显示的错误不是readout,是404
后来发现是我只修改了8001的控制器,没修改8002的,导致一直走8002控制器,所以显示找不到,
这时候停了8002的项目或者也加入超时控制器方法即可
接下来讲开启日志
修改application
server: port: 80 eureka: client: #表示是否将自己注册进EurekaServer默认为true。 register-with-eureka: false service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/ #设置feign客户端超时时间(OpenFeign默认支持ribbon) ribbon: #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间 ReadTimeout: 5000 #指的是建立连接后从服务器读取到可用资源所用的时间 ConnectTimeout: 5000 logging: level: # feign日志以什么级别监控哪个接口 com.atguigu.springcloud.service.PaymentFeginService: debug添加配置类
package com.atguigu.springcloud.config; import feign.Logger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * Created by IntelliJ IDEA. * User: zhuangzibing * Date: 2020/7/1 */ @Configuration public class FeignConfig { @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } }效果如下
日志有四个级别