基于OpenFeign的服务调用

一 OpenFeign是什么

OpenFeign是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务一样简单, 只需要创建一个接口并添加一个注解即可。

Nacos很好的兼容了OpenFeign, OpenFeign默认集成了 Ribbon, 所以在Nacos下使用OpenFeign默认就实现了负载均衡的效果。

二 OpenFeign的引入

1 引入依赖

service模块中配置OpenFeign的pom依赖(实际是在服务消费者端需要OpenFeign的依赖)

<!-- 服务调用 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2 启动类添加注解

在service_edu的启动类添加如下注解

@SpringBootApplication
@ComponentScan({"com.atguigu.guli"})
// 启动 OpenFeign 远程调用
@EnableFeignClients
@EnableDiscoveryClient
public class ServiceEduApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceEduApplication.class, args);
    }
}

三 OpenFeign的使用

1 oss微服务中创建测试api

服务的生产者的FileController中添加如下方法:

/**
* 功能描述:测试OpenFeign
*
* @param
* @return R 返回给消费者的消息
* @author cakin
* @date 2020/11/29
* @description:
*/
@ApiOperation(value = "测试")
@GetMapping("test")
public R test() {
    log.info("oss test被调用");
    return R.ok();
}

2 edu微服务中创建远程调用接口

服务消费者中创建feign包,创建如下接口:

@Service
@FeignClient(value = "service-oss")
public interface OssFileService {
    /**
     * 功能描述:远程调用OSS 服务接口
     *
     * @author cakin
     * @date 2020/11/29
     * @return R 返回给控制器的消息
     */
    @GetMapping("/admin/oss/file/test")
    R test();
}

3 消费者控制器调用远程方法

服务消费者中的TeacherController中添加如下方法:

/**
* 功能描述:测试OSS服务调用
*
* @return R 返回给前端的数据
* @author cakin
* @date 2020/11/29
*/
@ApiOperation("测试服务调用")
@GetMapping("test")
public R test() {
    ossFileService.test();
    log.info("edu执行成功");
    return R.ok();
}

4 测试

四 负载均衡

1 配置多实例

2 测试负载均衡

对比两个实例输出日志的时间,可以发现默认情况下是轮询策略

3 Ribbon负载均衡策略

4 配置负载均衡策略方式

在调用者服务service-edu中配置如下

service-oss: # 被调用者的名称
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

5 测试

五 OpenFeign的超时控制

1 模拟长流程业务

修改oss服务FileController的test方法,添加sleep 3秒:

/**
* 功能描述:测试OpenFeign
*
* @param
* @return R 返回给消费者的消息
* @author cakin
* @date 2020/11/29
* @description:
*/
@ApiOperation(value = "测试")
@GetMapping("test")
public R test() {
    log.info("oss test被调用");
    try {
        TimeUnit.SECONDS.sleep(3);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return R.ok();
}

2 远程调用测试

上面的程序在测试时会出现远程调用超时错误。如下:因为OpenFeign默认等待1秒钟,否则超时报错。

超时后,服务消费者端默认会发起一次重试

重试规则:每隔一秒发起重试

ribbon:
  MaxAutoRetries: 0 # 同一实例最大重试次数,不包括首次调用,默认0
  MaxAutoRetriesNextServer: 1 # 重试其他实例的最大重试次数,不包括首次所选的server,默认1

3 解决方案

application.yml文件中配置ribbon的超时时间(因为OpenFeing的底层即是对ribbon的封装)

ribbon:
  MaxAutoRetries: 0 # 同一实例最大重试次数,不包括首次调用,默认0
  MaxAutoRetriesNextServer: 1 # 重试其他实例的最大重试次数,不包括首次所选的server,默认1
  ConnectTimeout: 10000 #连接建立的超时时长,默认1秒
  ReadTimeout: 10000 #处理请求的超时时间,默认为1秒

4 测试

六 OpenFeign日志

1 作用

OpenFeign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解OpenFeign中Http请求的细节。即对OpenFeign远程接口调用的情况进行监控和日志输出。

2 日志级别

NONE:默认级别,不显示日志

BASIC:仅记录请求方法、URL、响应状态及执行时间

HEADERS:除了BASIC中定义的信息之外,还有请求和响应头信息

FULL:除了HEADERS中定义的信息之外,还有请求和响应正文及元数据信息

3 配置日志bean

在service_edu中创建配置文件

/**
* @ClassName: OpenFeignConfig
* @Description: OpenFeign的日志配置
* @Date: 2020/11/29
* @Author: cakin
*/
@Configuration
public class OpenFeignConfig {
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}

4 开启日志

在service_edu中,application.yml中指定监控的接口,以及日志级别

logging:
  level:
    com.atguigu.guli.service.edu.feign.OssFileService: debug #以什么级别监控哪个接口

5 测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值