首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SpringBoot应用SpringCloud微服务框架spring-cloud-starter-openfeign的两种用法

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客户端接口放在公共模块中,便于多个子项目共享接口定义,适合于项目模块较多且需要统一管理接口定义的情况。

两种方式选择哪种方法,取决于项目架构和管理需求。你学会了吗?

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OPD2RQ9h7CU77l-TNyRL2lQw0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券