5分时时彩电脑版_Spring Cloud系列文,Feign整合Ribbon和Hysrix
- 时间:
- 浏览:0
- 来源:冷类技术网_提供小高技术网技术_QQ资源网资讯
在本博客完后 的Spring Cloud系列里,朋友 讲述了Feign的基本用法,这里朋友 将讲述下Feign整合Ribbon实现负载均衡以及整合Hystrix实现断路保护效果的土法律最好的办法。
1 准备Eureka服务器以及多个服务提供者
这里,朋友 将重用完后 博文里讲过的案例,提供的1个 (即主从)Eureka服务项目以及1个 服务提供者的项目。后来在此基础上,在服务调用者的项目中,通过Feign以负载均衡的土法律最好的办法调用1个 服务提供者所提供的sayHello土法律最好的办法。
2 在客户端引入Ribbon
在FeignDemo-ServiceCaller项目里开发Fegin整合Ribbon,具体的步骤如下。
在pom.xml中,引入Ribbon依赖包,关键代码如下。
1 <dependency> 2 <groupId>org.springframework.cloud</groupId> 3 <artifactId>spring-cloud-ribbon</artifactId> 4 </dependency>
在ControllerForFeignRibbon.java中,编写Feign以Ribbon负载均衡的土法律最好的办法调用服务的代码。
//省略必要的package和import的代码 //这和Ribbon Provider中的applicationname一致 @FeignClient(value = "sayHelloAvoidCopy") interface FeignClientRibbonTool{ @RequestMapping(method = RequestMethod.GET, value = "/sayHello/{username}/avoidCopy") String sayHelloAsRibbon(@PathVariable("username") String username); } @RestController public class ControllerForFeignRibbon { private FeignClientRibbonTool tool; @RequestMapping(value = "/callHelloAsRibbon/{username}", method = RequestMethod.GET) public String callHelloAsRibbon(@PathVariable("username") String username) { return tool.sayHelloAsRibbon(username); } }
在上述代码里,,朋友 定义了一1个 名为FeignClientRibbonTool的接口;在第3行中,朋友 通过@FeignClient注解指定了该Feign接口不可能 调用名为sayHello的服务。请注意,这里的sayHello命名时要和EurekaRibbonDemo-ServiceProviderOne等项目中application.yml中的相应配置一致。
在第10行中,朋友 通过@RestController注解定义了一1个 名为ControllerForFeignRibbon的控制器类,在其中的第14行的callHelloAsRibbon中,朋友 是通过Feign接口中的sayHelloAsRibbon土法律最好的办法调用服务的。
在application.yml中,编写Ribbon的相关配置信息,关键代码如下。
1 sayHello: 2 ribbon: 3 listOfServer: http://localhost:1111/,http://localhost:2222/,http://localhost:3333 4 ConnectionsTimeout: 50000 5 ribbon: 6 ConnectionsTimeout: 5000
在第1~4行,朋友 通过配置指定了基于ribbon的多台服务器,它们将以负载均衡的土法律最好的办法承担请求url,因此 还指定了连接超时的时间。从第1行朋友 能想看 ,你某些配置是针对sayHello你某些服务实例的。而在第5行和第6行,朋友 配置了全局性的ribbon属性,这里也配置了连接超时时间。
完成开发后,启动定义在表6.2中的两台Eureka服务器、三台服务提供者和一台服务调用者应用程序后,在浏览器中多次输入http://localhost:500500/callHelloAsRibbon/Peter以调用服务,这时朋友 能想看 有如下输出。从输出结果来看,朋友 以Feign的形式调用的请求确实被均衡地转发到3台服务提供者的机器上。
1 Hello Ribbon, there are Server1, my name is:Peter
2 Hello Ribbon, there are Server2, my name is:Peter
3 Hello Ribbon, there are Server3, my name is:Peter
这里朋友 来总结一下Feign整合Ribbon的要点。
第一,多个服务器提供者的实例名应当一致,比如这里全部总要sayHello。
第二,在Feign的接口中,是通过@FeignClient的注解调用服务提供者的土法律最好的办法的。
第三,这里朋友 是在application.yml配置文件中指定Ribbon的各种参数,也还还可以 通过@Configuration注解在Java文件中配置Ribbon的参数。
3 在客户端引入Hystrix(Feigh整合Hystrix)
在通过Feign调用服务时,同样没办法保证服务一定可用,为了提升客户体验,这还还可以 能通过引入Hystrix对访问请求进行“容错保护”。
在FeignDemo-ServiceCaller的pom.xml中,增加Hystrix的依赖包,关键代码如下。
1 <dependency> 2 <groupId>org.springframework.cloud</groupId> 3 <artifactId>spring-cloud-hystrix</artifactId> 4 </dependency>
还是在FeignDemo-ServiceCaller项目的application.yml配置文件中,通过如下配置项启动Hystrix模式,关键代码如下。
1 feign: 2 hystrix: 3 enabled: true
此外,还还还可以 通过如下代码配置针对sayHelloServiceProvider服务的hystrix参数。其中,第3行指定了hystrix所作用的服务名,第7行指定了请求时间一旦超过50000毫秒(也可是 1秒),就会启动熔断模式,调用定义在回退土法律最好的办法中的业务动作。
1 hystrix: 2 command: 3 sayHelloServiceProvider: 4 execution: 5 isolations: 6 threads: 7 timeoutInMilliseconds: 50000
在启动类ServiceCallerApp.java中,增加启动hystrix断路器的注解,如第5行所示,你某些类的关键代码如下。
1 //省略必要的package和import土法律最好的办法 2 EnableFeignClients 3 @EnableDiscoveryClient 4 @SpringBootApplication 5 @EnableCircuitBreakers 6 public class ServiceCallerApp 7 { 8 //省略某些代码 9 }
新建一1个 名为ControllerForFeignHystrix.java的控制器类,代码如下。
1 //省略必要的package和import代码 2 @FeignClient(value = "sayHelloServiceProvider",fallback=FeignClientHystrixToolFallback.class) 3 interface FeignClientHystrixTool{ 4 @RequestMapping(method = RequestMethod.GET, value = "/hello/{name}") 5 String sayHelloInClient(@RequestParam("name") String name); 6 }
在第3行中,朋友 定义了一1个 名为FeignClientHystrixTool的接口;在第2行的注解中,朋友 定义了它将以Feign的形式调用sayHelloServiceProvider中的服务,因此 通过fallback配置指定一旦出先调用异常,将调用FeignClientHystrixToolFallback类中的回退土法律最好的办法。
7 @Component 8 class FeignClientHystrixToolFallback implements FeignClientHystrixTool{ 9 public String sayHelloInClient(String name) 10 { return "In Fallback Function."; } 11 }
在第8行的FeignClientHystrixToolFallback类中,朋友 将定义针对FeignClientHystrixTool接口的回退土法律最好的办法。
注意该类时要和第2行中fallback指定的类同名,因此 ,该类时要实现(implements)FeignClientHystrixTool接口,在其中的sayHelloInClient土法律最好的办法中定义了回退动作,这里的动作是打印语句。
12 @RestController 13 public class ControllerForFeignHystrix { 14 @Autowired 15 private FeignClientHystrixTool tool; 16 @RequestMapping(value = "/callHelloAsHystrix/{username}", method = RequestMethod.GET) 17 public String callHelloAsHystrix(@PathVariable("username") String username) 18 { return tool.sayHelloInClient(username);} 19 }
在第13行中,朋友 定义了一1个 含有@RestController注解的控制器类ControllerForFeignHystrix,在其中第17行的callHelloAsHystrix土法律最好的办法中,朋友 是以Feign的形式调用sayHelloInClient土法律最好的办法的。
至此,完成代码的编写工作。朋友 依次启动FeignDemo-Server、FeignDemo-ServiceProvider和FeignDemo-ServiceCaller项目,后来在浏览器中输入http://localhost:500500/callHelloAsHystrix/Peter,此时能想看 “hello Peter”的输出,你某些是正常的调用流程。
不可能 朋友 关闭FeignDemo-ServiceProvider项目,也可是 说sayHelloServiceProvider服务不可用了,不可能 再次在浏览器中输入http://localhost:500500/callHelloAsHystrix/Peter,此时就会走熔断保护的流程,触发FeignClientHystrixToolFallback 类中的sayHelloInClient土法律最好的办法,在浏览器中输出“In Fallback Function“的字样。
本文谢绝转载,不可能 要代码,请和作者联系。Spring Cloud相关博文如下: