新建新的項目模塊,端口號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;
}
}
效果如下
日誌有四個級別