微服务调用-生产者与消费者3.0

本文围绕Feign Client展开,介绍其使用背景是简化服务调用。项目更新方面,生产者无需改动,消费者需导入openfeign启动器依赖、在启动类添加注解开启Feign功能、编写客户端和处理器。Feign可隐藏Rest请求,自动拼接http请求地址,避免编写大量重复代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、背景

feign简化服务调用,消费者无需再通过RestTemplate访问服务

  • 要求:消费者使用feign client调用提供者的接口
  • 技术栈:feign client
  • 目的:了解feign client的使用和优点

2、项目更新

生产者无需改动,消费者更改

a、导入openfeign启动器依赖

  • 子项目pom.xml
<!--利用feign调用提供者的接口-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.2.5.RELEASE</version>
        </dependency>

b、启动类添加注解(开启Feign功能)

@EnableFeignClients:开启feign功能,告诉框架扫描所有使用注解@FeignClient定义的feign客户端
在这里插入图片描述

c、编写客户端(UserClient接口)

UserClient.java

  • @FeignClient("服务提供者的服务名称"):声明当前类是一个Feign客户端,并指定生产者的服务名
  • 类似mapper,会通过反射创建实现类来调用生产者路径并完成增删改查功能,因此我们只需写好接口即可
  • 注意:FeignClient里的@PathVariable("name")里的name不能省略默认,否则会报异常。这一点和Controller里不一致,Controller里的可以省略默认。
package com.prlc.comsumerservice.client;

import com.prlc.comsumerservice.entity.User;
import java.util.List;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;

/**
 * <pre>
 * classname UserClient
 * description
 * </pre>
 *
 * @author pengruolan
 * @date 2021/4/12  0:25
 **/
//声明当前类是一个Feign客户端,并指定生产者的服务名
@FeignClient("provider-service-prl")
public interface UserClient {

    @GetMapping("/provider/users") /* 实际地址:http://provider-service-prl/users */
    List<User> query();

    @GetMapping("/provider/user/{id}")
    User queryById(@PathVariable("id") Integer id);

    @PostMapping("/provider/user/c")
    void createUser(User user);

    @PutMapping("/provider/user/u/{id}")
    void updateUser(@PathVariable("id") Integer id, User user);

    @DeleteMapping("/provider/user/d/{id}")
    void deleteUser(@PathVariable("id") Integer id);
}

d、编写处理器(ConsumerFeignController类)

  • ConsumerFeignController.java
package com.prlc.comsumerservice.controller;

import com.prlc.comsumerservice.client.UserClient;
import com.prlc.comsumerservice.entity.User;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * <pre>
 * classname ConsumerFeignController
 * description
 * </pre>
 *
 * @author pengruolan
 * @date 2021/4/12  0:34
 **/
@RestController
@RequestMapping("/consumer")
public class ConsumerFeignController {

    @Autowired
    private UserClient userClient;

    @GetMapping("/users")
    List<User> query() {
        return userClient.query();
    }

    @GetMapping("/user/{id}")
    User queryById(@PathVariable("id") Integer id) {
        return userClient.queryById(id);
    }

    @PostMapping("/user/c")
    void createUser(User user) {
        userClient.createUser(user);
    }

    @PutMapping("/user/u/{id}")
    void updateUser(@PathVariable("id") Integer id, User user) {
        user.setId(id);
        userClient.updateUser(id, user);
    }

    @DeleteMapping("/user/d/{id}")
    void deleteUser(@PathVariable("id") Integer id) {
        userClient.deleteUser(id);
    }

}

3、测试

在这里插入图片描述

4、感悟

  • Feign,伪装者
  • Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样,不必再自己拼接sql、拼接参数等操作,Feign会为我们完成这些操作,避免编写大量重复代码
  • Feign主要作用:自动根据参数拼接http请求地址(内部对生产者的请求地址)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值