SpringCloud教程(Finchley版本)-04:断路器(Hystrix-Ribbon)
发布日期:2021-06-30 11:07:37
浏览次数:2
分类:技术文章
本文共 3436 字,大约阅读时间需要 11 分钟。
在微服务系统中,我们把系统拆分成了很多小的服务,各个服务之间通过不同的方式进行依赖和调用,为了保证服务的高可用性,单个服务通常会集群部署,此时,许多服务由于各种问题可能会调用失败,比如超时、异常等。如何能够保证在一个依赖出问题的情况下,不会出现故障传播,导致整体服务失败,这个就是Hystrix需要做的事情。Hystrix提供了熔断、隔离、Fallback、cache、监控等功能,能够在一个、或多个依赖同时出现问题时保证系统依然可用。
本文介绍如何结合上一文,使用Hystrix来实现断路器功能。主要分为以下几个步骤:
- 1.创建项目
- 2.引入依赖
- 3.修改配置文件
- 4.添加启动注解
- 5.注入模板类
- 6.跨服务调用
- 7.启动项目,测试
1.创建项目
新建一个Springboot项目hystrix_ribbon_server1。
2.引入依赖
org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.cloud spring-cloud-starter-netflix-ribbon org.springframework.cloud spring-cloud-starter-netflix-hystrix
org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import
Finchley.SR2
3.修改配置文件
server: port: 8017spring: application: name: hystrix-ribbon-servereureka: client: service-url: defaultZone: http://localhost:8761/eureka/
4.添加启动注解
5.注入模板类
4.5步骤和前文的Ribbon一样。
package com.java4all.hystrix_ribbon_server1;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;import org.springframework.cloud.netflix.hystrix.EnableHystrix;import org.springframework.context.annotation.Bean;import org.springframework.web.client.RestTemplate;@EnableHystrix@EnableEurekaClient@SpringBootApplicationpublic class HystrixRibbonServer1Application { /** * * @Bean : 注入一个名为restTemplate的bean * @LoadBalanced :表明这个 restTemplate 开启了负载均衡的功能 * * */ @Bean @LoadBalanced RestTemplate restTemplate(){return new RestTemplate();} public static void main(String[] args) { SpringApplication.run(HystrixRibbonServer1Application.class, args); }}
6.跨服务调用
写一套简单的业务代码,然后调用前面创建的company-server服务提供的接口。
6.1 controller
@RestController@RequestMapping(value = "hrs")public class HrsController { @Autowired private HrsService hrsService; @GetMapping(value = "getCompany") public String getCompany(String id){ String company = hrsService.getCompany(id); System.out.println(company); return company; }}
6.2 service
public interface RibbonService { String getCompany(String id);}
6.3 serviceImpl
在serviceImpl实现类中,我们引入前面的RestTemplate模板类,来跨服务调用,并开启了负载均衡功能。
在getCompany方法上添加@HystrixCommand注解。该注解对该方法创建了熔断器的功能,并指定了fallbackMethod熔断方法erroCompany,熔断方法直接返回了一个字符串
@Servicepublic class HrsServiceImpl implements HrsService{ //启动类中注入了此模板,并且开启了负载均衡功能 @Autowired RestTemplate restTemplate; //给方法添加熔断器的功能,并指定熔断方法 @HystrixCommand(fallbackMethod = "erroCompany") @Override public String getCompany(String id) { //程序名替代服务地址,ribbon会根据服务名自动选择服务实例 String company = restTemplate .getForObject("http://company-server/company/get?id=" + id, String.class); return company; } /**熔断方法*/ public String erroCompany(String id){ return "服务出错,返回默认企业:"+id; }}
7.启动项目,测试
此时,启动项目,访问http://localhost:8017/hrs/getCompany?id=234,我们这个项目的接口会去调用前面启动的企业服务,由于企业服务启动了两台:8011,8014,那么,通过ribbon负载均衡后,会分发到两台服务上。如下:
当我们把8011挂掉后,此时,由于eureka更新服务列表默认时间为30s,这之间,如果请求落在8011上,那么,就会调用熔断方法,返回指定的结果,如下:下一篇:
完整源码参考:https://github.com/myJava4all/springcloudfinchley转载地址:https://it4all.blog.csdn.net/article/details/84956571 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年04月05日 15时24分44秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Android AsyncTask 异步任务取消
2019-04-30
Asp.net 解决表单提交之后 页面刷新会再次提交表单
2019-04-30
解决js 写入中文乱码
2019-04-30
Java查找Map中的日期时间里当前时间最远
2019-04-30
安装openfire教程
2019-04-30
Android support v7 ActionBarActivity 过时
2019-04-30
Android Studio 导入第三方库
2019-04-30
Sql Server 查询一段日期内的所有礼拜天
2019-04-30
golang testing
2019-04-30
阅读protobuf-go代码
2019-04-30
golang反射基本准则
2019-04-30
2020-11-30-golang并发模式context
2019-04-30
知名定律摘要-持续更新
2019-04-30
golang value part
2019-04-30
shader入门精要3
2019-04-30
刷一下leetcode算法题,寻找两个正序数组的中位数
2019-04-30
2021-03-12
2019-04-30
戴森球计划这个游戏牛逼
2019-04-30
Redis 学习part one
2019-04-30