Feign是什么?
Feign
是一个申明性REST
客户端Feign
使得Web
服务客户端的写入更加方便 要使用Feign
创建一个界面并对其进行注释。它具有可插入注释支持,包括Feign
注释和JAX-RS
注释。Feign
还支持可插拔编码器和解码器。Spring Cloud
增加了对Spring MVC
注释的支持,并使用Spring Web
中默认使用的HttpMessageConverters
。Spring Cloud
集成Ribbon
和Eureka
以在使用Feign
时提供负载均衡的http
客户端。
Feign是一个声明式的Web服务客户端,使得编写Web服务客户端变得非常容易,只需要创建一个接口,然后在上面添加注解即可
Feign能干什么?
Feign
旨在使编写Java Http
客户端变得更容易。- 前面在使用
Ribbon+RestTemplate
时,利用RestTemplate
对HTTP
请求的封装处理,形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。可以发现RestTemplate
的调用方法如果对于一个服务在多个微服务间调用时代码十分累赘。
// RestTemplate 调用方法
private static final String REST_URL_PREFIX = "http://MICROSERVICECLOUD-USER";
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/add")
public String add(User user){
return restTemplate.postForObject(REST_URL_PREFIX + "/user/add",user,String.class);
}
Feign
在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在Feign
的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是Dao
接口上面标注Mapper
注解,现在是一个微服务接口上面标注一个Feign
注解即可),即可完成对服务提供方的接口绑定,简化了使用Spring cloud Ribbon
时,自动封装服务调用客户端的开发量。
使用Feign调用微服务
构建工程
延续前面的User
的例子,模仿microservice-cloud-consumer-user-8002
构建工程microservice-cloud-consumer-user-feign-8003
依赖引入
<!-- feign相关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
配置文件
server:
port: 8003
eureka:
client:
register-with-eureka: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
#注意这里使用ribbon实现负载均衡使用的是服务的名字,在eureka管理界面可以看到,Feign在定义接口的时候也会指定服务
MICROSERVICECLOUD-USER:
ribbon:
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
Feign定义接口
/**
* @version Version: 1.0
* @date DateTime: 2018/09/12 19:47:00<br/>
*/
//向哪个微服务进行面向接口feign的编码
@FeignClient(value = "MICROSERVICECLOUD-USER")
public interface UserService {
@RequestMapping(value = "/user/add",method = RequestMethod.POST)
String add(User user);
@RequestMapping(value="/user/get/{name}",method=RequestMethod.GET)
User get(@PathVariable("name") String name);
@RequestMapping(value="/user/list",method=RequestMethod.GET)
List<User> list();
@RequestMapping(value = "/user/discovery",method = RequestMethod.GET)
List<ServiceInstance> discover();
}
启动类配置@EnableFeignClients
启动类不要忘记配置@EnableFeignClients
注解,否则启动会报错。
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class UserConsumer8003App {
public static void main(String[] args) {
SpringApplication.run(UserConsumer8003App.class,args);
}
}
创建Controller调用Feign服务
可以看到定义好接口后我们就能调用,而不用使用RestTemplate
还需要各种拼接,Feign
调用也非常简洁明了。
/**
* @version Version: 1.0
* @date DateTime: 2018/08/15 20:57:00<br/>
*/
@RestController
@RequestMapping("/consumer/user")
public class UserControllerConsumer {
@Autowired
private UserService userService;
@RequestMapping("/add")
public String add(User user){
return userService.add(user);
}
@RequestMapping("/get/{name}")
public User get(@PathVariable("name") String name){
return userService.get(name);
}
@RequestMapping("/list")
public List<User> list(){
return userService.list();
}
}
ribbon负载均衡
这里需要注意的是Ribbon
负载均衡可以直接在配置文件中配置,可以使用系统提供的7中负载均衡算法,也可以自定义。自定义负载均衡规则可参考上篇。
#注意这里使用ribbon实现负载均衡使用的是服务的名字,在eureka管理界面可以看到,Feign在定义接口的时候也会指定服务
MICROSERVICECLOUD-USER:
ribbon:
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
完成以上代码后成功运行后就能正常访问接口了。
本文由 zealzhangz 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2018/09/15 14:42