首页 > 技术文章 > 【Spring Cloud-Open Feign】使用OpenFeign完成声明式服务调用

zhangyibing 2020-11-28 10:36 原文

理解OpenFeign

  • OpenFeign是Netflix 开发的声明式、模板化的HTTP请求客户端。可以更加便捷、优雅地调用http api。
  • OpenFeign会根据带有注解的函数信息构建出网络请求的模板,在发送网络请求之前,OpenFeign会将函数的参数值设置到这些请求模板中。
  • OpenFeign主要是构建微服务消费端。只要使用OpenFeign提供的注解修饰定义网络请求的接口类,就可以使用该接口的实例发送RESTFUL的网络请求。还可以集成Ribbon和Hystrix,提供负载均衡和断路器。
  • 英文表意为“假装,伪装,变形”, 是一个 Http 请求调用的轻量级框架,可以以 Java 接口注解的方式调用 Http 请求,而不用像 Java 中通过封装 HTTP 请求报文的方式直接调用。通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的请求,这种请求相对而言比较直观。Feign 封装 了HTTP 调用流程,面向接口编程

Feign和OpenFeign的关系

  • Feign本身不支持Spring MVC的注解,它有一套自己的注解
  • OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。 OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口, 并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

声明式服务调用

provider方提供公用API包,Feign通过SpringMVC的注解来加载URI

好处

服务提供者发布一个API接口服务调用者引入这个包,调用服务提供者方法的时候,只需要点一下就可以把方法点出来,省去了手动拼接URL比较low的方式,同样也能够保证服务生产者和服务消费者方法统一

创建API

  • 创建一个支持web的SpringBoot项目,然后创建接口,实际项目中可根据业务灵活调整
@RequestMapping("/user")
public interface ProviderApi {
	@RequestMapping("/alive")
	public String alive();
}
  • mvn install打包一下,主要目的是为了让User-Provider和User-Consumer引入这个jar

创建User-Provider

  • 需要引入依赖:Spring Web 和 Spring Eureka Client
<!-- Spring Web -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Eureka Client -->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- APIjar包 -->
<dependency>
	<groupId>com.yibing</groupId>
	<artifactId>user-api</artifactId>
	<version>0.0.1-SNAPSHOT</version>
</dependency>
  • 新建Controller,并实现API接口
@RestController
public class ProviderController implements ProviderApi{
	@Override
	public String alive() {
		return "hello alive";
	}
}

创建User-Consumer

  • 引入依赖,包括Spring Web 和 Spring Eureka Client、Open Feign、自定义的API的jar包
<!-- Spring Web -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Eureka Client -->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- Open Feign -->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- APIjar包 -->
<dependency>
	<groupId>com.yibing</groupId>
	<artifactId>user-api</artifactId>
	<version>0.0.1-SNAPSHOT</version>
</dependency>
  • 修改启动类,加上@EnableFeignClients注解
@EnableFeignClients
@SpringBootApplication
public class UserConsumerApplication {
	public static void main(String[] args) {
		SpringApplication.run(UserConsumerApplication.class, args);
	}
}
  • 创建一个接口,继承provider提供的接口API
//注意:这里的FeignClient注解必须要加,意味着服务路由
@FeignClient(name = "user-provider")
public interface ConsumerService extends ProviderApi{
	
}
  • 在Controller中注入ConsumerService,就可以调用Provider提供的方法了
@RestController
public class ConsumerController {
	
	@Autowired
	ConsumerService consumerService;
	
	@RequestMapping("/alive")
	public String alive() {
		return consumerService.alive();
	}
}

测试

http://localhost:90/alive

推荐阅读