Spring Cloud知识整理(一)
2018-08-02 本文已影响33人
AaronSimon
一、声明式调用Feign
1、Feign请求参数说明
Feign是Netflix的产品,Spring Cloud Feign是在原生Feign的基础上进行了封装。由于Spring Cloud Feign引入了许多springmvc的注解,方便springmvc的使用者使用,但同时也给使用者带来了很大的混淆,下面我们简单讲解一下springmvc和Spring Cloud Feign的参数绑定机制。
1.1 SpringMVC请求参数绑定机制
我们通过下面的例子进行讲解:
@RestController
public class demoController{
@RequestMapping("hello")
public String hello(String name){
return "hello"+name;
}
}
虽然接口很简单,但是SpringMVC在解析请求时为做了很多的事情
-
@RequestMapping
指定请求的路径映射,我们GET,POST,DELETE,PUT的请求都可以映射到这里; - SpringMVC提供的参数注解包括
@RequestParm
,@RequestBody
,@PathVariable
等,在例子中我们的参数name被默认添加@RequestParm
注解,SpringMVC使用字节码技术获取name这个名称,自动检测请求参数中key值为name的参数,如果我们的url请求或者form表单中包含name这个参数,就会被SpringMVC解析到。
1.2 Spring Cloud Feign请求参数绑定机制
SpringMVC的参数绑定机制和Feign的参数绑定机制是不一样的。下面我们看一个错误的接口:
@ResstController
public class demoController{
@RequestMapping(value="hello",method=RequsetMethod.GET)
public String hello(String name){
return "hello"+name;
}
由于我们指定了请求方式GET,那么如果按照SpringMVC的参数绑定机制,name参数会被拼接在URL上,但是接口并未接收到,查看后台日志发现:
- 请求方式不是GET,而是POST
- name 参数为null
经过Google发现Feign的参数绑定机制与SpringMVC不同:
- Feign默认使用
@RequestBody
,这就是上面name参数为null的原因,@RequestBody
(只能有一个)一般用于传递对象,如果参数中出现多个对象可以使用Map来传递对象
@ResstController
public class demoController{
@RequestMapping(value="hello",method=RequsetMethod.GET)
public String hello(@RequestBody Book book){
return "hello"+book.getName();
}
@ResstController
public class demoController{
@RequestMapping(value="hello",method=RequsetMethod.GET)
public String hello(@RequestParm Map map){
return "hello"+map.get("name");
}
- Feign传递name参数,必须添加
@RequestParm('name')
,name必须指定,Feign不会利用SpringMVC字节码的机制自动给定一个默认名称
@ResstController
public class demoController{
@RequestMapping(value="hello",method=RequsetMethod.GET)
public String hello(@RequestParm("name")String name){
return "hello"+name;
}
2、@FeignClient注解与参数
@FeignClient
注解被@Target(ElementType.TYPE)
修饰,表明@FeignClient
注解的作用在接口上
2.1 @FeignClient
标签常用属性
- name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
- decode404:当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException
- configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract
- fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现
@FeignClient
标记的接口 - fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码
- path: 定义当前FeignClient的统一前缀
待续