架构师入门:Spring Cloud系列,Hystrix与Eureka的整合
和Ribbon等组件一样,在项目中,Hystrix一般不会单独出现,而是会和Eureka等组件配套出现。在Hystrix和Eureka整合后的框架里,一般会用到Hystrix的断路器以及合并请求等特性,而在Web框架里,大多会有专门的缓存组件,所以不怎么会用到Hystrix的缓存特性。
1 准备Eureka服务器项目
HystrixEurekaServer项目承担着Eureka服务器的作用,这部分的代码关键点如下。
第一,在pom.xml里,通过如下关键代码引入Eureka服务器组件的依赖包。
1 <dependency>
2 <groupId>org.springframework.cloud</groupId>
3 <artifactId>spring-cloud-starter-eureka-server</artifactId>
4 </dependency>
第二,在application.yml里,指定了本项目的主机名和端口号,并指定了对外提供eureka服务的Url路径,代码如下。
1 server:
2 port: 8888
3 eureka:
4 instance:
5 hostname: localhost
6 client:
7 register-with-eureka: false
8 fetch-registry: false
9 serviceUrl:
10 defaultZone: http://localhost:8888/eureka/
第三,在ServerStarter.java里,编写启动Eureka服务的代码,这里请注意,在第2和第3行里,通过注解声明了本类是Eureka服务器的启动类。
1 //省略必要的package和import的代码
2 @EnableEurekaServer
3 @SpringBootApplication
4 public class ServerStarter
5 {
6 public static void main( String[] args )
7 { SpringApplication.run(ServerStarter.class, args); }
}
2 服务提供者的代码结构
HystrixEurekaserviceProvider项目承担着Eureka服务提供者的角色。在pom.xml里,我们除了指定Eureka的依赖包以外,还了指定了Hystrix的依赖包,关键代码如下。其中,前4行指定的是Eureka的依赖包,后4行指定的是Hystrix的依赖包。
1 <dependency>
2 <groupId>org.springframework.cloud</groupId>
3 <artifactId>spring-cloud-starter-eureka</artifactId>
4 </dependency>
5 <dependency>
6 <groupId>org.springframework.cloud</groupId>
7 <artifactId>spring-cloud-starter-hystrix</artifactId>
8 </dependency>
而在application.yml里,指定了本项目的服务端口是1111,对外提供的项目名是hystrixEureka,以及是向第一部分指定的Eureka服务器注册,代码如下。
1 server:
2 port: 1111
3 spring:
4 application:
5 name: hystrixEureka
6 eureka:
7 client:
8 serviceUrl:
9 defaultZone: http://localhost:8888/eureka/
3 在服务提供者项目里引入断路器机制
在服务提供者的启动类ServiceProviderApp.java里,我们是通过加入@EnableCircuitBreaker注解来启动断路器,代码如下。
1 //省略必要的package和import代码
2 @SpringBootApplication
3 @EnableEurekaClient
4 @EnableCircuitBreaker
5 @ServletComponentScan
6 public class ServiceProviderApp
7 {
8 public static void main( String[] args )
9 { SpringApplication.run(ServiceProviderApp.class, args); }
10 }
在Controller.java这个控制器类里,我们是在第9行里,通过调用service类提供的方法来返回具体的OrderDetail信息,代码如下。
1 //省略必要的package和import代码
2 @RestController
3 public class Controller {
4 @Autowired
5 private OrderDetailService service;
6 //对外提供服务的getOrderDetailById方法
7 @RequestMapping(value = "/getOrderDetailById/{orderId}", method = RequestMethod.GET)
8 public OrderDetail getOrderDetailById(@PathVariable("orderId") String orderId) throws Exception {
9 return service.getOrderDetailByID(orderId);
10 }
11 }
在OrderDetailService.java里,我们用HashMap这个数据结构来模拟数据库,以此来模拟从数据库读OrderDetail的方式,提供了“根据ID找相应对象的服务”,代码如下。
1 //省略必要的package和import代码
2 @Service
3 public class OrderDetailService {
4 static HashMap<String,String> orderDB = new HashMap<String,String> ();
5 static //通过static代码,模拟数据库中存储的OrderDetail信息
6 {
7 orderDB.put("1","Peter");
8 orderDB.put("2","Tom");
9 orderDB.put("3","Mike");
10 }
11 //在方法之前,通过注解引入Hystrix,并指定回退方法
12 @HystrixCommand(fallbackMethod = "getFallback")
13 public OrderDetail getOrderDetailByID(String id) throws Exception
14 {
15 OrderDetail orderDetail = new OrderDetail();
16 if("error".equals(id) ) //如果输入是error,则故意抛出异常
17 {throw new Exception(); }
18 //模拟地从数据库里得到信息并返回
19 orderDetail.setOrderId(id);
20 orderDetail.setOrderOwner(orderDB.get(id));
21 return orderDetail;
22 }
23 //定义Hystrix的回退方法
24 public OrderDetail getFallback(String orderId) {
25 OrderDetail orderDetail = new OrderDetail();
26 orderDetail.setOrderId("error");
27 orderDetail.setOrderOwner("error");
28 System.out.println("In fallbackForOrderDetail function");
29 return orderDetail;
30 }
31 }
在第13行的getOrderDetailByID方法之前,我们在第12行通过fallbackMethod定义了回退方法,在这个方法的第16行里,我们定义了如果输入是error,那么则将抛出异常,以此触发回退方法getFallback。而在第24行定义的回退方法里,我们将返回一个ID和Owner都是error的OrderDetail对象。本类用到的OrderDetail模型类定义如下。
1 public class OrderDetail{
2 private String orderId;//订单id
3 private String orderOwner; //订单所有人
4 //省略必要的get和set方法
5 }
至此我们完成了开发工作,启动HystrixEurekaServer和HystrixEurekaserviceProvider后,如果在浏览器中输入http://localhost:1111/getOrderDetailById/1,能看到如下的输出,这说明走的是正常的流程。
{"orderId":"1","orderOwner":"Peter"}
但如果输入的是http://localhost:1111/getOrderDetailById/error,那么会在OrderDetailService类的getOrderDetailByID方法里抛出异常,从而走Hystrix的回退流程,由此会输入如下的语句。
{"orderId":"error","orderOwner":"error"}
在这个案例中,我们是在“提供者服务”的模块引入hytrix断路器,而不是在“服务调用”模块,这和项目中的常规做法相符,因为启动断路器的场景一般是“提供服务模块的流量超载”。
本人之前写的和本文有关的Spring Cloud其它相关文章。
架构师入门:Spring Cloud系列,Hystrix与Eureka的整合的更多相关文章
- 架构师系列文:通过Spring Cloud组件Hystrix合并请求
在前文里,我们讲述了通过Hystrix进行容错处理的方式,这里我们将讲述通过Hystrix合并请求的方式 哪怕一个URL请求调用的功能再简单,Web应用服务都至少会开启一个线程来提供服务,换句话说,有 ...
- Spring Cloud微服务系列文,Hystrix与Eureka的整合
和Ribbon等组件一样,在项目中,Hystrix一般不会单独出现,而是会和Eureka等组件配套出现.在Hystrix和Eureka整合后的框架里,一般会用到Hystrix的断路器以及合并请求等特性 ...
- Spring Cloud 系列之 Netflix Hystrix 服务监控
Actuator Hystrix 除了可以实现服务容错之外,还提供了近乎实时的监控功能,将服务执行结果和运行指标,请求数量成功数量等等这些状态通过 Actuator 进行收集,然后访问 /actuat ...
- Spring Cloud系列文,Feign整合Ribbon和Hysrix
在本博客之前的Spring Cloud系列里,我们讲述了Feign的基本用法,这里我们将讲述下Feign整合Ribbon实现负载均衡以及整合Hystrix实现断路保护效果的方式. 1 准备Eureka ...
- 架构师入门:搭建双注册中心的高可用Eureka架构(基于项目实战)
本文的案例是基于 架构师入门:搭建基本的Eureka架构(从项目里抽取) 改写的. 在上文里,我们演示Eureka客户端调用服务的整个流程,在这部分里我们将在架构上有所改进.大家可以想象下,在上文里案 ...
- Spring Cloud系列(二) 介绍
Spring Cloud系列(一) 介绍 Spring Cloud是基于Spring Boot实现的微服务架构开发工具.它为微服务架构中涉及的配置管理.服务治理.断路器.智能路由.微代理.控制总线.全 ...
- Spring Cloud 系列之 Netflix Zuul 服务网关
什么是 Zuul Zuul 是从设备和网站到应用程序后端的所有请求的前门.作为边缘服务应用程序,Zuul 旨在实现动态路由,监视,弹性和安全性.Zuul 包含了对请求的路由和过滤两个最主要的功能. Z ...
- Spring Cloud 系列之 Dubbo RPC 通信
Dubbo 介绍 官网:http://dubbo.apache.org/zh-cn/ Github:https://github.com/apache/dubbo 2018 年 2 月 15 日,阿里 ...
- Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇
Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇 本文主要内容: 1:spring cloud整合Eureka总结 本文是由凯哥(凯哥Java:kagejava ...
随机推荐
- Django+Bootstrap+Mysql 搭建个人博客(六)
6.1.comments插件 (1)安装 pip install django-contrib-comments (02)settings INSTALLED_APPS = [ 'django.con ...
- Maven常识
maven下面通常有四个文件夹: src/main/java -- 用来存放业务代码 src/test/java -- 用来存放测试代码 另有两个名为resource的文件夹,通常用来放置前两个文件夹 ...
- SQL Server 中如何做到连续时间段的拆分?
今天在工作中遇到了一个很实际的问题,客户在OA接口的员工休假中间表中提供了连续时间段的休假记录,例如: 张三,2018-12-1 ~2018-12-31 ,病假,31天.这样带来的问题是,如果我需要统 ...
- common-pool2连接池详解与使用
我们在服务器开发的过程中,往往会有一些对象,它的创建和初始化需要的时间比较长,比如数据库连接,网络IO,大数据对象等.在大量使用这些对象时,如果不采用一些技术优化,就会造成一些不可忽略的性能影响.一种 ...
- Java编程思想 - 并发
前言 Q: 为什么学习并发? A: 到目前为止,你学到的都是有关顺序编程的知识,即程序中的所有事物在任意时刻都只能执行一个步骤. A: 编程问题中相当大的一部分都可以通过使用顺序编程来解决,然而,对于 ...
- SpringBoot进阶教程(二十五)整合Redis之@Cacheable、@CachePut、@CacheEvict的应用
在上一篇文章(<SpringBoot(二十四)整合Redis>)中,已经实现了Spring Boot对Redis的整合,既然已经讲到Cache了,今天就介绍介绍缓存注解.各家互联网产品现在 ...
- 目标检测之R-CNN系列
Object Detection,在给定的图像中,找到目标图像的位置,并标注出来. 或者是,图像中有那些目标,目标的位置在那.这个目标,是限定在数据集中包含的目标种类,比如数据集中有两种目标:狗,猫. ...
- Git协同工作流介绍
git相关的文章和教程非常多,但是系统介绍和了解工作流的人并不多,在使用过程中用错或用偏的也不少,这里分享的是,假设你已经入门的情况下,我们如何去选择适合团队需要的工作流. git优势 这里先唠叨gi ...
- asp.net core 系列之并发冲突
本文介绍如何处理多个用户并发更新同一实体(同时)时出现的冲突 . 主要是两种:一种,检查属性并发冲突,使用 [ConcurrencyCheck] ;另一种,检测行的并发冲突,使用 rowversion ...
- JQuery --- 第二期 (jQuery属性操作)
个人学习笔记 1.JQuery的内容选择器 <!DOCTYPE html> <html lang="en"> <head> <meta c ...