【云原生】springcloud10——人生苦短,我用OpenFeign

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【云原生】springcloud10——人生苦短,我用OpenFeign

前面我们已经讲了服务注册的Eureka,Zookeeper,Consult,以及调用部分的的Ribbon和LoadBalancer,现在我们将学习服务调用的第二部分组件,Feign和OpenFeign,由于Feign已经停更了,我们直接进入OpenFeign的学习。


a1a3d15386fb4fa4bdc5796719b56e11.png

1.OpenFeign的简介

1.1 Feign与OpenFeign简介

官网文档:OpenFeign官网文档

884b86e500e54f78b3063bd34ac1a7a6.png

Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。

Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。

1.2 Feign能干什么

6787bfa448e2418cba9f2782c7be12bf.png

简单来说,Feign定义服务调用的接口,通过注解即可绑定服务提供方的接口,让不同微服务方便的共用一套服务调用的模板。后面我们将通过code来深入理解。

2 OpenFeign的使用

2.1 服务架构

afd2248c4a0c447ba1c7a3a3ddb8248e.png


2.2 OpenFeign的使用步骤

18134f12cccd4bf98ce938bee6ee78dc.png

2.3 建模块

新建模块cloud-consumer-feign-order80


415137e88b12478a8aba91891c962e4f.png

2.4 写Pom

