Feign(简介和使用)

前言

在以往的单工程项目,所有代码都融合在一起,业务相互调用只需要引入共有的工具类或者对应模块的service。

但是到了微服务时代,已然不能使用这种方式,我们需要寻找新的解决方案。

若每个模块都把需要调用模块的service拷贝一份,那会令代码非常冗余,影响整个工程的健壮性。

稍大一些的系统,会分成多个库,比如用户库、订单库分开,订单服务想要取到用户的相关信息,由于不能连接到用户的库,所以无法直接新建数据库查询以达到目的。

这个时候,远程调用方案出现,订单服务只需调用用户服务的API,就可以获取所需信息,非常方便。

我们下面来学习,如何使用SpringCloud的Feign来进行微服务远程调用。

Feign简介

Feign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用Feign, 我们可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。

代码示例

1、 我们以“服务A”中的服务为例,让我们的“服务B”可以调用到“服务A”的API

2、 在“服务A”的API工程中创建一个新的 package , feign

3、 在 package , feign 下创建一个接口类,命名为 “XXXClient”

4、 增加如下代码

import org.springblade.common.constant.CommonConstant;
import org.springblade.core.tool.api.R;
import org.springblade.demo.entity.Blog;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

//定义Feign指向的service-id
//value是服务A的服务名
@FeignClient(value = CommonConstant.APPLICATION_DEMO_NAME)
public interface BlogClient{

	/**
	* 接口前缀
	*/
	String API_PREFIX = "/api/blog";

	/**
	* 获取详情
	* @param id 主键
	* @return
	*/
	@GetMapping(API_PREFIX + "/detail")
	R<Blog> detail(@RequestParam("id") Integer id);
}

5、 在“服务A”增加feign的实现类 “XXXClientImpl”

6、增加代码如下,因为Feign本质上是HTTP客户端,所以我们创建的 BlogClientImpl 其实就是
SpringMVC 的 Controller ,所以需要加上 @RestController 注解

import lombok.AllArgsConstructor;
import org.springblade.core.tool.api.R;
import org.springblade.demo.entity.Blog;
import org.springblade.demo.service.BlogService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@AllArgsConstructor
public class BlogClientImpl implements BlogClient {

	private BlogService service;

	@Override
	@GetMapping(API_PREFIX + "/detail")
	public R<Blog> detail(Integer id) {
		return R.data(service.getById(id));
	}
}

7、 还需要在“服务A”的启动类加上@EnableFeignClients注解,开启远程调用

8、 在 “服务B” 模块的 pom.xml 文件引入 “服务A” 的API包

9、 在“服务B”的Controller新增如下代码

private BlogClient client;

@GetMapping("/blog-detail")
public R<Blog> blogDetail(Integer id) {
	R<Blog> result = client.detail(id);
	return result;
}

10、 启动 “服务B” 并使用Postman调用查看API远程调用成功

 

11、 整个请求先到了 /dashboard/blog-detail ,由于调用了 Feign ,程序又根据 Feign 的配置去查找名为 blade-demo 的服务,并调用对应方法,最后返回了所需数据,整个流程非常清晰
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值