spring-cloud-starter-openfeign是Spring Cloud项目中的一个模块,用于集成OpenFeign,这是一种声明式的HTTP客户端工具。它允许开发者通过注解的方式调用REST API服务,而不需要编写大量的底层HTTP请求代码。
那么,这个框架应该怎么使用呢?
一、在独立项目中的应用
假设有一个Api接口项目A,需要被另一个项目B调用,A和B分别是独立的两个项目。
第一步,添加依赖
在B项目的pom中引入spring-cloud-starter-openfeign模块。
第二步,启用Feign客户端
@EnableFeignClients
@SpringBootApplication
public class App{
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
第三步,创建Feign客户端接口
在B项目中,定义一个接口,并使用@FeignClient指定要调用的服务名和路径。使用Spring MVC的注解来绑定具体的服务操作。
第四步,配置服务URL
上一步注解中${feign-test-a2.url}属性需要在配置文件中进行配置。
在项目B的application.properties文件中增加Feign URL的配置。
第五步,使用Feign客户端
在B项目中注入Feign客户端,并使用它调用A项目的接口。
import org.feign.test.a1.feign.FeignClientApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class IndexController {
@Autowired
private FeignClientApi feignClientApi;
@GetMapping("/index")
public String getData() {
return feignClientApi.getData("这是首页,feign第一种方式测试");
}
}
最后,测试
在A项目中需要保证有一个/data接口。
@RestController
public class IndexController {
@GetMapping(value = "/data")
public String getData(@RequestParam("param") String param) {
// 处理逻辑
return "Data for param: " + param;
}
}
分别启动A和B项目,在浏览器输入B项目地址,验证调用结果。
从上面这个示例中,我们可以看到,spring-cloud-starter-openfeign本质上还是通过URL进行第三方的REST API 服务调用的,只不过对URL进行了二次包装,调用者加个注解就可以正常调用接口了。
二、在微服务集群中的应用
假设有一个微服务集群项目,在集群中有A、B、C、D、E、F、P1和P2八个子项目。A是注册中心,B是配置中心,C是工具集合,D是实体类,E是Dao类,F是Service类,P1和P2是两个单独的项目。现在又新加了一个子项目P3,P1和P2都需要调用P3项目的服务。
在这种情况下,上一种调用方式就不适合了,我们采用第二种方式。
第一步,创建P3项目
在集群中创建P3项目,像创建P1、P2项目一样创建P1项目,没有什么特别之处。
第二步,添加依赖
在项目的pom中引入spring-cloud-starter-openfeign。哪个项目需要哪个项目引入。
由于在这个集群中有好几个项目需要,因此我把它放在了父类的pom文件中。
由于该pom中已经对 spring-cloud-dependencies 做了依赖管理,因此这里就不需要填写版本号了。
第三步,创建Feign客户端接口
由于P1和P2都引入了F项目,因此在这里把Feign 客户端接口放在了F项目里。
@FeignClient("p3")
public interface FeignClientApi {
@GetMapping("/data")
String getData(@RequestParam("param") String param);
}
由于P1和P2都引入了F项目,相当于P1和P2都包含了Feign 客户端接口。
第四步,启用Feign客户端
哪个项目使用哪个项目启用。因此在这里,我们在P1和P2的主类上增加启用 Feign 客户端的注解。
@EnableFeignClients
@SpringBootApplication
public class A1App{
public static void main(String[] args) {
SpringApplication.run(A1App.class, args);
}
}
第五步,使用Feign客户端
在P1和P2项目需要的地方调用FeignClientApi接口即可,这里就不演示了。
我们来看下这个集群项目的结构图:
微服务项目集群
├── pom.xml
├── A 注册中心
│ └── pom.xml
├── B 配置中心
│ └── pom.xml
└── C 工具集合
│ └── pom.xml
├── D 实体对象
│ └── pom.xml
├── E Dao类
│ └── pom.xml
├── F Service类
│ └── pom.xml
├── P1 项目
│ └── pom.xml
├── P2 项目
│ └── pom.xml
├── P3 项目
│ └── pom.xml............
在这个示例里, Feign客户端的使用依赖于注册中心的服务发现,有了服务发现我们才能知道Feign客户端接口所指的是哪个项目。如果没有部署在一个服务器上,还是需要指定URL的。
在微服务架构中,服务之间通常通过 HTTP 接口通信,Feign提供了一种简洁的方式来调用其他服务的 API。
三、最后总结
从上面两种使用方式的对比,我们可以发现,spring-cloud-starter-openfeign框架是针对调用方的框架,被调用的项目保持不变。谁需要调用,谁使用这个框架。
方式一,提供了一个独立的项目作为Feign客户端,适合于项目模块较少且需求简单的情况。
方式二,将Feign客户端接口放在公共模块中,便于多个子项目共享接口定义,适合于项目模块较多且需要统一管理接口定义的情况。
两种方式选择哪种方法,取决于项目架构和管理需求。你学会了吗?
领取专属 10元无门槛券
私享最新 技术干货