<dependencies>
    <!-- openfeign -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <!-- eureka-client -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <!-- 引用自己定义的api通用包,可以使用Payment支付Entity -->
    <dependency>
        <groupId>com.wangzhou.springcloud</groupId>
        <artifactId>cloud-api-commons</artifactId>
        <version>${project.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <!--热部署-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

在idea右上角可以看到80服务的maven依赖,发现果然eureka,ribbon,hystrix等依赖都被一并导入进来了。

85fb1de210c94dfa9e21ae0a07d069cf.png

2.5 application.yml

server:
  port: 80
eureka:
  client:
    register-with-eureka: true
    service-url:
      #defaultZone: http://eureka7001.com:7001/eureka
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

2.6 主启动

@SpringBootApplication
@EnableFeignClients //激活并开启OpenFeign
public class OrderMainFeign80 {
    public static void main(String[] args) {
        new SpringApplication(OrderMainFeign80.class).run(args);
    }
}

2.7 业务类

(1)service

在springcloud包下新建service.PaymentFeignService接口

(业务逻辑接口+@FeignClient配置调用provider服务。)

新建PaymentFeignService接口并新增注解@FeignClient

@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE") // 告知Feign要去Eureka上找名字为cloud-payment-service的微服务
public interface PaymentFeignService {
  // 下面的接口与8001服务端保持一致,我们可以直接去copy
    @GetMapping(value = "/payment/get/{id}")// value值为调用地址
    public CommonResult getPaymentById(@PathVariable("id")Long id);
}

发现没有,现在service只需要写接口+使用注解即可,很清爽。

(2)Controller

controller暴露下接口,调用下service就大功告成。

@Slf4j
@RestController
public class PaymentFeignController {
    //@Resource和@Autowired注解都是用来实现依赖注入的。
    // 只是@AutoWried按by type自动注入,而@Resource默认按byName自动注入。
    @Resource
    private PaymentFeignService paymentFeignService;
    @GetMapping("/consumer/payment/get/{id}")
    public CommonResult<Payment> getPayment(@PathVariable("id")Long id){
        log.info("********查询的id:" + id);
        return paymentFeignService.getPaymentById(id);
    }
}

2.8 测试

依次启动7001,7002Eureka集群,8001,8002服务提供者支付微服务集群,最后启动服务调用者订单模块OrderMainFeign80.

访问:http://localhost/consumer/payment/get/1

6eacd43f835b45c384d8b2a2196c353a.png

完活。

2.9 总结

再回过头来领悟下OpenFeign是怎么实现服务调用的:接口+注解。简单不?


8e939056335443738a52edbabe7cd2cf.png


3 OpenFeign的超时机制

在8001,8002的cotroller中增加如下接口。

   @GetMapping("feign/timeout")
    public String paymentTimeout() throws InterruptedException {
        TimeUnit.SECONDS.sleep(3);
        return serverPort;
    }

349e881b94394c27b0082baf7af34f50.png

改造下controllerd2c7a0d25536475387e6dfa29619863d.png启动各个微服务后,再访问http://localhost:8001/payment/feign/timeout自测下。

a0d9347296c848ce882a1e060470344f.png

再访问:http://localhost/consumer/payment/feign/timeout,宝子注意看: Read timed out executing GET http://CLOUD-PAYMENT-SERVICE/payment/feign/timeout!!!

8cc593373df140c2a67cae41c05fd34b.png

我们可以通过配置来改变其超时等待时间。在80的yml中添加。

#没提示不管它,可以设置
ribbon:
  #指的是建立连接后从服务器读取到可用资源所用的时间
  ReadTimeout: 5000
  #指的是建立连接使用的时间,适用于网络状况正常的情况下,两端连接所用的时间
  ConnectTimeout: 5000

再测试即可。

dae7d73fe33d4975bebd435f4278bf95.png

4 OpenFeign的日志增强

OpenFeign可用进行日志增强,查看

其日志级别如下。

4c72e1e15a504cddb1a3a9ffd425e5ab.png

步骤

配置日志bean

在80的springcloud包下新建config.FeignConfig

import feign.Logger;  //不要导错包
@Configuration
public class FeignConfig {
    @Bean
    Logger.Level feignLoggerLevel(){
        //打印最详细的日志
        return Logger.Level.FULL;
    }
}

在80的yml文件中添加:

#开启日志的feign客户端
logging:
  level:
    #feign日志以什么级别监控哪个接口
    com.achang.springcloud.service.PaymentFeignService: debug #写你们自己的包名


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
缓存 Java API
【云原生】Spring Cloud Gateway的底层原理与实践方法探究
【云原生】Spring Cloud Gateway的底层原理与实践方法探究
|
3月前
|
消息中间件 Cloud Native Java
【Spring云原生系列】SpringBoot+Spring Cloud Stream:消息驱动架构(MDA)解析,实现异步处理与解耦合
【Spring云原生系列】SpringBoot+Spring Cloud Stream:消息驱动架构(MDA)解析,实现异步处理与解耦合
|
8月前
|
负载均衡 Cloud Native Java
【云原生】Spring Cloud Alibaba 之 Gateway 服务网关实战开发
【云原生】Spring Cloud Alibaba 之 Gateway 服务网关实战开发
1349 0
|
10月前
|
Java Spring
Spring Cloud OpenFeign 远程调用传递请求头信息
import feign.RequestInterceptor; import feign.RequestTemplate; import lombok.extern.slf4j.Slf4j; import org.springframework.util.Assert; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes;
256 0
|
2月前
|
负载均衡 Java API
Java一分钟之-Spring Cloud OpenFeign:声明式服务调用
【6月更文挑战第9天】Spring Cloud OpenFeign是声明式服务调用库,简化了微服务间调用。通过动态代理,它允许开发者用Java接口调用HTTP服务,支持服务发现、负载均衡。本文介绍了OpenFeign的基本概念,展示了如何添加依赖、开启客户端和定义服务接口。还讨论了接口调用失败、超时重试和日志配置等问题及其解决方案,并提供了自定义Feign配置的代码示例。通过学习,读者可以更好地在微服务架构中使用OpenFeign进行服务通信。
216 4
|
2月前
springCloud之服务降级熔断Hystrix、OpenFeign
springCloud之服务降级熔断Hystrix、OpenFeign
81 0
|
2月前
|
负载均衡 Java 数据库连接
SpringCloud之OpenFeign简单使用
当远程服务调用失败时,会采用熔断降级策略,调用熔断降级的方法返回。
42 2
|
2月前
|
负载均衡 前端开发 Java
Spring Cloud 之 OpenFeign
Spring Cloud OpenFeign是Spring官方的声明式服务调用组件,简化了远程服务调用,使其如同调用本地方法。核心注解包括`@FeignClient`、`@EnableFeignClients`、`@GetMapping`和`@PostMapping`。实践中,通过在`pom.xml`添加依赖,创建Feign接口,配置`@FeignClient`,在启动类启用Feign,以及自定义超时设置来实现远程调用和负载均衡。
|
2月前
springCloud之服务调用RestTemplate、OpenFeign
springCloud之服务调用RestTemplate、OpenFeign
26 0
|
3月前
|
消息中间件 Cloud Native 网络安全
云原生最佳实践系列 3:基于 SpringCloud 应用玩转 MSE
该文档介绍了基于云原生应用的产品构建的微服务架构实践。