标签:创建 hle mic 重要 template 支付 ice 完全 api
经过前文讲解,我们已使用Eureka实现服务发现;使用Ribbon实现了负载均衡这种听起来很高端的东西。我们的架构已经初具雏形,但依然存在很多问题,下面不妨来分析下前文的代码——@GetMapping("/users/{id}")
public User findById(@PathVariable Long id) {
// 这里用到了RestTemplate的占位符能力
User user = this.restTemplate.getForObject(
"http://microservice-provider-user/users/{id}",
User.class,
id
);
// ...电影微服务的业务...
return user;
}
这里,this.restTemplate.getForObject("http://microservice-provider-user/users/{id}"…
这行代码是比较糟糕的,存在诸多问题——
https://www.baidu.com/s?wd=asf&rsv_spt=1&rsv_iqid=0xa25bbeba000047fd&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=3&rsv_sug1=2&rsv_sug7=100&rsv_sug2=0&inputT=328&rsv_sug4=328
,恐怕就有心无力了!尽管RestTemplate支持使用占位符,从而让我们避免字符串拼接的尴尬境地,但构造这么复杂的URL依然是很麻烦的。更可怕的是,互联网时代需求变化非常之快,你的参数可能会从10个变成12个、15个,再后来又精简成13个……维护这个URL真的是想想都累……总而言之,复杂URL的构造会让你处于一种不性福的状态!铺垫了这么多,如何解决以上问题?用Feign!
TIPS
Feign是Netflix开发的声明式、模板化的HTTP客户端,其灵感来自Retrofit、JAXRS-2.0以及WebSocket。Feign可帮助我们更加便捷、优雅地调用HTTP API。
在Spring Cloud中,使用Feign非常简单——只需创建接口,并在接口上添加注解即可。
Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。Spring Cloud对Feign进行了增强,使其支持Spring MVC注解,另外还整合了Ribbon和Eureka,从而使得Feign的使用更加方便。
TIPS
Feign的GitHub:https://github.com/OpenFeign/feign
下面来将前面的例子用Feign改写,让其达到与Ribbon + RestTemplate相同的效果。
复制项目microservice-consumer-movie
,将ArtifactId修改为microservice-consumer-movie-feign
;
加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
加注解:启动类上添加@EnableFeignClients
;
编写Feign Client:
@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient {
@GetMapping("/users/{id}")
User findById(@PathVariable("id") Long id);
}
这样一个Feign Client就写完啦!其中,@FeignClient
注解中的microservice-provider-user
是想要请求服务的名称,这是用来创建Ribbon Client的(Feign整合了Ribbon)。在本例中,由于使用了Eureka,所以Ribbon会把microservice-provider-user
解析成Eureka Server中的服务。
除此之外,还可使用url属性指定请求的URL(URL可以是完整的URL或主机名),例如@FeignClient(name = "abcde", url = "http://localhost:8000/")
。此时,name可以是任意值,但不可省略,否则应用将无法启动!
Controller:
@RequestMapping("/movies")
@RestController
public class MovieController {
@Autowired
private UserFeignClient userFeignClient;
@GetMapping("/users/{id}")
public User findById(@PathVariable Long id) {
return this.userFeignClient.findById(id);
}
}
只需使用@Autowire注解,即可注入上面编写的Feign Client。
相信通过本文的例子,聪明的你对如何使用Feign已经了然于心了。文章的最后,对比一下RestTemplate + Ribbon与Feign。
角度 | RestTemplate + Ribbon | Feign(自带Ribbon) |
---|---|---|
可读性、可维护性 | 欠佳(无法从URL直观了解这个远程调用是干什么的) | 极佳(能在接口上写注释,方法名称也是可读的,能一眼看出这个远程调用是干什么的) |
开发体验 | 欠佳(拼凑URL不性福) | 极佳(写出漂亮的代码,女朋友更爱你了) |
风格一致性 | 欠佳(本地API调用和RestTemplate调用的代码风格截然不同) | 极佳(完全一致,不点开Feign的接口,根本不会察觉这是一个远程调用而非本地API调用) |
性能 | 较好 | 中等(性能是RestTemplate的50%左右;如果为Feign配置连接池,性能可提升15%左右) |
灵活性 | 极佳 | 中等(内置功能能满足大多数项目的需求) |
那么如何选择呢?相信这才是大家最关注的问题!
笔者认为——
http://www.itmuch.com/spring-cloud/finchley-9/
跟我学Spring Cloud(Finchley版)-09-Feign
标签:创建 hle mic 重要 template 支付 ice 完全 api
原文地址:http://blog.51cto.com/10180481/2341369