Víc*_*ozo 0 spring-boot spring-cloud spring-cloud-feign openfeign spring-cloud-circuitbreaker
当我的假客户端尝试访问我的其他服务时,我试图为他们设置超时。为了测试我的断路器方法。这是我的基本设置。我正在使用 spring-boot 3.0.2 和 spring cloud 版本 2022.0.1
我有一个边缘服务项目,这是 pom.xml
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>e-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>e-service</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
<spring-cloud.version>2022.0.1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>netflix-candidates</id>
<name>Netflix Candidates</name>
<url>https://artifactory-oss.prod.netflix.net/artifactory/maven-oss-candidates</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我有spring-cloud-starter-openfeign依赖项
这是我的配置application.properties
spring.application.name=edge-service
server.port=8080
feign.client.config.default.readTimeout=2000
Run Code Online (Sandbox Code Playgroud)
使用此属性,feign.client.config.default.readTimeout=2000将 readTimeout 设置为 2 秒就足够了。但由于某种原因不起作用。
在我的服务中,我正在调用 FeignClient (ProxyServiceClient)
spring.application.name=edge-service
server.port=8080
feign.client.config.default.readTimeout=2000
Run Code Online (Sandbox Code Playgroud)
在我的 ProxyService 中,我设置了 3 秒的睡眠时间来触发每个请求的超时
@Service
public class MovieServiceImpl implements MovieService {
private final Logger logger = LoggerFactory.getLogger(MovieServiceImpl.class);
@Autowired
private ProxyServiceClient proxyServiceClient;
@CircuitBreaker(name = "findHorroMovies", fallbackMethod = "findHorrorMoviesFallback")
public ResponseDTO findAllHorroMovies() {
ResponseDTO responseDTO = new ResponseDTO();
List<MovieCatalogDTO> horroMovies = proxyServiceClient.findByGenre(Genre.HORROR);
responseDTO.setMovieCatalogs(horroMovies);
responseDTO.setMessage("Buuuuuhhhh");
responseDTO.setSize(horroMovies.size());
return responseDTO;
}
public ResponseDTO findHorrorMoviesFallback(Exception e) {
logger.error(e.getMessage());
ResponseDTO responseDTO = new ResponseDTO();
List<MovieCatalogDTO> movieCatalogs = new ArrayList<>();
responseDTO.setMovieCatalogs(movieCatalogs);
responseDTO.setSize(0);
responseDTO.setMessage("Buuuuuhhh (cached)");
return responseDTO;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在做一些测试,但它总是花费超过 2 秒而没有关闭连接。我不知道我做错了什么。希望你能帮我。
我尝试在 application.properties 文件中添加属性
feign.client.config.default.readTimeout=2000
在2秒内设置readTimeout,但不起作用...我不知道它是否必须与spring-boot或spring-cloud的版本有关。因为我记得这种方法曾经在较旧的项目中起作用。
好吧,我找到了解决方案。在openfeign文档中有一个解释,其中application.properties中的默认配置已更改
spring:
cloud:
openfeign:
client:
config:
feignName:
url: http://remote-service.com
connectTimeout: 5000
readTimeout: 5000
loggerLevel: full
errorDecoder: com.example.SimpleErrorDecoder
retryer: com.example.SimpleRetryer
defaultQueryParameters:
query: queryValue
defaultRequestHeaders:
header: headerValue
requestInterceptors:
- com.example.FooRequestInterceptor
- com.example.BarRequestInterceptor
responseInterceptor: com.example.BazResponseInterceptor
dismiss404: false
encoder: com.example.SimpleEncoder
decoder: com.example.SimpleDecoder
contract: com.example.SimpleContract
capabilities:
- com.example.FooCapability
- com.example.BarCapability
queryMapEncoder: com.example.SimpleQueryMapEncoder
micrometer.enabled: false
Run Code Online (Sandbox Code Playgroud)
所以我必须更新这个属性
spring.cloud.openfeign.client.config.default.readTimeout=2000
Run Code Online (Sandbox Code Playgroud)
而不是这个
feign.client.config.default.readTimeout=2000
Run Code Online (Sandbox Code Playgroud)
这就是解决方案。我希望它对与我面临同样问题的人有所帮助:D。
| 归档时间: |
|
| 查看次数: |
3305 次 |
| 最近记录: |