zuul超時重試簡單使用
阿新 • • 發佈:2022-05-30
閘道器部分重要的依賴
<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency>
@EnableRetry開啟重試註解
#hystrix超時設定 hystrix.command.default.execution.isolation.thread.timeoutInMillisceconds=20000 ribbon.ConnectTimeout=5000 ribbon.ReadTimeout=5000 #重試次數 ribbon.MaxAutoRetries=1 #尋找一個服務重試 ribbon.MaxAutoRetriesNextServer=1 ribbon.OkToRetryOnAllOperations=true
呼叫http://127.0.0.1:1005/product-service/product/testFirst/777服務
這裡的閘道器沒有自定義超時,所以使用了預設配置
這裡的超時可以如圖設定
@RestController @RequestMapping("/product") @Slf4j public class ProductController { @GetMapping("/getProduct/{id}") public String selectProduct(@PathVariable String id){ log.info("【呼叫服務者入參】:{}",id); return "查詢到的主鍵返回"+id; } @GetMapping("/testFirst/{id}") public String testFirst(@PathVariable Integer id){ log.info("【呼叫服務者入參】:{}",id); try { Thread.sleep(4000L); } catch (InterruptedException e) { e.printStackTrace(); } StringBuilder stringBuilder=new StringBuilder(); stringBuilder.append("qwe"); stringBuilder.append("-"); stringBuilder.append(id); return stringBuilder.toString(); } }
zuul閘道器配置超時設定後,請求的資料不是很快返回回來,會稍微等會
本次的測試中需要一個註冊中心,一個zuul閘道器配置,一個服務提供者
父類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"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>zuul-aprent</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>eureka-service</module> <module>prodoct-service</module> <module>order-service</module> <module>zuul-service</module> <module>zuul-one</module> <module>zuul-two</module> <module>zuul-three</module> </modules> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.5.RELEASE</version> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR3</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <!--編譯外掛--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> <encoding>utf-8</encoding> </configuration> </plugin> <!--打包外掛--> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
eureka完整專案
<?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>zuul-aprent</artifactId> <groupId>org.example</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.eureka</groupId> <artifactId>eureka-service</artifactId> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> <finalName>eureka</finalName> </build> </project> server.port=8761 spring.application.name=eureka-service eureka.instance.hostname=localhost eureka.client.service-url.defaultZone=http://localhost:8761/eureka eureka.client.register-with-eureka=false eureka.client.fetch-registry=false logging.level.com.eureka=info logging.level.web=info spring.devtools.add-properties=false package com.eureka; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; /** * @author yourheart * @Description * @create 2022-04-20 21:17 */ @SpringBootApplication @EnableEurekaServer public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class,args); } }
zuul閘道器完整專案
<?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>zuul-aprent</artifactId> <groupId>org.example</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.zuul</groupId> <artifactId>zuul-three</artifactId> <dependencies> <!--zuul依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <!--lombok依賴--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> </dependency> <!--客戶端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency> </dependencies> </project> server.port=1005 spring.application.name=zuul-three #註冊到eureka註冊中心,如果是註冊到叢集就用逗號連線多個,單例項寫上一個就好 eureka.client.service-url.defaultZone=http://localhost:8761/eureka logging.level.com.zuul=debug logging.level.web=debug spring.devtools.add-properties=false #hystrix超時設定 hystrix.command.default.execution.isolation.thread.timeoutInMillisceconds=20000 ribbon.ConnectTimeout=5000 ribbon.ReadTimeout=5000 #重試次數 ribbon.MaxAutoRetries=1 #尋找一個服務重試 ribbon.MaxAutoRetriesNextServer=1 ribbon.OkToRetryOnAllOperations=true package com.zuul.failback; import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpResponse; import org.springframework.stereotype.Component; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; /** * @author yourheart * @Description * @create 2022-05-26 23:36 */ @Component public class ProductProviderFallback implements FallbackProvider { @Override public String getRoute() { return "order-service"; } @Override public ClientHttpResponse fallbackResponse(String route, Throwable cause) { ClientHttpResponse response = new ClientHttpResponse() { @Override public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); MediaType mediaType = new MediaType("application", "json", Charset.forName("utf-8")); headers.setContentType(mediaType); return headers; } @Override public InputStream getBody() throws IOException { ByteArrayInputStream inputStream = new ByteArrayInputStream("訂單服務不可用".getBytes()); return inputStream; } @Override public HttpStatus getStatusCode() throws IOException { return HttpStatus.INTERNAL_SERVER_ERROR; } @Override public int getRawStatusCode() throws IOException { return this.getStatusCode().value(); } @Override public String getStatusText() throws IOException { return this.getStatusCode().getReasonPhrase(); } @Override public void close() { } }; return response; } } package com.zuul; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; import org.springframework.retry.annotation.EnableRetry; /** * @author yourheart * @Description * @create 2022-05-26 23:15 */ @SpringBootApplication //開啟zuul註解 @EnableZuulProxy //開啟重試註解 @EnableRetry public class ZuulThreeApplication { public static void main(String[] args) { SpringApplication.run(ZuulThreeApplication.class,args); } }
商品服務完整專案
<?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>zuul-aprent</artifactId> <groupId>org.example</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.product</groupId> <artifactId>prodoct-service</artifactId> <dependencies> <!--客戶端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--web依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--新增fastjson依賴--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.7</version> </dependency> <!--判斷空的用法 --> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <!--lombok依賴--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> <finalName>product</finalName> </build> </project>
server.port=1000 spring.application.name=product-service #註冊到eureka註冊中心,如果是註冊到叢集就用逗號連線多個,單例項寫上一個就好 eureka.client.service-url.defaultZone=http://localhost:8761/eureka logging.level.com.product=debug logging.level.web=debug spring.devtools.add-properties=false
package com.product.controller.front; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @author yourheart * @Description * @create 2022-04-20 21:30 */ @RestController @RequestMapping("/product") @Slf4j public class ProductController { @GetMapping("/getProduct/{id}") public String selectProduct(@PathVariable String id){ log.info("【呼叫服務者入參】:{}",id); return "查詢到的主鍵返回"+id; } @GetMapping("/testFirst/{id}") public String testFirst(@PathVariable Integer id){ log.info("【呼叫服務者入參】:{}",id); try { Thread.sleep(4000L); } catch (InterruptedException e) { e.printStackTrace(); } StringBuilder stringBuilder=new StringBuilder(); stringBuilder.append("qwe"); stringBuilder.append("-"); stringBuilder.append(id); return stringBuilder.toString(); } }
package com.product; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * @author yourheart * @Description * @create 2022-04-20 21:28 */ @SpringBootApplication @EnableDiscoveryClient public class ProductApplication { public static void main(String[] args) { SpringApplication.run(ProductApplication.class,args); } }
而當有第三方服務呼叫商品服務會出現超時問題
這個因為訂單服務預設的超時不夠用了
需要在訂單服務中配置如下引數
server.port=1001 spring.application.name=order-service #註冊到eureka註冊中心,如果是註冊到叢集就用逗號連線多個,單例項寫上一個就好 eureka.client.service-url.defaultZone=http://localhost:8761/eureka logging.level.com.order=debug logging.level.web=debug spring.devtools.add-properties=false hystrix.command.default.execution.isolation.thread.timeoutInMillisceconds=20000 ribbon.ConnectTimeout=5000 ribbon.ReadTimeout=5000 ribbon.MaxAutoRetries=1 ribbon.MaxAutoRetriesNextServer=1 ribbon.OkToRetryOnAllOperations=true
就是自定義設定後,預設的超時時間變長了