OpenFeign是springcloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等

OpenFeign的使用是创建一个接口,并在接口上添加一些注解 ,包括feign自己提供的接口

使用feign的appliction.properties配置文件和注册到eureka的客户端没有什么明显区别

一、maven依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

二、springboot启动类所需注解

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class ConsumerOrderFeignApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerOrderFeignApplication.class, args);
    }

}

三、接口创建

3.1 根据服务名称创建feign接口

根据“提供者”的应用别名provider来

该接口里的方法名可以随意取,但返回值类型、post或get的http请求方式、方法形参用到的注解以及@GetMapping里的url必须和提供者一样

@FeignClient("PROVIDER")
public interface MyFeignClient {

    /**
     * 获取对象
     *
     * @param id id
     * @return user对象
     */
    @GetMapping("/user/{id}")
    User getOrder(@PathVariable Integer id);

    /**
     * 如果传递的是复杂参数 Feign都会以post方式发出 提供者必须是post方式
     * 获取user
     *
     * @param user 传入复杂的参数
     * @return user对象
     */
    @PostMapping("/getUser")
    User getUser(User user);

}

3.1.1 feign自定义配置

写一个配置类 这样创建feign接口就可以使用feign自带的注解进行相应的操作

@Configuration
public class FeignClientConfig {

    @Bean
    public Contract feignContract() {
        return new feign.Contract.Default();
    }

    /**
     * 配置输出的日志
     */
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }

}

在feign接口里使用自定义配置

@RequestLine和@Param都是feign提供的注解

@FeignClient(name = "PROVIDER", configuration = FeignClientConfig.class)
public interface MyFeignClient {

    /**
     * 获取对象
     * 可以使用feign提供的注解 第一个参数是请求方式 第二是路径 用空格分隔
     * 如果使用RequestLine注解则 需要与@Param注解结合使用
     *
     * @param id id
     * @return user对象
     */
    @RequestLine("GET /user/{id}")
    User getOrder(@Param("id") Integer id);

    /**
     * 如果传递的是复杂参数 Feign都会以post方式发出 提供者必须是post方式
     * 获取user
     *
     * @param user 传入复杂的参数
     * @return user对象
     */
    @RequestLine("POST /getUser")
    User getUser(User user);

}

3.2 根据服务的url创建feign接口

@FeignClient注解里的name可以随意取名

@FeignClient(name = "xxxx", url = "http://localhost:8761", configuration = FeignClientConfig01.class)
public interface MyFeignClient01 {

    /**
     * 访问eureka的页面
     *
     * @param serviceName 名称
     * @return 字符串
     */
    @RequestLine("GET /eureka/apps/{serviceName}")
    String findServiceInfoFromEurekaByServiceName(@Param("serviceName") String serviceName);

}

但如果对应的服务配置了security需要账号密码则需要在配置类中写相应的代码,这里创建了一个FeignClientConfig01配置类

@Configuration
public class FeignClientConfig01 {

    /**
     * 配置security的账号密码
     *
     * @return
     */
    @Bean
    public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
        return new BasicAuthRequestInterceptor("user", "123");
    }
}