SpringCloud之OpenFeign介绍案例+相关面试题

概述

OpenFeign是一个声明式的WEB服务客户端,它使WEB服务客户端变得更加容易。具有可插拔的注解支持,SpringCloud中添加了SpringMVC注解的支持。SpringCloud中集成了Ribbon和Eureka,以及SpringCloud LoadBalance,以便在使用Feign时提供负载均衡的HTTP客户端Feign是一个远程调用的组件集成了Ribbon,默认的负载均衡策略是轮询

OpenFeign使用案例

① 调用设计图:

 

② order-service

server:
  port: 8080
spring:
  application:
    name: order-service
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
  instance:
    lease-renewal-interval-in-seconds: 5

 提供API

@RestController
public class OrderController {

    @GetMapping("doOrder")
    public String doOrder(){
        return "鱼香肉丝";
    }
}

③ user-service

作为消费者需要进行远程调用,加入OpenFeign依赖

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

配置文件

server:
  port: 8081
spring:
  application:
    name: user-service
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
  instance:
    lease-renewal-interval-in-seconds: 5

启动类中添加@EnableOpenFeignClients注解,开启OpenFeign客户端远程调用的功能

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class UserServiceApplication {

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

定义一个接口,添加@FeignClient注解并指定提供者的服务名

接口中的方法为提供者的API签名部分

/**
 * @FeignClient:value=提供者的服务名
 */
@FeignClient("order-service")
public interface UserOrderFeign {
    
    /**
     * 提供者的方法签名
     * 除方法体之外的全部属性
     */
    @GetMapping("doOrder")
    String doOrder();
}

创建Controlller注入该接口,提供API供浏览器进行请求

@RestController
public class UserController {

    @Autowired
    private UserOrderFeign userOrderFeign;

    @GetMapping("userDoOder")
    public String userDoOder(){
        return userOrderFeign.doOrder();
    }
}

④ 设置超时

默认超时时间为1s,修改Ribbon配置,查询DefaultClientConfigImpl

ribbon:
  ReadTimeout: 3000 #调用超时时间 3s
  ConnectTimeout: 3000 #连接超时时间 3s

底层核心原理

底层通过JDK动态代理获取到接口中的服务信息,使用Ribbon管理后的RestTemplate进行调用

@SpringBootTest
class ApplicationTests {

    @Autowired
    private RestTemplate restTemplate;

    @Test
    void contextLoads() {
        UserOrderFeign o = (UserOrderFeign) Proxy.newProxyInstance(UserOrderFeign.class.getClassLoader(), new Class[]{UserOrderFeign.class}, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                // 获取目标方法上的注解
                GetMapping MethodAnnotation = method.getAnnotation(GetMapping.class);
                // 获取注解上的请求路径
                String path = MethodAnnotation.value()[0];
                // 获取目标方法所在的类
                Class<?> aClass = method.getDeclaringClass();
                // 获取类上面的注解
                FeignClient classAnnotation = aClass.getAnnotation(FeignClient.class);
                // 获取注解上的value值(服务名)
                String applicationName = classAnnotation.value();
                // 拼接URL
                String url = "http://"+applicationName+"/"+path;
                // 使用Ribbon托管后的RestTemplate进行调用
                return restTemplate.getForObject(url, String.class);
            }
        });
        String s = o.doOrder();
        System.out.println(s);
    }

}

日志

级别

  • NONE:默认的,不记录日志

  • BASE:记录请求方法、URL、响应状态码、执行时间

  • HEADERS:在BASE上增加了请求和响应头信息

  • FULL:在HEADERS上增加了请求和响应的正文、无数据

创建配置类

@Configuration
public class OpenFeignLevelConfig {
    
    @Bean
    public Logger.Level level(){
        return Logger.Level.FULL;
    }
}

修改配置文件

logging:
  level:
    com.jiuxiao.controller.feign.UserOrderFeign: debug

总结

1、openFeign是一个HTTP客户端,它融合了springmvc的注解,使之可以用REST风格的映射来请求转发。

2、可以把openFegin理解为是controller层或是service层。可以取代springmvc控制层作为请求映射,亦或是作为service层处理逻辑,只不过这里,openFeign只是做一个请求转发的逻辑操作。

3、openFeign整合了hystrix做熔断处理,同时,可以和ribbon客户端负载均衡、Eureka注册中心配合使用,实现负载均衡的客户端。

4、openFeign有一个很重要的功能:fallback,其实它是hystrix的特性

 面试相关

1、如何使用?

  1. 首先,调用以及被调用的微服务双方都应该被注册到注册中心

  2. Spring Boot启动APP上标注 @EnableFeignClients注解。

  3. 编写远程调用接口并标注@FeignClient注解。(括号内添加所要调用的微服务名称)

  4. 接口中的方法为实际想要调用的服务的方法签名,并使用@PostMapping注解映射为一个post类型的HTTP请求。

Feign和openFeign有什么区别?

Feign openFiegn
Feign是SpringCloud组件中一个轻量级RESTful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务 OpenFeign 是SpringCloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等。OpenFeign 的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

猜你喜欢

转载自blog.csdn.net/weixin_45934981/article/details/130133458
今日推荐