本文节选自《疯狂Spring Cloud微服务架构实战》html
京东购买地址:https://item.jd.com/12256011.htmljava
当当网购买地址:http://product.dangdang.com/25201393.htmlgit
Spring Cloud教学视频:https://my.oschina.net/JavaLaw/blog/1552993spring
Spring Cloud电子书:https://my.oschina.net/JavaLaw/blog/1570383浏览器
前面讲解了Feign的使用,在了解如何单独使用Feign后,再学习Spring Cloud中使用Feign,将会有很是大的帮助。虽然Spring Cloud对Feign进行了封装,但万变不离其宗,只要了解其内在原理,使用起来就能够驾轻就熟。服务器
在开始本小节前,先准备Spring Cloud的测试项目。测试案例主要有如下三个项目:架构
为服务调用者(spring-feign-invoker)的pom.xml文件加入如下依赖:app
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency>
在服务调用者的启动类中,打开Feign开关,请见代码清单5-18。负载均衡
代码清单5-18:框架
codes\05\5.3\spring-feign-invoker\src\main\java\org\crazyit\cloud\InvokerApplication.java
@SpringBootApplication @EnableEurekaClient @EnableFeignClients public class InvokerApplication { public static void main(String[] args) { SpringApplication.run(InvokerApplication.class, args); } }
接下来,编写客户端接口,与直接使用Feign相似,代码清单5-19为服务端接口。
代码清单5-19:
codes\05\5.3\spring-feign-invoker\src\main\java\org\crazyit\cloud\PersonClient.java
@FeignClient("spring-feign-provider") //声明调用的服务名称 public interface PersonClient { @RequestMapping(method = RequestMethod.GET, value = "/hello") String hello(); }
与单独使用Fiegn不一样的是,接口使用了@FeignClient注解来修饰,而且声明了须要调用的服务名称,本例的服务提供者名称为“spring-feign-provider”。另外,接口方法使用了@RequestMapping来修饰,根据5.2.7章节可知,经过编写“翻译器(Contract)”,可让Feign知道第三方注解的含义,Spring Cloud也提供翻译器,会将@RequestMapping注解的含义告知Feign,所以咱们的服务接口就能够直接使用该注解。
除了方法的@RequestMapping注解外,默认还支持@RequestParam、@RequestHeader、@PathVariable这3个参数注解,也就是说,在定义方法时,可使用方式定义参数:
@RequestMapping(method = RequestMethod.GET, value = "/hello/{name}") String hello(@PathVariable("name") String name);
须要注意的是,使用了Spring Cloud的“翻译器”后,将不能再使用Feign的默认注解。接下来,在控制器中调用接口方法,请见代码清单是5-20。
代码清单5-20:
codes\05\5.3\spring-feign-invoker\src\main\java\org\crazyit\cloud\InvokerController.java
@RestController @Configuration public class InvokerController { @Autowired private PersonClient personClient; @RequestMapping(value = "/invokeHello", method = RequestMethod.GET) public String invokeHello() { return personClient.hello(); } }
在控制器中,为其注入了PersonClient的bean,不难看出,客户端实例的建立及维护,Spring容器都帮咱们实现了。查看本例的效果,请按如下步骤操做:
在前面章节,咱们尝试过编写自定义的Feign客户端,在Spring Cloud中,一样提供了自定义的Feign客户端。可能你们已经猜到,若是结合Ribbon使用,Spring Cloud所提供的客户端,会拥有负载均衡的功能。
Spring Cloud实现的Feign客户端,类名为LoadBalancerFeignClient,在该类中,维护着与SpringClientFactory相关的实例,经过SpringClientFactory能够获取负载均衡器,负载均衡器会根据必定的规则来选取处理请求的服务器,最终实现负载均衡的功能。接下来,调用“服务提供者”的“/person/{personId}”服务来测试负载均衡。为客户端接口添加内容,请见代码清单5-21。
代码清单5-21:
codes\05\5.3\spring-feign-invoker\src\main\java\org\crazyit\cloud\PersonClient.java
@RequestMapping(method = RequestMethod.GET, value = "/person/{personId}") Person getPerson(@PathVariable("personId") Integer personId);
为“服务调用者”的控制器添加方法,请见代码清单5-22。
代码清单5-22:
@RequestMapping(value = "/router", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public String router() { // 调用服务提供者的接口 Person p = personClient.getPerson(2); return p.getMessage(); }
运行“服务调用者”,在浏览器中输入:http://localhost:9000/router,进行刷新,能够看到8080与8081端口被循环调用。
Spring Cloud为Feign的使用提供了各类默认属性,例如前面讲到的“注解翻译器(Contract)”、Feign客户端,默认状况下,Spring将会为Feign的属性提供了如下的Bean:
通常状况下,Spring提供的这些Bean已经足够咱们使用,若是有些更特殊的需求,能够实现本身的Bean,请见后面章节。
本文节选自《疯狂Spring Cloud微服务架构实战》
Spring Cloud教学视频:https://my.oschina.net/JavaLaw/blog/1552993
Spring Cloud电子书:https://my.oschina.net/JavaLaw/blog/1570383
本书代码共享地址:https://gitee.com/yangenxiong/SpringCloud