【Spring Cloud】Feign组件的使用及参数的传递

2024-01-07 19:03:55

🎉🎉欢迎来到我的CSDN主页!🎉🎉

🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚

🌟推荐给大家我的专栏《Spring Cloud》。🎯🎯

👉点击这里,就可以查看我的主页啦!👇👇

Java方文山的个人主页

🎁如果感觉还不错的话请给我点赞吧!🎁🎁

💖期待你的加入,一起学习,一起进步!💖💖

请添加图片描述

?🌟前言

现在消费服务确实知道生产服务在哪里了,同时也监听着哪些端口号了。但是新问题又来了:难道消费服务要自己写一大堆代码,跟其他服务建立网络连接,然后构造一个复杂的请求,接着发送请求过去,最后对返回的响应结果再写一大堆代码来处理吗?

实际上你进行服务间调用时,如果每次都手写代码,代码量比上面那段要多至少几倍,所以这个事压根儿就不是地球人能干的。

既然如此,那怎么办呢?别急,Feign早已为我们提供好了优雅的解决方案。来看看如果用Feign的话,你的消费服务调用生产服务的代码会变成啥样?

?Feign案例实操

🍃依赖导入

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

🍃开启Feign

在需要开启远程消费的启动类上加上?@EnableFeignClients注解

@EnableFeignClients

🍃Server创建与调用

因为我们是模拟消费服务调用生产服务,所以我们先为生产服务创建一个controller并写好方法

@RestController
@Slf4j
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/{account}")
    public String getByPath(@PathVariable(value = "account") String account) {
        log.info("account:{}", account);
        return "🍗";
    }

    @RequestMapping("/param")
    public String getByParam(@RequestParam("account") String account, 
                             @RequestParam("password") String password) {
        log.info("account:{},password:{}", account,password);
        return "🍗";
    }

    @RequestMapping("/pojo")
    public String getByPojo(@RequestBody UserDto user){
        log.info("user:{}", user);
        return "🍗";
    }

    @RequestMapping("/more")
    public String getByMore(@RequestBody Map<String, Object> map){
        log.info("map:{}", map);
        return "🍗";
    }

}

这里用到UserDto,以下是UserDto的代码

@Data
public class UserDto {

    private String account;
    private String password;
}
DTO 封装
  • VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据 封装起来。
  • DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是 为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的 性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。
  • DO(Domain Object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。
  • PO(Persistent Object):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一 一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应 PO的一个(或若干个)属性。

那么我们消费服务应该怎么调呢?我们只需像定义方法那样简单首先写一个UserService接口

@FeignClient("produce")
@RequestMapping("/user")
public interface FeignUserService {
    
    @RequestMapping("/{account}")
    public String getByPath(@PathVariable(value = "account") String account);

    @RequestMapping("/param")

    public String getByParam(@RequestParam("account") String account,
                             @RequestParam("password") String password);

    @RequestMapping("/pojo")
    public String getByPojo(@RequestBody UserDto user);

    @RequestMapping("/more")
    public String getByMore(@RequestBody Map<String, Object> map);
}

注意@FeignClient用于在Spring Cloud中定义一个Feign客户端

?我们消费服务直接调用就可以了

@RestController
public class ConsumeController {

    //调用生产服务
    @Autowired
    private FeignUserService feignUserService;

    @RequestMapping("/test01")
    public String test01() {
        return feignUserService.getByParam("Java方文山","123");
    }
}

?可以看到我调用的是消费服务的test01方法,返回的却是生产服务的返回值,并且网页上只发送了一个请求,说明我们的Feign生效了,只有一个请求是因为请求生产服务的请求是后端发送的,前端不会捕捉到。

?🍃对象传参的处理

刚刚我们定义生产服务的时候有一个方法需要传递一个对象过来,那么我们在消费服务的接口定义的时候这个方法必然是报错的,我们没有这个对象,那么我们应该怎么解决这个问题呢?我这里提供两种解决方案

①方法一

可以直接将所需要对象复制到指定的服务中

?但是这样有一个坏处,如果需要调用多个服务中的方法,那岂不是都要复制过来,我们的实体对象会越来越多。

②方法二

我们可以直接创建一个公共模块专门存放我们的公共实体提供其他服务使用

注意将pom文件的打包方式改为jar包

将我们的公共实体对象放入

现在我们别的服务是拿不到该实体对象的,所以需要引入

        <dependency>
            <groupId>org.example</groupId>
            <artifactId>common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

现在我们别的服务也可以拿到该对象了

请添加图片描述?

到这里我的分享就结束了,欢迎到评论区探讨交流!!

💖如果觉得有用的话还请点个赞吧 💖

文章来源:https://blog.csdn.net/weixin_74318097/article/details/135432763
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。