1.加入依赖
org.springframework.cloud spring-cloud-starter-openfeign
2.在启动类上添加注解@EnableFeignClients
- @SpringBootApplication
- @EnableDiscoveryClient
- @EnableFeignClients
- public class OrderApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(OrderApplication.class, args);
- }
-
- @Bean
- @LoadBalanced
- public RestTemplate getRestTemplate() {
- return new RestTemplate();
- }
- }
3.定义接口,并写上注解@FeignClient,value写上服务名称
- @FeignClient(
- value = "service-product",
- //fallback = ProductServiceFallBack.class,
- fallbackFactory = ProductServiceFallBackFactory.class)
- public interface ProductService {
-
- //指定调用提供者的哪个方法
- //@FeignClient+@GetMapping 就是一个完整的请求路径 http://serviceproduct/product/{pid}
- @GetMapping(value = "/product/{pid}")
- Product findByPid(@PathVariable("pid") Integer pid);
- }
4.在任意bean中注入即可使用
| 参数 | 说明 |
| name | 指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现 |
| url | url一般用于调试,可以手动指定@FeignClient调用的地址 |
| decode404 | 当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException |
| configuration | Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract |
| fallback | 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口 |
| fallbackFactory | 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码 |
| path | 定义当前FeignClient的统一前缀,当我们项目中配置了server.context-path,server.servlet-path时使用 |
fallbackFactory使用,定义容错处理,统一处理错误,需要实现 FallbackFactory接口
- @Component
- public class ProductServiceFallBackFactory implements FallbackFactory
{ -
- @Override
- public ProductService create(Throwable throwable) {
- return pid -> {
- throwable.printStackTrace();
- Product product = new Product();
- product.setPid(-1);
- return product;
- };
- }
- }
请求中加入头部信息
1.在定义的fegin接口中的RequestMapping注解加上headers 参数
- @FeignClient(name="custorm",fallback=Hysitx.class)
- public interface IRemoteCallService {
- @RequestMapping(value="/custorm/getTest",method = RequestMethod.POST,
- headers = {"Content-Type=application/json;charset=UTF-8"})
- List
test(@RequestParam("names") String[] names); - }
2.在方法参数前面添加@RequestHeader注解,设置多个参数可以使用Map
- @FeignClient(name="custorm",fallback=Hysitx.class)
- public interface IRemoteCallService {
- @RequestMapping(value="/custorm/getTest",method = RequestMethod.POST)
- List
test(@RequestParam("names") - @RequestHeader("Authorization")
- String[] names);
- }
3.使用@Header注解
- @FeignClient(name="custorm",fallback=Hysitx.class)
- public interface IRemoteCallService {
- @RequestMapping(value="/custorm/getTest",method = RequestMethod.POST)
- @Headers({"Content-Type: application/json;charset=UTF-8"})
- List
test(@RequestParam("names") String[] names); - }
4.实现RequestInterceptor接口
- @Configuration
- public class FeignRequestInterceptor implements RequestInterceptor {
-
- @Override
- public void apply(RequestTemplate temp) {
- temp.header(HttpHeaders.AUTHORIZATION, "XXXXX");
- }
- }