模拟实现openFeign: https://www.yuque.com/miaochangke/itmck/syveu2

1.什么是openfeign ?

openfeign 声明式http客户端.使得我们调用远程API变得简单,只需简单的创建一个interface标注注解就能完成远程调用.默认整合ribbon实现负载均衡.
Clipboard_2021-02-05-23-26-30.png

2.Openfeign使用

2.1.引入pom依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-openfeign</artifactId>
  4. </dependency>

2.2.创建Fegin客户端

  1. @Component
  2. @FeignClient(name = "micro-icr-risk")
  3. public interface MicroFeginClient {
  4. @GetMapping(value = "mck/hello")
  5. String hello();
  6. @GetMapping(value = "mck/hello2")
  7. @ResponseBody
  8. Student hello2(@RequestParam("name") String name);
  9. }

Tips:

  • @FeignClient(value = “fw-register-eureka-client”)里面配置的value 就是服务的名称
  • 如果你在项目里面设置了同意的请求路径(server.servlet.context-path),需要将@FeignClient注解调整@FeignClient(value = “fw-register-eureka-client”,path = “xxx”)
  • Feign 里面定义的接口,有多个@RequestParam,但只能有不超过一个@RequestBody
    在定义接口的时候,如果返回的是用户自定义的实体,建议抽取出来,在Controller中实现接口,将抽取出来的接口单独打包,需要调用的项目依赖此包即可,每个项目不用重新定义一遍

    2.3.启动类 新增@EnableFeignClients(“com.itmck.microicrconsumer.fegin”)

    ```java @EnableDiscoveryClient @SpringBootApplication @EnableFeignClients(“com.itmck.microicrconsumer.fegin”) public class MicroIcrConsumerApplication {

    public static void main(String[] args) {

    1. SpringApplication.run(MicroIcrConsumerApplication.class, args);

    }

}

  1. <a name="oZVp4"></a>
  2. ## 2.4.使用
  3. ```java
  4. @Slf4j
  5. @Api(value = "ConsumerController", tags = "控制器作用")
  6. @RestController
  7. public class ConsumerController {
  8. @Resource
  9. private MicroFeginClient microFeginClient;
  10. @ApiOperation(value = "hello2", notes = "演示2")
  11. @GetMapping("/hello2")
  12. public Student fec(@RequestParam String name) {
  13. return microFeginClient.hello2(name);
  14. }
  15. }

总结:在我们是一个feigin的时候是要保证服务都是在一个注册中心.fegin就是对http的封装方便我们去使用.其实还有个开源的http封装的框架使用也很灵活,可以参考http://forest.dtflyx.com/docs/

3.Fegin进阶

在我们使用Fegin的时候并不是简单的集成,还有一些特殊的需求,如,日志打印,Fegin接口密码认证等

3.1 Feign 自定义日志

我们在开发时候一般出现问题,需要将出错信息、异常信息以及正常的输入输出打印出来,以供我们更好的排查和解决问题,比如想看到接口的性能,就需要看Feign 的日志,那么如何让Feign 的日志展示出来呢?

3.1.1 添加日志的配置信

新建FeignConfig类,并设置日志级别的输出信息
其中:日志等级:

  • NONE: 不输出日志
  • BASIC: 只输出请求方法的URL 和响应状态码以及接口的请求时间
  • HEADERS :将 BASIC信息和请求头信息输出
  • FULL :输出完 的请求信息 ```java public class FeignConfig {

    /**

    • 输出的日志级别
    • @return */ @Bean Logger.Level feignLoggerLevel(){ return Logger.Level.FULL; } }
  1. <a name="iSDUv"></a>
  2. ### 3.1.2 @FeignClient的配置修改
  3. <a name="VkXXN"></a>
  4. ###### 将配置信息添加到Feign 的接口配置上面 configuration = FeignConfig.class
  5. ```java
  6. @FeignClient(name = "micro-icr-risk",configuration = FeignConfig.class)
  7. public interface MicroFeginClient {
  8. }

3.1.3 application.yml中设置日志级别

com.yisu是设置包路径,在这个路径里面的debug信息都会被捕获到
  1. logging:
  2. level:
  3. com.yisu: debug

3.2 Fegin的Basic认证

接口上都会设置需要的权限信息,而一般的权限认证有通过token校验的、也有通过用户名密码校验的等方式。比如我们在Feign 请求中我们可以配置Basic 认证,如下

  1. /**
  2. * 设置Spring Security Basic认证的用户名密码
  3. * @return
  4. */
  5. @Bean
  6. public BasicAuthRequestInterceptor basicAuthRequestInterceptor(){
  7. return new BasicAuthRequestInterceptor("user","123456");
  8. }

3.3 Fegin 自定义认证配置

  1. @NoArgsConstructor
  2. public class FeignAuthRequestInterceptor implements RequestInterceptor {
  3. @Override
  4. public void apply(RequestTemplate requestTemplate) {
  5. //编写自己的业务逻辑
  6. }
  7. }

然后在FeignConfig配置中添加Bean

  1. @Bean
  2. public FeignAuthRequestInterceptor basicAuthRequestInterceptor(){
  3. return new FeignAuthRequestInterceptor();
  4. }