springcloud 入门(3) 声明式调用 Feign

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: springcloud 入门(3) 声明式调用 Feign

springcloud 搭建更多请查看:

springcloud 项目一步一步搭建(1)之eureka

springcloud 项目一步一步搭建(2)之Ribbon

spring cloud feign 介绍

Spring Cloud Feign担任的角色是声明式服务调用。在之前我们只是简单使用RestTemplate,但在实际开发中,由于对服务依赖调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对各个微服务自行封装一些客户端来包装这些依赖服务的调用,我们发现对于RestTemplate的封装,几乎每一个调用都是模板化内容。针对上述情况,Spring Cloud Feign在此基础上进一步封装,由它来帮助我们定义和实现依赖服务接口的定义,使得我们在调用接口时完全感觉不到是在进行远程接口调用。


Spring Cloud Feign 的使用

Spring Cloud Feign 使用起来也很简单:

生产者:

ProductController.java

@RestController
@RequestMapping("/product")
public class ProductController {
    @GetMapping("/list/{count}")
    public List<ProductEntity> list(@PathVariable("count") int count){
        List<ProductEntity> list = new ArrayList<>();
        for (int i = 0; i < count; i++) {
            ProductEntity productEntity = new ProductEntity();
            productEntity.setName("name-"+i);
            productEntity.setType("type-"+i);
            list.add(productEntity);
        }
        return list;
    }
}

ProductEntity.java

public class ProductEntity {
    private String name;
    private String type;
    //get、set方法省略
}

1、创建maven项目,引入Spring Cloud Feign 相关依赖

    <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>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

2、在启动类加入@EnableFeignClients注解,在程序启动后会扫描带有@FeignClient注解的类

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "PROVIDER" , configuration = RibbonConfig.class)
@EnableFeignClients
public class ConsumerFeignApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerFeignApplication.class, args);
    }
}

3、application.properties配置

server.port=7002
eureka.client.register-with-eureka=false
eureka.client.service-url.defaultZone=http://localhost:8001/eureka
spring.application.name=consumer
eureka.instance.instance-id=consumer-feign

4、定义 FeignClient

@FeignClient(name = "PROVIDER")
public interface IProviderService {
    @RequestMapping("/hi/hello")
    String hi();
    @RequestMapping("/product/list/{count}")
    List<ProductEntity> productList(@PathVariable("count") int count);
}

5、在消费者端调用FeignClient

@RestController
@RequestMapping("/hi")
public class HelloConsumerFeign {
    @Autowired
    private IProviderService iProviderService;
    @RequestMapping("/pro")
    public String provider(){
        return iProviderService.hi();
    }
    @GetMapping("/productList/{count}")
    public List<ProductEntity> productList(@PathVariable("count") int count){
        return iProviderService.productList(count);
    }
}

启动Eureka Server 、生产者、feign消费者,访问http://localhost:7002/hi/productList/5 , 出现如下页面访问成功

image.png

FeignClient 注解剖析

1、name:FeignClient 的名称,对应生产者服务名称,用于服务发现

2、url:一般用于调试,可以指定@FeignClient 的调用地址

3、decode404:错误代码为404时,如果该字段为true,会调用decoder进行解码,否则抛出FeignException

4、configuration:配置类,可以自定义Feign的Decoder、Encoder、Contract、LogLevel等

5、fallback:定义容错的处理类,当调用远程接口失败或者超时时,会调用接口对应的容错逻辑,fallback指定的类必须实现@FeignClient 标记的接口。

6、fallbackFactory:工厂类,用于生成fallback类示例类,通过这个接口我们可以实现每个接口通用的容错逻辑,减少重复代码。


Feign 开启GZIP压缩

spring cloud feign支持请求响应的gzip压缩。

# 配置请求GZIP压缩
feign.compression.request.enabled=true
# 配置响应GZIP压缩
feign.compression.response.enabled=true
# 配置压缩支持的mime type
feign.compression.request.mime-types="text/xml", "application/xml", "application/json"
# 配置压缩数据大小的下限,默认2048
feign.compression.request.min-request-size=2048

Feign client 开启日志

Feign 为每个Feign client 都提供了feign.Logger实例,可在配置中开启日志。

开启日志分为两步:

1、创建FeignClientConfig类配置日志bean

@Configuration
public class FeignClientConfig {
    @Bean
    public Logger.Level getFeignLoggerLevel() {
        return feign.Logger.Level.FULL;
    }
}

2、在配置文件中配置日志

# 开启日志
logging.level.site.sunlong.eurekaConsumer.service=debug

配置完之后就能在控制台看到日志了。


参考资料:

1、《springcloud 微服务实战》

2、《重新定义Spring Cloud 实战》


GitHub地址:

https://github.com/ArronSun/micro-services-practice.git


能力一般,水平有限,如有错误,请多指出。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
5天前
|
SpringCloudAlibaba Dubbo Java
【SpringCloud Alibaba系列】Dubbo基础入门篇
Dubbo是一款高性能、轻量级的开源Java RPC框架,提供面向接口代理的高性能RPC调用、智能负载均衡、服务自动注册和发现、运行期流量调度、可视化服务治理和运维等功能。
【SpringCloud Alibaba系列】Dubbo基础入门篇
|
28天前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
89 5
|
2月前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
2月前
|
JSON Java 数据格式
【微服务】SpringCloud之Feign远程调用
本文介绍了使用Feign作为HTTP客户端替代RestTemplate进行远程调用的优势及具体使用方法。Feign通过声明式接口简化了HTTP请求的发送,提高了代码的可读性和维护性。文章详细描述了Feign的搭建步骤,包括引入依赖、添加注解、编写FeignClient接口和调用代码,并提供了自定义配置的示例,如修改日志级别等。
141 1
|
3月前
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway
|
3月前
|
前端开发 API 微服务
SpringCloud微服务之间使用Feign调用不通情况举例
SpringCloud微服务之间使用Feign调用不通情况举例
672 2
|
2月前
|
负载均衡 Java API
【Spring Cloud生态】Spring Cloud Gateway基本配置
【Spring Cloud生态】Spring Cloud Gateway基本配置
63 0
|
3月前
|
Java API 开发者
【已解决】Spring Cloud Feign 上传文件,提示:the request was rejected because no multipart boundary was found的问题
【已解决】Spring Cloud Feign 上传文件,提示:the request was rejected because no multipart boundary was found的问题
743 0
|
3月前
|
SpringCloudAlibaba API 开发者
新版-SpringCloud+SpringCloud Alibaba
新版-SpringCloud+SpringCloud Alibaba
|
5天前
|
SpringCloudAlibaba 负载均衡 Dubbo
【SpringCloud Alibaba系列】Dubbo高级特性篇
本章我们介绍Dubbo的常用高级特性,包括序列化、地址缓存、超时与重试机制、多版本、负载均衡。集群容错、服务降级等。
【SpringCloud Alibaba系列】Dubbo高级特性篇