Spring Cloud如何整合Hystrix

57次阅读
没有评论

共计 4230 个字符,预计需要花费 11 分钟才能阅读完成。

这篇文章给大家分享的是有关 Spring Cloud 如何整合 Hystrix 的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,一起跟随丸趣 TV 小编过来看看吧。

19 Spring Cloud 整合 Hystrix

 Hystrix 主要用于保护调用服务的一方,如果被调用的服务发生故障,符合一定条件,就开启断路器,对调用的程序进行隔离。在开始讲述本章的内容前,先准备测试项目,本章例子所使用的项目如下:

spring-hystrix-server:Eureka 服务器,端口为 8761,代码目录 codes\06\6.4\spring-hystrix-server。

spring-hystrix-provider:服务提供者,本例只需要启动一个实例,端口为 8080,默认提供“/person/{personId}”服务,根据 personId 参数返回一个 Person 实例,另外再提供一个“/hello”服务,返回普通的字符串。代码目录为 codes\06\6.4\spring-hystrix-provider

spring-hystrix-invoker:服务调用者,9000 端口,代码目录 codes\06\6.4\spring-hystrix-invoker。

整合 Hystrix

  为服务调用者(spring-hystrix-invoker)项目添加依赖,添加后的依赖如下:

dependency 
  groupId org.springframework.cloud /groupId 
  artifactId spring-cloud-starter-config /artifactId 
 /dependency 
 dependency 
  groupId org.springframework.cloud /groupId 
  artifactId spring-cloud-starter-eureka /artifactId 
 /dependency 
 dependency 
  groupId org.springframework.cloud /groupId 
  artifactId spring-cloud-starter-ribbon /artifactId 
 /dependency 
 dependency 
  groupId org.springframework.cloud /groupId 
  artifactId spring-cloud-starter-hystrix /artifactId 
 /dependency

  在服务调用者的应用启动类中,加入启用断路器的注解,请见以下代码片断:

@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public class InvokerApplication {
 @LoadBalanced
 @Bean
 public RestTemplate getRestTemplate() { return new RestTemplate();
 }
 public static void main(String[] args) { SpringApplication.run(InvokerApplication.class, args);
 }
}

  新建服务类,在服务方法中调用服务,请见代码清单 6 -17。

  代码清单 6 -17:

 codes\06\6.4\spring-hystrix-invoker\src\main\java\org\crazyit\cloud\PersonService.java

@Component
public class PersonService {
 @Autowired
 private RestTemplate restTemplate;
 @HystrixCommand(fallbackMethod =  getPersonFallback)
 public Person getPerson(Integer id) {
 //  使用 RestTemplate 调用 Eureka 服务
 Person p = restTemplate.getForObject(http://spring-hystrix-provider/person/{personId} ,
 Person.class, id);
 return p;
  *  回退方法,返回一个默认的 Person
  */
 public Person getPersonFallback(Integer id) {Person p = new Person();
 p.setId(0);
 p.setName( Crazyit 
 p.setAge(-1);
 p.setMessage( request error 
 return p;
}

  服务类中注入了 RestTemplate,服务方法使用了 @HystrixCommand 注解进行修饰,并且配置了回退方法。@HystrixCommand 注解由 Hystrix 的“javanica”项目提供,该项目主要是为了简化 Hystrix 的使用。被 @HystrixCommand 修饰的方法,Hystrix(javanica)会使用 AspectJ 对其进行代理,Spring 会将相关的类转换为 Bean 放到容器中,在 Spring Cloud 中,我们无需过多关心 Hystrix 的命令管理。

  接下来,编写控制器,调用服务类的方法,请见代码清单 6 -18。

  代码清单 6 -18:

 codes\06\6.4\spring-hystrix-invoker\src\main\java\org\crazyit\cloud\InvokerController.java

@RestController
@Configuration
public class InvokerController {
 @Autowired
 private PersonService personService;
 @RequestMapping(value =  /router/{personId} , method = RequestMethod.GET, 
 produces = MediaType.APPLICATION_JSON_VALUE)
 public Person router(@PathVariable Integer personId) {Person p = personService.getPerson(personId);
 return p;
}

  控制器实现较为简单,直接注入 PersonService,调用方法即可,按以下步骤启动集群:

  启动“spring-hystrix-server”,本例中配置端口为 8761。

  启动“spring-hystrix-provider”,启动一个实例,端口为 8080。

启动“spring-hystrix-invoker”,端口为 9000。

  打开浏览器访问:http://localhost:9000/router/1,输出如下:

{id :1, name : Crazyit , age :33, message : http://localhost:8080/person/1}

  停止服务提供者(spring-hystrix-provide),即停止 8080 端口,再访问 9000 端口的地址,输出如下:

{id :0, name : Crazyit , age :-1, message : request error}

  根据输出可知,由于调用失败,触发了回退方法。

命令配置

 Spring Cloud 中使用 @HystrixCommand 来声明一个命令,命令的相关配置,也可以在该注解中进行,以下的代码片断,配置了几个属性:

/**
  *  测试配置,对 3 个 key 进行命名
  *  设置命令执行超时时间为 1000 毫秒
  *  设置命令执行的线程池大小为 1
  */
 @HystrixCommand(
 fallbackMethod= testConfigFallback , groupKey= MyGroup , 
 commandKey= MyCommandKey , threadPoolKey= MyCommandPool , 
 commandProperties={
 @HystrixProperty(name =  execution.isolation.thread.timeoutInMilliseconds , 
 value =  1000 )
 }, 
 threadPoolProperties={
 @HystrixProperty(name =  coreSize , 
 value =  1 )
 })

  除了以上的几个配置外,@HystrixCommand 注解还可以使用 ignoreExceptions 来处理异常的传播,请见以下代码片断:

/**
  *  声明了忽略 MyException,如果方法抛出 MyException,则不会触发回退
  */
 @HystrixCommand(ignoreExceptions = {MyException.class}, 
 fallbackMethod= testExceptionFallBack )
 public String testException() {throw new MyException();
 }

 Hystrix 的命令、线程配置较多,由于篇幅所限,本小节仅简单地列举几个,读者可举一反三,按需要进行配置。

默认配置

  对于一些默认的配置,例如命令组的 key 等,可以使用 @DefaultProperties 注解,这样就减少了 @HystrixCommand 注解的代码量。以下代码片断展示如何使用 @DefaultProperties:

@DefaultProperties(groupKey= GroupPersonKey)
public class PersonService {
 @HystrixCommand // group key 将使用“GroupPersonKey”public String hello() {return }

  除了定义 GroupKey 外,还支持 @HystrixCommand 的其余配置,例如线程属性、命令属性等。

感谢各位的阅读!关于“Spring Cloud 如何整合 Hystrix”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计4230字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)