• 微服务远程调用组件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.cloud</groupId>
    5.       <artifactId>spring-cloud-dependencies</artifactId>
    6.       <version>${spring-cloud.version}</version>
    7.       <type>pom</type>
    8.       <scope>import</scope>
    9.     </dependency>
    10.     
    11.     <dependency>
    12.       <groupId>com.alibaba.cloud</groupId>
    13.       <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    14.       <version>${spring-cloud-alibaba-dependencies.version}</version>
    15.       <type>pom</type>
    16.       <scope>import</scope>
    17.     </dependency>
    18.   </dependencies>
    19. </dependencyManagement>

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

    1. <dependency>
    2.   <groupId>org.springframework.cloud</groupId>
    3.   <artifactId>spring-cloud-starter-openfeign</artifactId>
    4. </dependency>
    5. <dependency>
    6.   <groupId>com.alibaba.cloud</groupId>
    7.   <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    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.     
    10.     @PostMappingpublic User save(@RequestBody User user) {
    11.         user.setUid(pk.incrementAndGet());
    12.         return user;
    13.     }
    14.     /**
    15.      * @param uid
    16.      * @return
    17.      */@GetMapping("/{uid}")
    18.     public User user(@PathVariable("uid") int uid) {
    19.         return User.builder()
    20.                 .uid(uid)
    21.                 .username("admin")
    22.                 .password("123456")
    23.                 .build();
    24.     }
    25.     @GetMapping("/users")
    26.     public List<User> users(@RequestHeader("token"String token) {
    27.         // 模拟从数据中获取数据
    28.         ArrayList<User> users = new ArrayList<>();
    29.         for (int i = 1; i <= 10; i++) {
    30.             users.add(User.builder()
    31.                     .uid(i)
    32.                     .username(token + i)
    33.                     .password("123456")
    34.                     .build());
    35.         }
    36.         return users;
    37.     }
    38.     @DeleteMapping()
    39.     public int delete(int uid) {
    40.         log.info("删除用户: {} 成功", uid);
    41.         return 1;
    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.cloud</groupId>
    3.     <artifactId>spring-cloud-starter-openfeign</artifactId>
    4. </dependency>
    5. <dependency>
    6.     <groupId>org.springframework.boot</groupId>
    7.     <artifactId>spring-boot-starter-web</artifactId>
    8. </dependency>
    9. <dependency>
    10.     <groupId>com.alibaba.cloud</groupId>
    11.     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    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.     /**
    8.      *  传递复杂的对象 json格式
    9.      * 127.0.0.1:8091/feign/register
    10.      */@PostMapping("/register")
    11.     public User register(@RequestBody User user) {
    12.         return userFeignService.save(user);
    13.     }
    14.     /**
    15.      * 127.0.0.1:8091/feign/1
    16.      */@GetMapping("/{uid}")
    17.     public User detail(@PathVariable int uid) {
    18.         return userFeignService.detail(uid);
    19.     }
    20.     /**
    21.      * 127.0.0.1:8091/feign/users
    22.      * 
    23.      */@GetMapping("/users")
    24.     public List<User> users(@RequestHeader String token) {
    25.         return userFeignService.users(token);
    26.     }
    27. }

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

    五. 测试

    1.测试get请求

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

    3.测试头部中包含信息

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

  • 相关阅读:
    内核中内存数据迁移速度对比
    keras fit_generator 增加并行度问题 use_multiprocessing
    基于Siamese网络的zero-shot意图分类
    【NLP】多语言预训练模型(mBERT和XLM)
    Java学习随便记2
    爱数SMART 2022峰会开启,分享数据战略与建设数据驱动型组织方法论
    Hive(16):Hive调优之HQL语法优化
    数据挖掘与机器学习:循环结构
    牛客小白月赛#59(A~F)
    聊聊RabbitMQ
  • 原文地址:https://blog.csdn.net/finally_vince/article/details/127983094