1.引用jar包,pom文件

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

2.启动类上面加注解@EnableFeignClients
表示扫描带有@FeignClient注解的接口
添加注解之后的启动类是这个样子

@SpringBootApplication
@EnableFeignClients
public class MyApplication {
	public static void main(String[] args) {
		SpringApplication.run(MyApplication.class, args);
	}
}

3.写一个接口并且用@FeignClient注解
前提最好用浏览器或者HTTP工具,比如PostMan测试一下那个被调用的接口,确保被调用的接口是可用的

注意:name与url的区别,如果调用的服务,和我们的服务,不在同一个注册中心,那么此时就需要使用一个url来指定被调用的服务的地址,如果在同一个注册中心,那么不建议使用,因为既然在同一个注册中心,还用url干嘛?那不是和注册中心的理念冲突了么
NOTE:当name与url都存在时,feign会认为这是第三方服务,和你不在同一个注册中心,所以优先使用url

@FeignClient(name="被调用的那个服务在eureka中的名字",value="就是name,它俩一样",url="http://localhost:1234/aaa")
public interface MyInterface{
	//此处相当于访问http://localhost:1234/aaa/m1?p1=xxxx
	//注意:c1是controller的映射,m1是方法映射,而上面的aaa是项目名
	@RequestMapping("/c1/m1")
	public String method1(@RequestParam("p1") String p1);
	
	//*****注意此处User,挺有意思的,被调用的服务哪怕返回的不会User类,只要字段名字一样,
	//值就会传递过来,网上有例子写实现Seralizable接口,全限定名一样什么的,纯属没有任何用,
	//spring是使用jackson直接json转换的
	@RequestMapping("/c1/m2")
	public User method1(@RequestParam("p1") String p1);
	
	//*****注意:以下方式摘自网上,我没有亲自试验过,但是觉得可行,所以我就复制过来了
    @RequestLine("GET /user/index")//feign独有的注解方式 
    String index();
    @RequestMapping(value = "/get0/{id}", method = RequestMethod.GET)
    User findById(@PathVariable("id") Long id);
    @RequestMapping(value = "/get1", method = RequestMethod.GET)
    User get1(@RequestParam("id") Long id, @RequestParam("name") String name);
    @RequestMapping(value = "/get2", method = RequestMethod.GET)
    User get2(@RequestParam Map<String, Object> map);
    @RequestMapping(value = "/hello2", method=RequestMethod.GET)
    User hello2(@RequestHeader("name") String name, @RequestHeader("age") Integer age);
    @RequestMapping(value = "/hello3", method=RequestMethod.POST)
    String hello3(@RequestBody User user);
    //****************摘抄结束************

4.哪里需要调用,哪里就直接@Autowired,比如在某个Service中使用就

@Service
public class MyService{
	@Autowired
	MyInterface myInterface;
}

关于媒体类型:默认情况下,feign遵循restful规范,所以feign默认情况下的媒体类型是application/json,假如我遇见了一个form/data的接口,那么应该如何使用feign的方式调用呢?(虽然这不规范)
1.创建一个配置类

import feign.codec.Encoder;
import feign.form.spring.SpringFormEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

// @Configuration 注意:此处如果打开注释,则对所有FeignClient都生效
// 所以一般情况下该配置类不要加@Configuration注解,如果哪些FeignClient
// 想使用form/data形式的操作,则可以按照下面的FeignClientForFormData类写就可以了
public class ContentTypeFormDataConfig {
    @Bean
    public Encoder multipartFormEncoder() {
        return new SpringFormEncoder();
    }
}

2.创建一个Feign接口

@FeignClient(value = "Bean的名字", url = "xx.xx.xx", configuration = ContentTypeFormDataConfig.class)
public interface FeignClientForFormData{

	// 下面这个User就是一个普通的java类而已
    @PostMapping(value = "/xxxx/xxx", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
    String add(User user);
}

此时,使用add方法就会通过媒体类型为form/data的方式发送了

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