1、Feign
OpenFeign是Netflix开发的声明式、模板化的HTTP请求客户端,可以更加便捷、优雅地调用http api。OpenFeign会根据带有注解的函数信息构建出网络请求的模板,在发送网络请求之前,OpenFeign会将函数的参数值设置到这些请求模板中。Feign主要是构建微服务消费端,只要使用OpenFeign提供的注解修饰定义网络请求的接口类,就可以使用该接口的实例发送RESTful的网络请求,还可以集成Ribbon和Hystrix,提供负载均衡和断路器。是一个 Http 请求调用的轻量级框架,可以用Java 接口注解的方式调用 Http 请求,而不用像 Java 中通过封装 HTTP 请求报文的方式直接调用,通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的请求,这种请求相对而言比较直观。
2、Feign和OpenFeign的关系
Feign本身不支持Spring MVC的注解,它有一套自己的注解。
OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequestMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
3、项目搭建
(1)创建项目User-Provider
选择依赖:Spring web、Eureka Discovery Client
(2)创建项目User-API
选择依赖:spring-boot-starter-web
创建一个接口 RegisterApi
@RequestMapping("/User")
public interface RegisterApi {
@GetMapping("/isAlive")
public String isAlive();
}
(3)User-Provider 实现API
配置文件
eureka.client.service-url.defaultZone=http://euk1.com:7001/eureka/
server.port=81
spring.application.name=user-provider
引入API
- maven install User-Api项目
- User-Provider的Pom.xml添加依赖
<dependency>
<groupId>com.example.User-API</groupId>
<artifactId>User-API</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
创建UserController,并实现Api的接口
@RestController
public class UserController implements RegisterApi {
@Override
public String isAlive() {
return "ok";
}
}
(4)Consumer调用
创建项目User-Consumer
选择依赖:Spring web、Eureka Discovery Client、OpenFeign
引入API:在Pom.xml添加依赖
<dependency>
<groupId>com.example.User-API</groupId>
<artifactId>User-API</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
配置文件:
eureka.client.service-url.defaultZone=http://euk1.com:7001/eureka/
server.port=90
spring.application.name=consumer
创建Service接口
@FeignClient(name = "user-provider")
public interface UserConsumerService extends RegisterApi {
}
创建Controller
@RestController
public class ConsumerController {
@Autowired
UserConsumerService consumerSrv;
@GetMapping("/alive")
public String alive() {
return consumerSrv.isAlive();
}
}
修改启动类
@SpringBootApplication
@EnableFeignClients
public class UserConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(UserConsumerApplication.class, args);
}
}
(5)测试
访问 http://localhost:90/alive 即可完成声明式远程服务调用