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

简介: 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日志并进行多维度分析。
目录
相关文章
|
1月前
|
SpringCloudAlibaba Java 网络架构
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(二)Rest微服务工程搭建
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(二)Rest微服务工程搭建
52 0
|
1月前
|
消息中间件 Cloud Native Java
【Spring云原生系列】SpringBoot+Spring Cloud Stream:消息驱动架构(MDA)解析,实现异步处理与解耦合
【Spring云原生系列】SpringBoot+Spring Cloud Stream:消息驱动架构(MDA)解析,实现异步处理与解耦合
|
1月前
|
SpringCloudAlibaba Java 持续交付
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
155 0
|
1月前
|
SpringCloudAlibaba Java 网络架构
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(七)Spring Cloud Gateway服务网关
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(七)Spring Cloud Gateway服务网关
101 0
|
1月前
|
消息中间件 JSON Java
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
598 0
|
2天前
|
Java Nacos 开发者
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
|
18天前
|
Nacos
SpringCloud Feign使用
SpringCloud Feign使用
23 1
|
25天前
|
开发框架 负载均衡 Java
Spring boot与Spring cloud之间的关系
总之,Spring Boot和Spring Cloud之间的关系是一种构建和扩展的关系,Spring Boot提供了基础,而Spring Cloud在此基础上提供了分布式系统和微服务架构所需的扩展和工具。
18 4
Spring boot与Spring cloud之间的关系
|
1月前
|
SpringCloudAlibaba 负载均衡 Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(目录大纲)
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(目录大纲)
66 1
|
1月前
|
Java Nacos Sentinel
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(九)Nacos+Sentinel+Seata
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(九)Nacos+Sentinel+Seata
204 0