目标
Hystrix集群及监控turbine
Feign、Hystrix整合之服务熔断服务降级彻底解耦
集群后超时设置
Hystrix集群及监控turbine
前面Dashboard演示的仅仅是单机服务监控,实际项目基本都是集群,所以这里集群监控用的是turbine。
turbine是基于Dashboard的。
先创个集群;
再microservice-student-provider-hystrix-1004项目的基础上再搞一个microservice-student-provider-hystrix-1005
代码和配置都复制一份,然后修改几个地方;
1、yml配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133--- server: port: 1004 context-path: / spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/pages?useUnicode=true&characterEncoding=utf8 username: root password: 123 jpa: hibernate: ddl-auto: update show-sql: true application: name: microservice-student profiles: provider-hystrix-1004 eureka: instance: hostname: localhost appname: microservice-student instance-id: microservice-student:1004 prefer-ip-address: true client: service-url: defaultZone: http://eureka2001.cgl.com:2001/eureka/,http://eureka2002.cgl.com:2002/eureka/,http://eureka2003.cgl.com:2003/eureka/ info: groupId: com.cgl.testSpringcloud artifactId: microservice-student-provider-hystrix-1004 version: 1.0-SNAPSHOT userName: http://cgl.com phone: 123456 hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 1500 --- server: port: 1005 context-path: / spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/pages?useUnicode=true&characterEncoding=utf8 username: root password: 123 jpa: hibernate: ddl-auto: update show-sql: true application: name: microservice-student profiles: provider-hystrix-1005 eureka: instance: hostname: localhost appname: microservice-student instance-id: microservice-student:1005 prefer-ip-address: true client: service-url: defaultZone: http://eureka2001.cgl.com:2001/eureka/,http://eureka2002.cgl.com:2002/eureka/,http://eureka2003.cgl.com:2003/eureka/ info: groupId: com.cgl.testSpringcloud artifactId: microservice-student-provider-hystrix-1005 version: 1.0-SNAPSHOT userName: http://cgl.com phone: 123456 hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 1500 --- server: port: 1006 context-path: / spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/pages?useUnicode=true&characterEncoding=utf8 username: root password: 123 jpa: hibernate: ddl-auto: update show-sql: true application: name: microservice-student profiles: provider-hystrix-1006 eureka: instance: hostname: localhost appname: microservice-student instance-id: microservice-student:1006 prefer-ip-address: true client: service-url: defaultZone: http://eureka2001.cgl.com:2001/eureka/,http://eureka2002.cgl.com:2002/eureka/,http://eureka2003.cgl.com:2003/eureka/ info: groupId: com.cgl.testSpringcloud artifactId: microservice-student-provider-hystrix-1006 version: 1.0-SNAPSHOT userName: http://cgl.com phone: 123456 hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 1500
2、启动类配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21package com.cgl.microservicestudentproviderhystrix; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @EnableCircuitBreaker @EntityScan("com.cgl.*.*") @EnableEurekaClient @SpringBootApplication public class MicroserviceStudentProviderHystrixApplication { public static void main(String[] args) { SpringApplication.run(MicroserviceStudentProviderHystrixApplication.class, args); } }
这样的话 就有了 hystrix集群服务;
3、我们新建项目microservice-student-consumer-hystrix-turbine-91
pom.xml加下依赖
1
2
3
4
5
6
7
8
9<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-turbine</artifactId> </dependency>
4、application.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14server: port: 91 context-path: / eureka: client: service-url: defaultZone: http://eureka2001.cgl.com:2001/eureka/,http://eureka2002.cgl.com:2002/eureka/,http://eureka2003.cgl.com:2003/eureka/ turbine: app-config: microservice-student # u6307u5B9Au8981u76D1u63A7u7684u5E94u7528u540Du79F0 clusterNameExpression: "'default'" #u8868u793Au96C6u7FA4u7684u540Du5B57u4E3Adefault spring: application: name: turbine
4、新建启动类MicroserviceStudentConsumerHystrixTurbine91Application 加注解:@EnableTurbine
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19package com.cgl.microservicestudentconsumerhystrixturbine91; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; import org.springframework.cloud.netflix.turbine.EnableTurbine; @SpringBootApplication(exclude={DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class}) @EnableTurbine public class MicroserviceStudentConsumerHystrixTurbine91Application { public static void main(String[] args) { SpringApplication.run(MicroserviceStudentConsumerHystrixTurbine91Application.class, args); } }
测试:
先启动三个eureka,然后把1004 1005 带hystrix的服务都启动;
microservice-student-consumer-80这个也启动,方便测试;
dashboard,turbine启动;
这样的话 http://localhost/student/hystrix 就能调用服务集群;
http://localhost:91/turbine.stream 可以监控数据,实时ping 返回data
输入http://localhost:90/hystrix进入仪表盘,输入地址
点击 进入集群监控仪表:
Feign、Hystrix整合
前面的代码,用@HystrixCommand fallbackMethod是很不好的,因为和业务代码耦合度太高,不利于维护,所以需要解耦,这我们讲下Feign Hystrix整合。
1、microservice-student-provider-hystrix项目修改
我们不用原先那套。按照正常的逻辑来写;
StudentService加新的接口方法:
1
2
3
4
5
6/** * 测试Hystrix服务降级 * @return */ public Map<String,Object> hystrix();
StudentServiceImpl写具体实现:
1
2
3
4
5
6
7
8@Override public Map<String, Object> hystrix() { Map<String,Object> map=new HashMap<String,Object>(); map.put("code", 200); map.put("info","工号【"+port+"】正在为您服务"); return map; }
StudentProviderController正常调用service方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25/** * 测试Hystrix服务降级 * @return * @throws InterruptedException */ @ResponseBody @GetMapping(value="/hystrix") // @HystrixCommand(fallbackMethod="hystrixFallback") public Map<String,Object> hystrix() throws InterruptedException{ Thread.sleep(100); // Map<String,Object> map=new HashMap<String,Object>(); // map.put("code", 200); // map.put("info","工号【"+port+"】正在为您服务"); return this.studentService.hystrix(); } // public Map<String,Object> hystrixFallback() throws InterruptedException{ // Map<String,Object> map=new HashMap<String,Object>(); // map.put("code", 500); // map.put("info", "系统【"+port+"】繁忙,稍后重试"); // return map; // }
2、microservice-common项目新建FallbackFactory类,解耦服务熔断服务降级
StudentClientService接口,新增getInfo方法;
1
2
3
4
5
6
7/** * 服务熔断降级 * @return */ @GetMapping(value="/student/hystrix") public Map<String,Object> hystrix();
新建 StudentClientFallbackFactory 类
1
2实现FallbackFactory<StudentClientService>接口;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58package com.cgl.microservicecommon.service; import com.cgl.microservicecommon.entity.Studen; import feign.hystrix.FallbackFactory; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author caoguangli * @site www.xiaomage.com * @company * @create 2019-12-09 12:53 */ @Component public class StudentClientFallbackFactory implements FallbackFactory<StudentClientService> { @Override public StudentClientService create(Throwable throwable) { return new StudentClientService() { @Override public Studen get(Integer id) { return null; } @Override public List<Studen> list() { return null; } @Override public boolean save(Studen student) { return false; } @Override public boolean delete(Integer id) { return false; } @Override public String ribbon() { return null; } @Override public Map<String, Object> hystrix() { Map<String,Object> map=new HashMap<String,Object>(); map.put("code", 500); map.put("info", "系统繁忙,稍后重试"); return map; } }; } }
StudentClientService接口的@FeignClient注解加下 fallbackFactory属性
1
2@FeignClient(value="MICROSERVICE-STUDENT",fallbackFactory=StudentClientFallbackFactory.class)
这类我们实现了 降级处理方法实现;
3、microservice-student-consumer-feign-80修改 支持Hystrix
StudentConsumerFeignController新增方法调用
1
2
3
4
5
6
7
8
9
10/** * Feign整合Hystrix服务熔断降级 * @return * @throws InterruptedException */ @GetMapping(value="/hystrix") public Map<String,Object> hystrix() throws InterruptedException{ return studentClientService.hystrix(); }
4、microservice-student-consumer-feign-80的application.yml加上hystrix支持
1
2
3
4feign: hystrix: enabled: true
5、microservice-student-consumer-feign-80的启动类上添加公共模块
1
2@ComponentScan(basePackages = {"com.cgl.microservicecommon","com.cgl.microservicestudentconsumerfeign80"})
注意:
- 公共子项目与当前子项目的基包都要扫描到;
- 只指定公共子模块为基包会导致本子项目的springmvc功能失效;
- 只指定本子项目为基包会导致feign与Hystrix集成失败,从而导致服务熔断功能失效
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23package com.cgl.microservicestudentconsumerfeign80; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.feign.EnableFeignClients; import org.springframework.context.annotation.ComponentScan; @ComponentScan(basePackages = {"com.cgl.microservicecommon","com.cgl.microservicestudentconsumerfeign80"})//扫描公共模块 @EnableFeignClients(value = "com.cgl.*.*") @EnableEurekaClient @SpringBootApplication(exclude={DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class}) public class MicroserviceStudentConsumerFeign80Application { public static void main(String[] args) { SpringApplication.run(MicroserviceStudentConsumerFeign80Application.class, args); } }
测试开启三个eureka,以及带hystrix的provider,和带feign,hystrix的consummer。
测试的话,也是没问题的。0.9秒的话,返回正常信息;超过1秒的话,就返回错误提示;
集群后超时设置
上面错误是什么原因呢,咱们明明在Hystrix中的application.yml中设置了
1
2
3
4
5
6
7
8hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 1500
这里因为还有一个 feign 也有一个超时时间的设置,当然feign底层是 ribbon的封装,所以 直接配置ribbon,ribbon默认超时也是1秒。
所以这里都是强制要求,ribbon的超时时间要大于hystrix的超时时间,否则 hystrix自定义的超时时间毫无意义。
所以还得microservice-student-consumer-feign-80上加个 ribbon超时时间设置
1
2
3
4ribbon: ReadTimeout: 10000 ConnectTimeout: 9000
这样就完工了。可以自行测试。
最后
以上就是现代高跟鞋最近收集整理的关于springcloud之Hystrix集群及集群监控turbineHystrix集群及监控turbineFeign、Hystrix整合集群后超时设置的全部内容,更多相关springcloud之Hystrix集群及集群监控turbineHystrix集群及监控turbineFeign、Hystrix整合集群后超时设置内容请搜索靠谱客的其他文章。
发表评论 取消回复