• 微服务远程调用组件Feign的使用详解


    一. 概要

    我们知道,现在最火且最有技术含量的技术莫过于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文件中添加核心依赖如下:

    1. <dependencyManagement>
    2. <dependencies>
    3. <dependency>
    4. <groupId>org.springframework.cloudgroupId>
    5. <artifactId>spring-cloud-dependenciesartifactId>
    6. <version>${spring-cloud.version}version>
    7. <type>pomtype>
    8. <scope>importscope>
    9. dependency>
    10. <dependency>
    11. <groupId>com.alibaba.cloudgroupId>
    12. <artifactId>spring-cloud-alibaba-dependenciesartifactId>
    13. <version>${spring-cloud-alibaba-dependencies.version}version>
    14. <type>pomtype>
    15. <scope>importscope>
    16. dependency>
    17. dependencies>
    18. dependencyManagement>

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

    1. <dependency>
    2. <groupId>org.springframework.cloudgroupId>
    3. <artifactId>spring-cloud-starter-openfeignartifactId>
    4. dependency>
    5. <dependency>
    6. <groupId>com.alibaba.cloudgroupId>
    7. <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    8. dependency>

    2. 配置文件

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

    1. server:
    2. port: 8090
    3. spring:
    4. application:
    5. name: nacos-feign-example
    6. cloud:
    7. nacos:
    8. discovery:
    9. server-addr: 112.74.42.138:8848

    3. 启动类

    项目的启动类代码如下:

    1. @SpringBootApplication
    2. public class NetflixFeignProviderApplication {
    3. public static void main(String[] args) {
    4. SpringApplication.run(NetflixFeignProviderApplication.class, args);
    5. }
    6. }

    4. 控制层

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

    1. @RestController
    2. @RequestMapping("/user")
    3. @Slf4j
    4. public class UserController {
    5. /**
    6. * 模拟主键自增
    7. */
    8. private AtomicInteger pk = new AtomicInteger();
    9. @PostMappingpublic User save(@RequestBody User user) {
    10. user.setUid(pk.incrementAndGet());
    11. return user;
    12. }
    13. /**
    14. * @param uid
    15. * @return
    16. */@GetMapping("/{uid}")
    17. public User user(@PathVariable("uid") int uid) {
    18. return User.builder()
    19. .uid(uid)
    20. .username("admin")
    21. .password("123456")
    22. .build();
    23. }
    24. @GetMapping("/users")
    25. public List users(@RequestHeader("token") String token) {
    26. // 模拟从数据中获取数据
    27. ArrayList users = new ArrayList<>();
    28. for (int i = 1; i <= 10; i++) {
    29. users.add(User.builder()
    30. .uid(i)
    31. .username(token + i)
    32. .password("123456")
    33. .build());
    34. }
    35. return users;
    36. }
    37. @DeleteMapping()
    38. public int delete(int uid) {
    39. log.info("删除用户: {} 成功", uid);
    40. return 1;
    41. }
    42. }

    5. POJO

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

    1. @Data
    2. @AllArgsConstructor
    3. @NoArgsConstructor
    4. @Builder
    5. public class User implements Serializable {
    6. private Integer uid;
    7. private String username;
    8. private String password;
    9. }

    四. 服务消费者

    1. 添加依赖

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

    1. <dependency>
    2. <groupId>org.springframework.cloudgroupId>
    3. <artifactId>spring-cloud-starter-openfeignartifactId>
    4. dependency>
    5. <dependency>
    6. <groupId>org.springframework.bootgroupId>
    7. <artifactId>spring-boot-starter-webartifactId>
    8. dependency>
    9. <dependency>
    10. <groupId>com.alibaba.cloudgroupId>
    11. <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    12. dependency>

    2. 配置文件

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

    1. server:
    2. port: 8091
    3. spring:
    4. cloud:
    5. nacos:
    6. discovery:
    7. server-addr: 你的注册中心IP:8848
    8. application:
    9. name: feign-example-01

    3. 启动类

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

    1. @SpringBootApplication
    2. // 开启Feign
    3. @EnableFeignClients
    4. public class NetflixFeignClientApplication {
    5. public static void main(String[] args) {
    6. SpringApplication.run(NetflixFeignClientApplication.class, args);
    7. }
    8. }

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

    4. Feign服务

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

    1. @FeignClient(value = "test-feign-provider", path = "/user")
    2. public interface UserFeignService {
    3. @PostMapping("/")
    4. User save(@RequestBody User user);
    5. @GetMapping("/{uid}")
    6. User detail(@PathVariable("uid") int uid);
    7. @DeleteMappingUser delete(@RequestParam int uid);
    8. @GetMapping("/users")
    9. List users(@RequestHeader("token") String token);
    10. }

    5. 控制层

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

    1. @RestController
    2. @RequestMapping("/feign")
    3. public class FeignController {
    4. @Resource
    5. UserFeignService userFeignService;
    6. /**
    7. * 传递复杂的对象 json格式
    8. * 127.0.0.1:8091/feign/register
    9. */@PostMapping("/register")
    10. public User register(@RequestBody User user) {
    11. return userFeignService.save(user);
    12. }
    13. /**
    14. * 127.0.0.1:8091/feign/1
    15. */@GetMapping("/{uid}")
    16. public User detail(@PathVariable int uid) {
    17. return userFeignService.detail(uid);
    18. }
    19. /**
    20. * 127.0.0.1:8091/feign/users
    21. *
    22. */@GetMapping("/users")
    23. public List users(@RequestHeader String token) {
    24. return userFeignService.users(token);
    25. }
    26. }

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

    五. 测试

    1. 测试get请求

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

    3. 测试头部中包含信息

    通过测试我们就可以发现,测试我们已经实现了在服务消费者中原创调用服务提供者里的接口,从而实现了接口的远程调用。现在你学会了吗?如果你还不明白,可以私信我哦。

  • 相关阅读:
    Aspose.total帮助某软件公司程序实现高效自定义文档操作
    线程安全实例 --- 计时器
    ⭐️【实用】Mybatis入门&使用
    C#捕捉全局异常
    条例26~30(实现)
    Bags Game
    神经网络训练过程可视化,深度神经网络训练方法
    Vue系列之入门篇
    3. executors
    kettle应用-数据库表插入/更新
  • 原文地址:https://blog.csdn.net/syc000666/article/details/127993604