Feign Hystrix

1、Feign整合Hystrix

  • 添加依赖
  • 编写接口与实现回退

1.1、调用者引入依赖

<!-- Feign -->
<dependency>
    <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency>

1.2、启动类使用注解

package com.atm.cloud;

import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.feign.EnableFeignClients; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @SpringBootApplication @EnableEurekaClient @EnableCircuitBreaker//打开Hystrix断路器 @ServletComponentScan//扫描缓存 @EnableFeignClients//打开Feign注解 public class HystrixInvokerApp { @Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } public static void main(String[] args) { new SpringApplicationBuilder(HystrixInvokerApp.class).web(true).run( args); } } 

1.3、新建Feign接口(测试回退)

1.3.1、回顾服务提供者MyRestController

  • 去调用服务提供者的接口,以下代码是服务提供者的接口代码
package com.atm.cloud;

import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; @RestController public class MyRestController { @RequestMapping(value = "/person/{personId}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public Person findPerson(@PathVariable("personId") Integer personId) { Person person = new Person(); person.setId(personId); person.setAge(18); person.setName("atm"); return person; } @GetMapping("/hello") @ResponseBody public String sayHello(){ return "Hello World!"; } } 

1.3.2、回顾服务调用者HelloClient

package com.atm.cloud.feignCtr; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @FeignClient("atm-eureka-hystrix-provider") public interface HelloClient { @RequestMapping(method=RequestMethod.GET,value="/hello") String sayHello(); } 

1.3.3、回顾服务调用者FeignController

package com.atm.cloud.feignCtr; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController public class FeignController { @Autowired private HelloClient helloClient; @RequestMapping(value = "ivHello", method = RequestMethod.GET) public String ivHello() { return helloClient.sayHello(); } } 

1.3.4、修改application.yml

server:
 port: 9000
spring:
 application:
  name: atm-eureka-hystrix-invoker
##开启feign开关
feign:
  hystrix:
    enabled: true
eureka:
 client: serviceUrl: defaultZone: http://localhost:8761/eureka/

1.3.5、新增HelloClientFallBack

package com.atm.cloud.feignCtr;

import org.springframework.stereotype.Component;

//HelloClient类去Spring容器中寻找HelloClientFallBack
//所以添加注解Component
@Component public class HelloClientFallBack implements HelloClient { public String sayHello() { return "fallBack Hello"; } } 

1.3.6、修改HelloClient

package com.atm.cloud.feignCtr; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; //当HellClien访问atm-eureka-hystrix-provider失败时,需要有一个后备服务 //后备服务需要实现该接口 @FeignClient(name = "atm-eureka-hystrix-provider", fallback = HelloClientFallBack.class) public interface HelloClient { @RequestMapping(method = RequestMethod.GET, value = "/hello") String sayHello(); } 

1.4、测试断路器

  • 断路器打开的要求

    1. 10秒内连续20个同样的请求
    2. 失败率过50%
  • 断路器关闭

    1. 休眠期5分钟
    2. 5分钟后尝试请求,请求成功则关闭

1.4.1、服务提供者MyRestController

package com.atm.cloud;

import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; @RestController public class MyRestController { @GetMapping("/tmhello") @ResponseBody public String timeOutHello() throws InterruptedException { // 此方法处理最少需要1s Thread.sleep(1000); return "TimeOut Hello"; } } 

1.4.2、服务调用者HelloClient

package com.atm.cloud.feignCtr; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; //当HellClien访问atm-eureka-hystrix-provider失败时,需要有一个后备服务 //后备服务需要实现该接口 @FeignClient(name = "atm-eureka-hystrix-provider", fallback = HelloClientFallBack.class) public interface HelloClient { @RequestMapping(method = RequestMethod.GET, value = "/tmhello") String toHello(); } 
package com.atm.cloud.feignCtr;

import org.springframework.stereotype.Component;

@Component
public class HelloClientFallBack implements HelloClient { public String toHello() { return "fallBack timeOut Hello"; } } 

1.4.3、服务调用者FeignController

package com.atm.cloud.feignCtr; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import com.netflix.hystrix.HystrixCircuitBreaker; import com.netflix.hystrix.HystrixCommandKey; @RestController public class FeignController { @Autowired private HelloClient helloClient; @RequestMapping(value = "tmHello", method = RequestMethod.GET) public String tmHello() { String result = helloClient.toHello(); HystrixCircuitBreaker breaker = HystrixCircuitBreaker.Factory .getInstance(HystrixCommandKey.Factory .asKey("HelloClient#toHello()")); System.out.println("断路器状态:" + breaker.isOpen()); return result; } } 

1.4.4、服务调用者application.yml

server:
 port: 9000
spring:
 application:
  name: atm-eureka-hystrix-invoker
feign:
  hystrix:
    enabled: true
hystrix: command: ##全局方法使用default HelloClient#toHello(): execution: isolation: thread: ##超时时间 timeoutInMilliseconds: 500 circuitBreaker: ##每秒3次请求 requestVolumeThreshold: 3 eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/

1.4.5、服务调用者HttpClientMain

package com.atm.cloud.feignCtr; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; public class HttpClientMain { public static void main(String[] args) throws Exception{ final CloseableHttpClient httpclient = HttpClients.createDefault(); final String url = "http://localhost:9000/tmHello"; for(int i = 0; i < 6; i++) { Thread t = new Thread() { @Override public void run() { try { HttpGet httpget = new HttpGet(url); HttpResponse response = httpclient.execute(httpget); System.out.println(EntityUtils.toString(response.getEntity())); } catch (Exception e ) { e.printStackTrace(); } } }; t.start(); } Thread.sleep(15000); } } 

1.5、Hystrix监控

  • 客户端被监控
  • 谁去监控客户端,一般由其他项目监控,这里新建一个maven项目进行监控

1.5.1、服务提供者引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <version>1.5.3.RELEASE</version> </dependency>

1.5.2、监控引入依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.atm.cloud</groupId> <artifactId>atm_eureka_hystrix_visit</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>atm_eureka_hystrix_visit Maven Webapp</name> <url>http://maven.apache.org</url> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <version>1.5.3.RELEASE</version> </dependency> </dependencies> <build> <finalName>atm_eureka_hystrix_visit</finalName> </build> </project> 

1.5.3、监控启动

  • 监控服务调用者
package com.atm.cloud;

import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard; @SpringBootApplication @EnableHystrixDashboard public class HystrixVisitApp { public static void main(String[] args) { new SpringApplicationBuilder(HystrixVisitApp.class).properties( "server.port=8082").run(args); } }

  • 执行HttpClientMain

猜你喜欢

转载自www.cnblogs.com/jtlgb/p/9358315.html
今日推荐