微服务远程调用组件Feign的使用详解
创始人
2024-02-07 20:11:40
0

一. 概要

我们知道,现在最火且最有技术含量的技术莫过于SpringCloud微服务了,所以今天百泽老师就带大家来学习一下微服务的核心的组件之一,Feign的基本使用及其工作机制。

Feign简介

1.概念

在学习Feign的使用之前,我们先来了解一下什么是Feign。

Feign是Netflix开发的声明式(目前由Spring在维护)、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP Api。

简单地来说,Feign就是一个用于远程调用服务的框架/工具,让开发者可以更少耦合、更少代码、更加快,也更兼容的方法进行远程服务调用。

2.功能

  • Feign可插拔的注解支持,包括Feign注解和JAX-RS注解;

  • Feign与Ribbon负载均衡器、Hystrix或Sentinel熔断器无缝集成;

  • Feign支持可插拔的HTTP编码器和解码器;

  • Feign支持HTTP请求和响应的压缩等。

了解了这些基本概念之后,接下来百泽老师就带大家看看Feign组件是如何实现远程接口调用的。废话少说,我们直接上代码。

三. 服务提供者

1.添加依赖

首先我们在父POM文件中添加核心依赖如下:

org.springframework.cloudspring-cloud-dependencies${spring-cloud.version}pomimportcom.alibaba.cloudspring-cloud-alibaba-dependencies${spring-cloud-alibaba-dependencies.version}pomimport

然后在子POM文件添加依赖如下:

org.springframework.cloudspring-cloud-starter-openfeign

com.alibaba.cloudspring-cloud-starter-alibaba-nacos-discovery

2.配置文件

application.yml文件中添加如下配置:

server:port: 8090
spring:application:name: nacos-feign-examplecloud:nacos:discovery:server-addr: 112.74.42.138:8848

3.启动类

项目的启动类代码如下:

@SpringBootApplication
public class NetflixFeignProviderApplication {public static void main(String[] args) {SpringApplication.run(NetflixFeignProviderApplication.class, args);}
}   

4.控制层

我们可以编写一个Controller控制器,将Web接口定义如下。

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {/*** 模拟主键自增*/private AtomicInteger pk = new AtomicInteger();@PostMappingpublic User save(@RequestBody User user) {user.setUid(pk.incrementAndGet());return user;}/*** @param uid* @return*/@GetMapping("/{uid}")public User user(@PathVariable("uid") int uid) {return User.builder().uid(uid).username("admin").password("123456").build();}@GetMapping("/users")public List users(@RequestHeader("token") String token) {// 模拟从数据中获取数据ArrayList users = new ArrayList<>();for (int i = 1; i <= 10; i++) {users.add(User.builder().uid(i).username(token + i).password("123456").build());}return users;}@DeleteMapping()public int delete(int uid) {log.info("删除用户: {} 成功", uid);return 1;}
} 

5.POJO

这里再定义一个pojo实体类。

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User implements Serializable {private Integer uid;private String username;private String password;
}

四. 服务消费者

1.添加依赖

消费者服务的核心依赖如下:

org.springframework.cloudspring-cloud-starter-openfeign
org.springframework.bootspring-boot-starter-web
com.alibaba.cloudspring-cloud-starter-alibaba-nacos-discovery

2.配置文件

消费者服务的application.yml配置文件如下:

server:port: 8091
spring:cloud:nacos:discovery: server-addr: 你的注册中心IP:8848application:name: feign-example-01

3.启动类

消费者服务的启动类代码。

@SpringBootApplication
// 开启Feign
@EnableFeignClients
public class NetflixFeignClientApplication {public static void main(String[] args) {SpringApplication.run(NetflixFeignClientApplication.class, args);}
}

这里也需要定义一个POJO类,代码同上,此处略过。

4.Feign服务

此处我们需要定义一个Feign接口类。

@FeignClient(value = "test-feign-provider", path = "/user")
public interface UserFeignService {@PostMapping("/")User save(@RequestBody User user);@GetMapping("/{uid}")User detail(@PathVariable("uid") int uid);@DeleteMappingUser delete(@RequestParam int uid);@GetMapping("/users")List users(@RequestHeader("token") String token);
}

5.控制层

然后我们也需要在消费者服务中定义一个Controller接口。

@RestController
@RequestMapping("/feign")
public class FeignController {@ResourceUserFeignService userFeignService;/***  传递复杂的对象 json格式* 127.0.0.1:8091/feign/register*/@PostMapping("/register")public User register(@RequestBody User user) {return userFeignService.save(user);}/*** 127.0.0.1:8091/feign/1*/@GetMapping("/{uid}")public User detail(@PathVariable int uid) {return userFeignService.detail(uid);}/*** 127.0.0.1:8091/feign/users* */@GetMapping("/users")public List users(@RequestHeader String token) {return userFeignService.users(token);}
}

代码编写完毕后,我们需要将服务提供者和服务消费者两个项目都启动起来,然后进行测试。

五. 测试

1.测试get请求

2.测试post请求,json数据格式

3.测试头部中包含信息

通过测试我们就可以发现,测试我们已经实现了在服务消费者中原创调用服务提供者里的接口,从而实现了接口的远程调用。

相关内容

热门资讯

冷空气发力!最新预报:大降温、... 昨日 江苏最高气温处于上升通道 淮河以北地区上升到33℃-34℃ 其他地区则普遍达到36℃-37℃ ...
原创 卡... 卡塔尔引爆外交核弹,伊斯兰世界百万大军首次统一战线!美军基地连夜增援,以色列战机却集体沉默——这场中...
“开票即候补”、比演唱会门票还... 9月16日,12306正式开启国庆长假高铁票预售,不少人吐槽比演唱会门票还难抢,甚至出现“开票即候补...
山东一女店主搬运啤酒时,箱内酒... 近日,山东济南一烧烤店发生意外。女店主在搬运啤酒时,箱内酒瓶突然爆炸,致其眼部受伤,上泪腺断裂且残留...
原创 以... 9月16日,以色列总理内塔尼亚胡对外宣布,其军队已启动对加沙市中心的地面进攻。这一决定并非突如其来,...
美国网球选手公开吐槽中国菜后连... 9月17日,美国网球选手汤森德公开吐槽中国菜,随后迅速发视频致歉,引发关注。 据体坛周报,9月1...
日本人出1200万求购非遗面具... 第五届湖南旅发大会9月16日至18日在怀化举办,辰河棕编傩面具非遗技艺传承人杨汉明向媒体介绍其制作的...
天门多个乡镇晒生育政策成效:年... “2025年以来,全镇共有90余对夫妇喜结良缘,出生人口151人,婚育率较往年大幅跃升。在有奖补政策...
刘毅已任河北省商务厅党组书记,... 澎湃新闻记者从河北省商务厅官网获悉,刘毅已任河北省商务厅党组书记,主持省商务厅(省自贸办、省投资促进...
曼联还需忍他多久? 英媒:7周... 尽管上赛季最终排名英超第15,输掉了欧联决赛导致本赛季无欧战,赛季开局至今4战1胜1平2负名列第14...