2.创建application.yml
[XML] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#spring配置[/size][/font][/color][/align]spring:
application:
#应用名称(服务调用者)
name: consumer-service
#服务器配置
server:
#端口
port: 7000
#配置服务注册发现
eureka:
client:
#配置服务注册中心地址
service-url:
defaultZone: [url]https://www.apiboot.cn/eureka[/url]
#feign远程调用配置
feign:
hystrix:
#开启熔断
enabled: true
|
3.启动类添加注解
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
/**
* 服务调用者
* @ EnableDiscoveryClient 开启客户端发现
* @ EnableFeignClients 开启Feign远程调用
* @ EnableHystrixDashboard 开启熔断监控仪表盘
* @ EnableCircuitBreaker 开启断路器
*/
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableHystrixDashboard
@EnableCircuitBreaker
public class ConsumerServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerServiceApplication. class , args);
}
}
|
4.创建远程调用接口 HelloRemote.java
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
/**
* feign远程调用接口
* FeignClient注解的name属性值要写服务提供者在注册中心注册的服务名称
* FeignClient注解的fallback属性值表示远程调用失败时的回调类
*/
@FeignClient (name = "producer-service" ,fallback = HelloRemoteFallback. class )
public interface HelloRemote {
/**
* 远程调用方法
* @param name 名称
* @return 远程调用结果
*/
@RequestMapping (value = "/hello" )
String hello( @RequestParam (value = "name" ) String name);
}
|
5.创建远程调用回调类 HelloRemoteFallback.java
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
/**
* 熔断回调类
* 继承feign远程调用接口,并在实现方法中输出回调的信息
*/
@Component
public class HelloRemoteFallback implements HelloRemote {
/**
* 远程调用失败,将会回调该方法
* @param name 名称
* @return 自定义返回信息
*/
@Override
public String hello( @RequestParam (value = "name" ) String name) {
return "hello " + name + ", this message is failed" ;
}
}
|
6.创建控制器类 HelloController.java
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
/**
* Hello控制器 测试远程调用接口
* 将远程调用接口注入,并调用远程方法
*/
@RestController
public class HelloController {
@Autowired
private HelloRemote helloRemote; // 远程调用接口
/**
* 输出hello方法
* @param name 名称
* @return 远程调用返回值
*/
@RequestMapping (value = "/hello/{name}" )
public String hello( @PathVariable (value = "name" ) String name){
return helloRemote.hello(name);
}
}
|
7.打包部署到服务器上,访问服务注册中心 https://www.apiboot.cn/
发现我们的服务consumer-service已经成功运行起来并且注册到了服务注册中心,
consumer-service所调用的远程服务 producer-service我也已经提前运行起来了。
为了测试方便,每个应用我都绑定了二级域名,访问我们的服务调用者提供的远程调用方法
https://consumer.apiboot.cn/hello/lanshiqin
我们通过consumer-service服务 远程调用了producer-service服务,并且成功响应。
接下来我们手动停止服务提供者 producer-service服务,假装服务故障。
我们再次访问服务调用者提供的远程调用方法
https://consumer.apiboot.cn/hello/lanshiqin
发现远程调用不成功,但是不会因为调用不成功导致服务异常,而是熔断了远程服务的连接并以友好的方式触发了我们的远程调用失败时指定的本地回调方法,输出了自定义信息。证明熔断成功。
熔断监控
由于我们为服务消费者添加了熔断监控并且开启了服务,所以我们可以监控服务消费者项目 consumer-service 的熔断信息
打开浏览器输入地址:
https://consumer.apiboot.cn/hystrix
浏览器返回了刺猬图标的界面,我们可以通过他来监控服务调用的成功率情况。
Hystrix Dashboard 面板的地址栏里输入,点击 Monitor Stream,进入监控的图表页面。
一开始该页面的Circuit页卡会显示Loading…,我们只要访问以下服务消费者的地址
https://consumer.apiboot.cn/hello/lanshiqin 监控面板即可显示熔断信息与图表详情。
下图为服务提供者正常被服务消费者调用的时候的熔断信息
我们把服务提供者服务关闭,让服务消费者无法正常远程调用到服务,然后查看服务消费者的熔断信息,发现100.0%的调用失败,因为我们没有做服务提供者集群,所以唯一的服务提供者被关闭后,远程调用将100%调用失败。
到此,我们的单个应用的熔断监控器已经成功的监控到远程服务的调用情况。项目地址:https://github.com/lanshiqin/cloud-project欢迎点赞。