Feign是一个声明式的服务调用组件,它整合了 Ribbon 和 Hystrix,使得服务调用更加简单。Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。Feign会完全代理HTTP的请求,我们只需要像调用方法一样调用它就可以完成服务请求。
Feign具有如下特性:
可插拔的注解支持,包括 Feign 注解和 JAX-RS 注解
支持可插拔的 HTTP 编码器和解码器
支持 Hystrix 和它的 Fallback
支持 Ribbon 的负载均衡
支持 HTTP 请求和响应的压缩
Feign对压缩的支持:在application.properties文件添加以下配置信息
#开启请求压缩功能 feign.compression.request.enabled=true #开启响应压缩功能 feign.compression.response.enabled=true #指定压缩请求数据类型 feign.compression.request.mime-types=text/xml;application/xml;application/json #如果传输超过该字节,就对其进行压缩,默认是2048 feign.compression.request.min-request-size=2048
Feign的日志处理
可为每个Feign客户端指定日志记录策略,每个Feign客户端都会创建一个logger。
默认情况下,logger的名称是Feign接口的完整类名。需要注意的是,Feign的日志打印只会对DEBUG级别作出响应。
Logger.Level的值有以下选择:
NONE:不记录任何日志(默认值)
BASIC:仅记录请求方法、URL、响应状态代码以及执行时间
HEADERS:记录BASIC级别的基础上,记录请求和响应的header
FULL:记录请求和响应的header,body和元数据
要使用Feign,需要在pom.xml文件中引入以下依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
定义一个服务接口类,服务提供者的Controller类实现该接口类,Feign客户端接口类继承该接口类,这样可以实现接口共享。
public interface UserService { @GetMapping("/user/{id}") String addUser(@PathVariable(value="id") Long id); @GetMapping("/user/query") String query(@RequestParam(value="name") String name); @GetMapping("/user/getUser") User getUser(@RequestParam(value="id") Long id); @PostMapping("/user/add") User add(@RequestBody Address address); @PostMapping("/user/update") String update(@RequestBody Address address); @GetMapping("/user/getAllAddress") List<Address> getAllAddress(); @PostMapping("/user/put") void put(@RequestBody Address address); }
服务提供者的Controller类,实现上面定义的服务接口
@RestController public class UserServiceController implements UserService { @Override public String addUser(@PathVariable(value="id") Long id){ return "id=" + id; } @Override public String query(@RequestParam(value="name") String name){ return "名字=" + name; } @Override public User getUser(@RequestParam(value="id") Long id){ User user = new User(); user.setId(id); user.setUsername("姓名1"); user.setPassword("pwd1"); return user; } @Override public User add(@RequestBody Address address){ User user = new User(); user.setId(100L); user.setUsername("姓名1"); user.setPassword("pwd1"); return user; } @Override public String update(@RequestBody Address address){ return "update success"; } @Override public List<Address> getAllAddress() { List<Address> list = new ArrayList<Address>(); Address address1 = new Address("省1", "city1"); Address address2 = new Address("province11", "市11"); list.add(address1); list.add(address2); return list; } @Override public void put(@RequestBody Address address){ System.out.println(address.getProvince() + ", " + address.getCity()); } }
创建Feign客户端接口类,该类继承于上面定义的服务接口,DefaultFeignConfiguration类是Feign的自定义配置类
/** * Feign客户端接口类:通过Feign的继承特性来实现接口共享 * * name=服务名 * configuration 自定义Feign配置 */ @FeignClient(name="service-provider-1", configuration=DefaultFeignConfiguration.class) public interface UserFeignClient extends UserService{ }
创建Feign的自定义配置类
/** * 自定义Feign配置类 * * 该配置类不能被@ComponentScan扫描到,否则配置信息就会被所有 @FeignClient 共享 * Feign的默认配置类是FeignClientsConfiguration,该类定义了Feign默认使用的编码器、解码器、所使用的契约等。 */ @Configuration @ExcludeComponent //用于标识该配置类不被@ComponentScan扫描 public class DefaultFeignConfiguration { /** * 自定义日志输出 * * 需要在application.properties文件中添加以下信息才生效: * logging.level.com.seasy.springcloud.serviceconsumer.feignclient.UserFeignClient=DEBUG */ @Bean Logger.Level feignLoggerLevel() { return Logger.Level.BASIC; } }
application.properties文件的配置信息
spring.application.name=service-consumer-2 server.port=9002 eureka.instance.hostname=${spring.cloud.client.ip-address} eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port} eureka.instance.prefer-ip-address=true #eureka.client.service-url.defaultZone=http://192.168.134.134:7001/eureka/ eureka.client.service-url.defaultZone=http://root:123456@192.168.134.134:7001/eureka/ logging.level.com.seasy.springcloud.serviceconsumer.feignclient.UserFeignClient=DEBUG
服务消费者的Controller类
@RestController public class UserController { //引入FeignClient类 @Autowired UserFeignClient userFeignClient; @GetMapping("/consumer2") public String test(){ String result = userFeignClient.addUser(22L); result = userFeignClient.query("cjm"); User user = userFeignClient.getUser(33L); Address address = new Address(); address.setProvince("GuangDong"); address.setCity("GuangZhou"); user = userFeignClient.add(address); result = userFeignClient.update(address); List<Address> list = userFeignClient.getAllAddress(); userFeignClient.put(address); return "ok"; } }
启动类:
@EnableEurekaClient @EnableFeignClients //开启Feign功能 //使用自定义注解@ExcludeComponent和excludeFilters使RibbonConfiguration类不被@CompantScan扫描到 @ComponentScan(excludeFilters=@ComponentScan.Filter(type=FilterType.ANNOTATION, value={ExcludeComponent.class})) @SpringBootApplication public class Main { public static void main(String[] args) { SpringApplication.run(Main.class, args); } }
修改Feign的负载均衡策略:
Feign整合了Ribbon,Feign的负载均衡是通过Ribbon实现的。Ribbon默认的负载均衡策略是轮询,要改变这种默认行为,可以在启动类中定义负载均衡策略的Bean类。
@Bean public IRule feignRule(){ return new RandomRule(); //随机 }
相关推荐
Feign的设计灵感来源于Netflix的Feign库,它的主要目的是简化微服务之间的通信,使得开发者可以像定义接口一样调用远程服务,从而降低了服务消费者与提供者的耦合度。 在传统的Web Service(WebService)中,我们...
5. **测试**:启动Eureka Server,然后依次启动服务提供者和服务消费者,通过服务消费者的接口调用服务提供者的方法,验证Feign的正常工作。同时,可以模拟服务提供者的异常情况,观察Hystrix断路器是否能有效保护...
接下来,创建一个Feign接口,这个接口定义了远程服务的调用方法,使用`@FeignClient`注解指定服务的名称。例如,如果我们有一个名为`UserService`的服务,可以这样定义: ```java @FeignClient(name = "userService...
使用 Feign 可以进行服务的消费,且客户端负载平衡仍是通过 Ribbon 实现的。 二、使用 Spring Cloud Feign 创建服务调用方 要使用 Spring Cloud Feign 创建服务调用方,需要在 pom.xml 文件中添加以下依赖: ```...
本文主要探讨了在SpringCloud中如何使用Ribbon和Feign作为服务消费者的组件,以及它们背后的负载均衡原理。首先,理解服务间通信的基础是HTTP协议,而注册中心Eureka则负责维护服务实例的列表。 Ribbon和Feign都是...
在服务消费者端,当调用服务提供者的API时,Feign会自动使用配置好的Jackson XML序列化器将Java对象转换为XML格式,然后发送请求。服务提供者接收到XML数据后,同样可以通过Jackson反序列化回Java对象。 此外,...
在整合 Feign 和 WebFlux 时,我们需要确保服务提供者的接口是基于 WebFlux 实现的,这样才能保证在服务消费者端使用 Feign 进行调用时,能够正确地处理非阻塞的响应式请求。 具体实现步骤如下: 1. **引入依赖**...
通过学习和实践这个示例,你将深入理解Spring Cloud Feign的工作原理和使用方式,为构建微服务架构中的服务消费者打下坚实的基础。同时,也可以了解到如何与其他Spring Cloud组件(如Eureka)协同工作,提高系统的可...
其次,我们需要在服务消费者端使用Feign来调用服务提供者端的文件下载接口。在下面的示例中,我们使用Feign来调用服务提供者端的文件下载接口,并使用ResponseEntity来接收下载的文件。 示例代码 在服务提供者端,...
在这个服务消费者中,我们需要使用 Feign 客户端来调用服务提供者的方法。首先,我们需要在pom.xml文件中添加spring-cloud-starter-openfeign依赖项,以便使用 Feign 客户端。 ```java @FeignClient(name = "service...
在服务消费者端,我们只需注入这个Feign接口,就可以像调用本地方法一样调用远程服务了: ```java @Service public class ConsumerService { @Autowired private ProviderClient providerClient; public String...
在本项目中,"feign-demo.7z"是一个压缩包文件,包含了使用Spring Cloud Feign实现服务调用的相关代码示例。Feign是Spring Cloud生态中的一个组件,主要用于简化微服务之间的RESTful API调用,它通过声明式的方式...
在Spring Boot 2.x版本中,使用Consul作为服务注册与发现中心,并通过Feign进行服务调用,是一种常见的微服务架构实践。Feign是一个声明式的Web服务客户端,它使得编写HTTP客户端变得简单。下面我们将详细讲解如何...
3. **引入Feign依赖**:在服务消费者工程中引入Feign的起步依赖,使得该工程具备使用Feign的能力。 4. **定义Feign客户端**:创建一个接口,并使用`@FeignClient`注解定义一个Feign客户端,指向需要调用的服务。 5. ...
- **Feign接口**: 在Feign中,服务消费者通过定义一个接口来描述远程调用,这个接口会带有注解,注解中包含了服务提供者的地址和服务接口等信息。 - **Feign Client**: 实现了HTTP客户端的功能,根据Feign接口生成...
3. **服务消费者与生产者**:"eureka-client"模块展示了服务消费者的实现,如何配置和使用Feign客户端,而"eureka-server"和"eureka-feign-client"则展示了服务生产者的角色。 4. **服务降级与熔断**:虽然在这个...
2. 注解接口:使用`@FeignClient`注解指定服务名,这样Feign就能从Eureka中找到对应的服务实例。 3. 使用Feign客户端:创建接口的实例,Feign会自动处理HTTP请求和响应,返回结果。 Feign还支持多种扩展,例如...
这个项目"springboot_feign:服务消费者(声明式调用)"显然是一个关于如何在Spring Boot应用中使用Feign作为服务消费者的示例。 1. **什么是Feign?** Feign是Netflix开源的一个声明式Web服务客户端,它通过提供一种...
通过学习这些代码,我们可以深入掌握服务发现、注册、路由、熔断和 Feign 客户端的使用方式,为构建自己的微服务架构打下坚实基础。在实际项目中,可以根据具体需求选择和配置这些组件,以实现高可用、高并发的...
1. **Feign的基本使用**:Feign通过接口定义了服务调用的方式,使用注解来指定HTTP请求的方法、URL、参数等信息。开发者只需要定义好接口,Feign会自动生成实现,实现了服务调用的声明式编程。 2. **Hystrix的集成*...