diff --git a/pom.xml b/pom.xml index 7ea2a294098ae47aac955fb58cfad04988bc04fc..ac8bf57beb72340476698f987fc3c09a8edc3fb1 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,7 @@ springcloud-service-feign springcloud-service-zuul springcloud-service-consul + springcloud-service-hystrix-dashboard springcloud-service-eureka diff --git a/springcloud-service-feign/src/main/java/com/kwan/springcloud/FeignApplication.java b/springcloud-service-feign/src/main/java/com/kwan/springcloud/FeignApplication.java index a70cd57da4f08203dd23b4d12677e626f5bb24c5..c31b391d4b9ce51fcaa202106b35796dae2c6c82 100644 --- a/springcloud-service-feign/src/main/java/com/kwan/springcloud/FeignApplication.java +++ b/springcloud-service-feign/src/main/java/com/kwan/springcloud/FeignApplication.java @@ -6,6 +6,16 @@ import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.openfeign.EnableFeignClients; + + +/** + * + * + * http://localhost:8081/feign/1 + *@version : 2.2.0 + *@author : qinyingjie + *@date : 2023/1/14 16:13 + */ @EnableCircuitBreaker @EnableFeignClients @EnableEurekaClient diff --git a/springcloud-service-feign/src/main/java/com/kwan/springcloud/api/ComputeClientHystrix.java b/springcloud-service-feign/src/main/java/com/kwan/springcloud/api/ComputeClientHystrix.java index a70fc7e3cc649f94c0e15c745b4948482d77266a..d291e050d4d10306113f5b81233911e43ba3e98a 100644 --- a/springcloud-service-feign/src/main/java/com/kwan/springcloud/api/ComputeClientHystrix.java +++ b/springcloud-service-feign/src/main/java/com/kwan/springcloud/api/ComputeClientHystrix.java @@ -7,7 +7,6 @@ import java.io.Serializable; @Component public class ComputeClientHystrix implements ComputeClient { - @Override public Result selectOne(Serializable id) { return Result.error("feign方式请求 服务不可用 请求失败"); diff --git a/springcloud-service-feign/src/main/java/com/kwan/springcloud/service/FeignService.java b/springcloud-service-feign/src/main/java/com/kwan/springcloud/service/FeignService.java index 37072a0f31532a85d57b4e2b0f5428352022f6fb..cf35f76e6ab36fb48314c140462af9d089aa4b8f 100644 --- a/springcloud-service-feign/src/main/java/com/kwan/springcloud/service/FeignService.java +++ b/springcloud-service-feign/src/main/java/com/kwan/springcloud/service/FeignService.java @@ -1,40 +1,20 @@ package com.kwan.springcloud.service; +import com.kwan.springcloud.api.ComputeClient; import com.kwan.springcloud.response.Result; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; @Slf4j @Service public class FeignService { - /** - * http直接访问 - */ - private static final String GOODS_URL = "http://localhost:9100/kwanGoodsInfo/"; - - - /** - * eureka访问 - */ - private static final String GOODS_URL_2 = "http://goods-service/kwanGoodsInfo/"; - - @Autowired - RestTemplate restTemplate; + private ComputeClient computeClient; - // @HystrixCommand(fallbackMethod = "addServiceFallback") - public Result addService(String id) { - //调用远程的controller - return restTemplate.getForEntity(GOODS_URL_2 + id, Result.class).getBody(); - } - - public Result addServiceFallback(String id) { - log.info("失败id={}", id); - return Result.error("ribbon方式请求 服务不可用 请求失败"); + public Result addService(String id) { + return computeClient.selectOne(id); } - } diff --git a/springcloud-service-feign/src/main/resources/application.yaml b/springcloud-service-feign/src/main/resources/application.yaml index c3ded33e9b3338f3a261448021d0b4b4b3f438dc..345c353366783a876831766453b7ecc29dce1ca9 100644 --- a/springcloud-service-feign/src/main/resources/application.yaml +++ b/springcloud-service-feign/src/main/resources/application.yaml @@ -10,4 +10,8 @@ spring: eureka: client: service-url: - defaultZone: http://eureka8767:8767/eureka/,http://eureka8768:8768/eureka/,http://eureka8769:8769/eureka/ \ No newline at end of file + defaultZone: http://eureka8767:8767/eureka/,http://eureka8768:8768/eureka/,http://eureka8769:8769/eureka/ + +feign: + hystrix: + enabled: true \ No newline at end of file diff --git a/springcloud-service-hystrix-dashboard/pom.xml b/springcloud-service-hystrix-dashboard/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..25d4e3434f3aeb3c8c0348095536e4a835aa660c --- /dev/null +++ b/springcloud-service-hystrix-dashboard/pom.xml @@ -0,0 +1,49 @@ + + + 4.0.0 + + com.kwan.springcloud + springcloud-service-parent + 1.0.0 + + springcloud-service-hystrix-dashboard + 0.0.1-SNAPSHOT + springcloud-service-hystrix-dashboard + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.cloud + spring-cloud-starter-netflix-hystrix-dashboard + + + + org.springframework.boot + spring-boot-devtools + true + + + org.springframework.boot + spring-boot-starter-actuator + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/springcloud-service-hystrix-dashboard/src/main/java/com/kwan/springcloud/HystrixDashboardApplication.java b/springcloud-service-hystrix-dashboard/src/main/java/com/kwan/springcloud/HystrixDashboardApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..722e420d3daad52487da865f61b8b8d36f4dc700 --- /dev/null +++ b/springcloud-service-hystrix-dashboard/src/main/java/com/kwan/springcloud/HystrixDashboardApplication.java @@ -0,0 +1,22 @@ +package com.kwan.springcloud; + + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard; +/** + * + * http://localhost:9909/hystrix + *@version : 2.2.0 + *@author : qinyingjie + *@date : 2023/1/14 15:33 + */ +@EnableHystrixDashboard +@SpringBootApplication +public class HystrixDashboardApplication { + + public static void main(String[] args) { + + SpringApplication.run(HystrixDashboardApplication.class, args); + } +} diff --git a/springcloud-service-hystrix-dashboard/src/main/resources/application.yaml b/springcloud-service-hystrix-dashboard/src/main/resources/application.yaml new file mode 100644 index 0000000000000000000000000000000000000000..b921836e068209b5c3320b6058f60a6b2cff91f1 --- /dev/null +++ b/springcloud-service-hystrix-dashboard/src/main/resources/application.yaml @@ -0,0 +1,7 @@ +#端口号 +server: + port: 9909 + +spring: + application: + name: hystrix-dashboard-service #服务名称 \ No newline at end of file diff --git a/springcloud-service-hystrix-dashboard/src/test/java/com/kwan/springcloud/HystrixDashboardApplicationTests.java b/springcloud-service-hystrix-dashboard/src/test/java/com/kwan/springcloud/HystrixDashboardApplicationTests.java new file mode 100644 index 0000000000000000000000000000000000000000..c4f4a371d9ced08bac9cbe99df8706c19c797bad --- /dev/null +++ b/springcloud-service-hystrix-dashboard/src/test/java/com/kwan/springcloud/HystrixDashboardApplicationTests.java @@ -0,0 +1,13 @@ +package com.kwan.springcloud; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class HystrixDashboardApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/springcloud-service-portal/pom.xml b/springcloud-service-portal/pom.xml index 9fb6d1186e993051f291d083c6d5ced33f0aaf25..9fb6186bb77d5ec1fabbf7db093f00ec285004d7 100644 --- a/springcloud-service-portal/pom.xml +++ b/springcloud-service-portal/pom.xml @@ -29,6 +29,17 @@ org.springframework.cloud spring-cloud-starter-netflix-eureka-client + + org.springframework.cloud + spring-cloud-openfeign-core + + + + org.springframework.cloud + spring-cloud-starter-hystrix + 1.4.7.RELEASE + + diff --git a/springcloud-service-portal/src/main/java/com/kwan/springcloud/PortalApplication.java b/springcloud-service-portal/src/main/java/com/kwan/springcloud/PortalApplication.java index d278f2f925dc3b050734e8429d9379a13bea0c36..63e16ab16255c5e6bda9eaabc66027a5d8bfd601 100644 --- a/springcloud-service-portal/src/main/java/com/kwan/springcloud/PortalApplication.java +++ b/springcloud-service-portal/src/main/java/com/kwan/springcloud/PortalApplication.java @@ -3,8 +3,17 @@ package com.kwan.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; - - +import org.springframework.cloud.netflix.hystrix.EnableHystrix; +import org.springframework.cloud.openfeign.EnableFeignClients; +/** + * + * http://localhost:8080/portal/hystrix/1 + *@version : 2.2.0 + *@author : qinyingjie + *@date : 2023/1/14 16:07 + */ +@EnableFeignClients +@EnableHystrix @EnableEurekaClient @SpringBootApplication public class PortalApplication { diff --git a/springcloud-service-portal/src/main/java/com/kwan/springcloud/controller/PortalController.java b/springcloud-service-portal/src/main/java/com/kwan/springcloud/controller/PortalController.java index 0f05405b7467dd09d819c0cef435ad138c8fcaa2..6fac257939697cc3271bb3d508f536b26f458259 100644 --- a/springcloud-service-portal/src/main/java/com/kwan/springcloud/controller/PortalController.java +++ b/springcloud-service-portal/src/main/java/com/kwan/springcloud/controller/PortalController.java @@ -24,6 +24,17 @@ public class PortalController { @Autowired private PortalService portalService; + /** + * 通过主键查询单条数据 + * + * @param id 主键 + * @return 单条数据 + */ + @GetMapping(value = "/hystrix/{id}", produces = MediaType.APPLICATION_PROBLEM_JSON_VALUE) + public Result hystrix(@PathVariable String id) { + return portalService.hystrix(id); + } + /** * 通过主键查询单条数据 * @@ -40,4 +51,6 @@ public class PortalController { public Result test() { return Result.ok("portal 访问成功"); } + + } \ No newline at end of file diff --git a/springcloud-service-portal/src/main/java/com/kwan/springcloud/service/PortalService.java b/springcloud-service-portal/src/main/java/com/kwan/springcloud/service/PortalService.java index 4f7f62a99a1fdc75874b598ee7cef52f03304970..49e49d58127b946d818d8eaf92037d80e7e1e74e 100644 --- a/springcloud-service-portal/src/main/java/com/kwan/springcloud/service/PortalService.java +++ b/springcloud-service-portal/src/main/java/com/kwan/springcloud/service/PortalService.java @@ -1,6 +1,7 @@ package com.kwan.springcloud.service; import com.kwan.springcloud.response.Result; +import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -9,26 +10,42 @@ import org.springframework.web.client.RestTemplate; @Slf4j @Service public class PortalService { - /** * http直接访问 */ private static final String GOODS_URL = "http://localhost:9100/kwanGoodsInfo/"; - - /** * eureka访问 */ private static final String GOODS_URL_2 = "http://goods-service/kwanGoodsInfo/"; - @Autowired RestTemplate restTemplate; - public Result addService(String id) { //调用远程的controller return restTemplate.getForEntity(GOODS_URL_2 + id, Result.class).getBody(); } + @HystrixCommand(fallbackMethod = "addServiceFallback") + public Result hystrix(String id) { + + //1·服务超时,会降级 + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + //2.服务异常,会降级 + String str = null; + if (str == null) { + throw new RuntimeException("服务异常了."); + } + return restTemplate.getForEntity(GOODS_URL_2 + id, Result.class).getBody(); + } + public Result addServiceFallback(String id) { + log.info("失败id={}", id); +// return Result.error("请求超时 服务不可用 请求失败"); + return Result.error("请求异常 服务不可用 请求失败"); + } } diff --git a/springcloud-service-portal/src/main/resources/application.yaml b/springcloud-service-portal/src/main/resources/application.yaml index bde245ad34d9cd4834f58ed50dddfb27a1b877ca..21cf8a7b49b92e261d910209e3e404542dda9fe7 100644 --- a/springcloud-service-portal/src/main/resources/application.yaml +++ b/springcloud-service-portal/src/main/resources/application.yaml @@ -10,4 +10,16 @@ spring: eureka: client: service-url: - defaultZone: http://eureka8767:8767/eureka/,http://eureka8768:8768/eureka/,http://eureka8769:8769/eureka/ \ No newline at end of file + defaultZone: http://eureka8767:8767/eureka/,http://eureka8768:8768/eureka/,http://eureka8769:8769/eureka/ + + + +feign.hystrix.enabled=true + hystrix.command.default.execution.timeout.enabled=true + hystrix.command.default.execution.isolation.thread.timeoutInMi + 1liseconds=5000 + 如果hystrix.command.default.execution.timeout.enabled为true,则会有两 + 个执行方法超时的配置,一个就是ribbon的ReadTimeout,一个就是熔断器 + I + hystrix的timeoutInMilliseconds,此时谁的值小谁生效; + 如果hystrix.command.default.execution.timeout.enabled为false,则熔断 \ No newline at end of file