`
raymond.chen
  • 浏览: 1437000 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用Feign消费服务

 
阅读更多

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(); //随机
}

 

分享到:
评论

相关推荐

    springcloud feign 服务消费者 类似 webservice

    Feign的设计灵感来源于Netflix的Feign库,它的主要目的是简化微服务之间的通信,使得开发者可以像定义接口一样调用远程服务,从而降低了服务消费者与提供者的耦合度。 在传统的Web Service(WebService)中,我们...

    SpringCloud使用Feign做断路由

    5. **测试**:启动Eureka Server,然后依次启动服务提供者和服务消费者,通过服务消费者的接口调用服务提供者的方法,验证Feign的正常工作。同时,可以模拟服务提供者的异常情况,观察Hystrix断路器是否能有效保护...

    Feign的使用案例

    接下来,创建一个Feign接口,这个接口定义了远程服务的调用方法,使用`@FeignClient`注解指定服务的名称。例如,如果我们有一个名为`UserService`的服务,可以这样定义: ```java @FeignClient(name = "userService...

    SpringCloud使用Feign实现服务调用

    使用 Feign 可以进行服务的消费,且客户端负载平衡仍是通过 Ribbon 实现的。 二、使用 Spring Cloud Feign 创建服务调用方 要使用 Spring Cloud Feign 创建服务调用方,需要在 pom.xml 文件中添加以下依赖: ```...

    SpringCloud服务消费者(Ribbon+Feign)原理及示例

    本文主要探讨了在SpringCloud中如何使用Ribbon和Feign作为服务消费者的组件,以及它们背后的负载均衡原理。首先,理解服务间通信的基础是HTTP协议,而注册中心Eureka则负责维护服务实例的列表。 Ribbon和Feign都是...

    feign以XML格式传输-技术点eureka-feign-jackson.zip

    在服务消费者端,当调用服务提供者的API时,Feign会自动使用配置好的Jackson XML序列化器将Java对象转换为XML格式,然后发送请求。服务提供者接收到XML数据后,同样可以通过Jackson反序列化回Java对象。 此外,...

    springcloud-alibaba服务注册发现整合feign:webflux调用

    在整合 Feign 和 WebFlux 时,我们需要确保服务提供者的接口是基于 WebFlux 实现的,这样才能保证在服务消费者端使用 Feign 进行调用时,能够正确地处理非阻塞的响应式请求。 具体实现步骤如下: 1. **引入依赖**...

    SpringCloud-创建服务消费者-Feign方式示例代码.zip

    通过学习和实践这个示例,你将深入理解Spring Cloud Feign的工作原理和使用方式,为构建微服务架构中的服务消费者打下坚实的基础。同时,也可以了解到如何与其他Spring Cloud组件(如Eureka)协同工作,提高系统的可...

    使用Feign实现微服务间文件下载

    其次,我们需要在服务消费者端使用Feign来调用服务提供者端的文件下载接口。在下面的示例中,我们使用Feign来调用服务提供者端的文件下载接口,并使用ResponseEntity来接收下载的文件。 示例代码 在服务提供者端,...

    springcloud feign服务间的相互调用.doc

    在这个服务消费者中,我们需要使用 Feign 客户端来调用服务提供者的方法。首先,我们需要在pom.xml文件中添加spring-cloud-starter-openfeign依赖项,以便使用 Feign 客户端。 ```java @FeignClient(name = "service...

    Feign的简介及基础使用-代码部分.zip

    在服务消费者端,我们只需注入这个Feign接口,就可以像调用本地方法一样调用远程服务了: ```java @Service public class ConsumerService { @Autowired private ProviderClient providerClient; public String...

    feign-demo.7z

    在本项目中,"feign-demo.7z"是一个压缩包文件,包含了使用Spring Cloud Feign实现服务调用的相关代码示例。Feign是Spring Cloud生态中的一个组件,主要用于简化微服务之间的RESTful API调用,它通过声明式的方式...

    Spring boot2X Consul如何使用Feign实现服务调用

    在Spring Boot 2.x版本中,使用Consul作为服务注册与发现中心,并通过Feign进行服务调用,是一种常见的微服务架构实践。Feign是一个声明式的Web服务客户端,它使得编写HTTP客户端变得简单。下面我们将详细讲解如何...

    SpringCloud之四 负载均衡Feign

    3. **引入Feign依赖**:在服务消费者工程中引入Feign的起步依赖,使得该工程具备使用Feign的能力。 4. **定义Feign客户端**:创建一个接口,并使用`@FeignClient`注解定义一个Feign客户端,指向需要调用的服务。 5. ...

    SpringCloud之Feign

    - **Feign接口**: 在Feign中,服务消费者通过定义一个接口来描述远程调用,这个接口会带有注解,注解中包含了服务提供者的地址和服务接口等信息。 - **Feign Client**: 实现了HTTP客户端的功能,根据Feign接口生成...

    feign-parent.rar

    3. **服务消费者与生产者**:"eureka-client"模块展示了服务消费者的实现,如何配置和使用Feign客户端,而"eureka-server"和"eureka-feign-client"则展示了服务生产者的角色。 4. **服务降级与熔断**:虽然在这个...

    SpringCloud——声明性REST客户端(Feign)

    2. 注解接口:使用`@FeignClient`注解指定服务名,这样Feign就能从Eureka中找到对应的服务实例。 3. 使用Feign客户端:创建接口的实例,Feign会自动处理HTTP请求和响应,返回结果。 Feign还支持多种扩展,例如...

    springboot_feign:服务消费者(声明式调用)

    这个项目"springboot_feign:服务消费者(声明式调用)"显然是一个关于如何在Spring Boot应用中使用Feign作为服务消费者的示例。 1. **什么是Feign?** Feign是Netflix开源的一个声明式Web服务客户端,它通过提供一种...

    spring-cloud 原创代码例子包含服务发现、服务注册、服务路由、熔断器、feign等

    通过学习这些代码,我们可以深入掌握服务发现、注册、路由、熔断和 Feign 客户端的使用方式,为构建自己的微服务架构打下坚实基础。在实际项目中,可以根据具体需求选择和配置这些组件,以实现高可用、高并发的...

    Feign对Hystrix的支持-代码部分.zip

    1. **Feign的基本使用**:Feign通过接口定义了服务调用的方式,使用注解来指定HTTP请求的方法、URL、参数等信息。开发者只需要定义好接口,Feign会自动生成实现,实现了服务调用的声明式编程。 2. **Hystrix的集成*...

Global site tag (gtag.js) - Google Analytics