`

spring cloud feign的基本使用

阅读更多

      在上一节,我们学会了如何使用ribbon进行来进行服务之间的调用,但是那种需要通过RestTemplate来进行调用而且当参数比较多时,使用起来就比较麻烦。那么有没有一种调用远程方法(别的服务)就像调用本地方法呢?feign就是这样的一种声明式的http客户端,使调用远程方法就像调用本地方法一样。

 

前置条件-工程的创建

eureka-server
    |- 服务注册中心
feign
    product-provider-8083
    product-provider-8084
        |- 服务提供者
    product-consumer-8082
        |- 服务消费者,使用feign进行调用(演示Feign调用各种方法的参数) 

 

需求:

    1、使用feign完成基本的curd操作
    2、使用feign调用各种传参的方法,比如传递对象,传递map,同时传递多个参数等  

 

实现步骤:

    1、新建服务提供者:
        product-provider-8083和product-provider-8084,就是一个普通的spring boot工程,对外暴露基本的crud api.
    2、新建服务提供者
        product-consumer-8082
        |- 启动类上增加 @EnableFeignClients 注解
        |- client接口上需要增加 @FeignClient(name="上面product-provider-%d工程中的spring.application.name的值") 注解
   
    3、@FeignClient注解下的方法注意事项:
        1、@PathVariable注解的使用
            使用这个注解的使用,必须要写里面的name或value的值,即@PathVariable("field"),不写启动报错
        2、返回值可以返回实体类或Map类型等等
        3、@RequestParam注解传递参数的问题
            |- 不存在@RequestParam注解
                >> 请求类型将会变成post请求,即使你在方法上指定为get也不行。这个时候可以存在一个没有带注解的参数
                   ** 示例:
                      1、  @GetMapping("product/selectByProductIdAndName")
                           Map<String, Object> selectByProductIdAndNameMap(Map<String, Object> params);
                           结果:此时是post请求,即使上方加上了@GetMapping注解也会是发送post请求
                      2、  @GetMapping("product/selectByProductIdAndName")
                           Map<String, Object> selectByProductIdAndName(String productId, String productName)
                           结果:程序启动报错,因为存在多个参数没有@RequestParam注解
            |- 存在@RequestParam注解
                >> 不指定value的情况下,必须加载Map类型的参数上,里面的值会附加在url后面
                    ** 示例:
                        1、  @GetMapping("product/selectByProductIdAndName")
                             Map<String, Object> selectByProductIdAndNameMap(@RequestParam Map<String, Object> params);
                             结果:没有指定value,注解加载map类型的参数上
                        2、  @GetMapping("product/selectByProductIdAndName")
                             Map<String, Object> selectByProductIdAndName(@RequestParam String productId, String productName);
                             结果:启动报错,没有指定value的值,且参数不是map类型
                        3、  @GetMapping("product/selectByProductIdAndName")
                             Map<String, Object> selectByProductIdAndName(@RequestParam("productId") String productId, String productName);
                             结果:由于后面有一个参数没有加上@RequestParam注解,此时这个请求就变成了post请求发送,即使申明的是get请求
                        4、  @GetMapping("product/selectByProductIdAndName")
                             Map<String, Object> selectByProductIdAndName(@RequestParam("productId") String productId, @RequestParam("productName") String productName);
                             结果:正常的get请求

            |- 传递对象
                >> 服务提供方在控制层使用的是@RequestBody接收参数
                    ** 调用方 feignClient 的写法: 直接传递一个对象(默认就是@RequestBody)
                        参考:com.huan.study.feign.ProductServiceFeign.addProduct(@RequestBody ProductVO productVO); 此时前面的@RequestBody可以不写
                >> 服务提供方没有使用@RequestBody进行接收
                    ** 调用方 feignClient 的写法: 需要传递一个Map
                        参考:com.huan.study.feign.ProductServiceFeign.updateProduct(@RequestParam Map<String,Object> params);
                            1、需要以Map的参数传递
                            2、@RequestParam注解不可少

 

代码结构:


 

代码:

1、服务提供者和注册中心(略)
2、声明式客户端feign的编写

@FeignClient(name = "product-provider")
public interface ProductServiceFeign {

	/**
	 * PathVariable 注解使用时,必须里面要有值,即@PathVariable("")或@PathVariable(name="")
	 *
	 * @param productId
	 * @return
	 */
	@GetMapping("product/selectOne/{productId}")
	ProductVO selectByProductId(@PathVariable("productId") String productId);

	/**
	 * 去掉 @RequestParam 注解将变成post请求,加上为get请求
	 *
	 * @param params
	 * @return
	 */
	@GetMapping("product/selectByProductIdAndName")
	Map<String, Object> selectByProductIdAndNameMap(@RequestParam Map<String, Object> params);

//	程序启动报错,存在多个参数没有@requestParam注解
//	@GetMapping("product/selectByProductIdAndName")
//	Map<String, Object> selectByProductIdAndName(String productId, String productName);

//  程序启动报错,没有指定value的值,且参数不是map
//	@GetMapping("product/selectByProductIdAndName")
//	Map<String, Object> selectByProductIdAndName(@RequestParam String productId, String productName);

//  由于后面有一个参数没有加上@RequestParam注解,此时这个请求就变成了post请求发送,即使申明的是get请求
//	@GetMapping("product/selectByProductIdAndName")
//	Map<String, Object> selectByProductIdAndName(@RequestParam("productId") String productId, String productName);

	@GetMapping("product/selectByProductIdAndName")
	Map<String, Object> selectByProductIdAndName(@RequestParam("productId") String productId, @RequestParam("productName") String productName);

	@PostMapping("product/addProduct")
	Map<String, Object> addProduct(@RequestBody ProductVO productVO);

	@PostMapping("product/updateProduct")
	Map<String, Object> updateProduct(@RequestParam Map<String, Object> params);

	@PostMapping("product/delete")
	Map<String, Object> delteProduct(@RequestParam("productId") String productId);

}

 

参数传递对应图:

 

 

  • 大小: 25.3 KB
  • 大小: 314.5 KB
分享到:
评论

相关推荐

    Spring Cloud Feign统一设置验证token实现方法解析

    在微服务架构中, token验证是非常重要的安全机制之一,本文将主要介绍如何使用Spring Cloud Feign统一设置验证token实现方法解析。 首先,我们需要了解Feign组件的工作机制。Feign组件是一个基于Annotation的接口...

    微服务springcloud之feign使用demo

    RS注解,SpringCloud又为Feign增加了对SpringMVC注解的支持,同时为了能够使用和Spring Web中默认使用的相同的httpMessageConverter,SpringCloud集成了Ribbon和Eureka,用来在使用Feign时能够为其提供一个负载均衡...

    springcloud feign 服务消费者 类似 webservice

    Spring Cloud Feign是Spring Cloud生态系统中的一个组件,它作为一个声明式的服务调用客户端,使得编写Web服务客户端变得简单。Feign的设计灵感来源于Netflix的Feign库,它的主要目的是简化微服务之间的通信,使得...

    spring cloud feign方式使用服务

    【Spring Cloud Feign服务使用详解】 在分布式系统中,服务间的通信是至关重要的,Spring Cloud Feign就是一种声明式的服务调用工具,它使得服务之间的调用变得简单且直观。Feign是Netflix开源的一个接口绑定工具,...

    springcloud feign服务间的相互调用.doc

    这些依赖项都是 Spring Cloud Feign 需要的基本组件。 接下来,我们需要创建一个服务提供者接口。在这个接口中,我们可以定义一些方法,以便供其他服务调用。例如: ```java @FeignClient(name = "service-provider...

    spring cloud feign demo

    Spring Cloud Feign 是一个声明式的 Web 服务客户端,它使得编写 Web 服务客户端变得简单。Feign 让消费者能够以一种声明式的方式定义接口,这些接口将被自动映射到 HTTP 请求。它整合了 Ribbon 和 Eureka,可以方便...

    spring cloud feign实现远程调用服务传输文件的方法

    在本文中,我们将介绍如何使用 Spring Cloud Feign 实现远程调用服务传输文件的方法。 Feign 介绍 Feign 是一个声明式的 Web 服务客户端,它可以将 Java 接口转换为对应的 HTTP 请求。Feign 使得 Java 程序员可以...

    springcloud feign整合hystrix(服务降级).doc

    在Spring Cloud微服务架构中,Feign和Hystrix是两个重要的组件,它们协同工作以实现服务间的调用和容错处理。Feign是一个声明式的Web服务客户端,它使得编写Web服务客户端变得简单,而Hystrix则是一个用于处理延迟和...

    springcloud-feign.zip

    springcloud整合openFeign,包括feign的基本使用、传参、指定特定的服务器、负载均衡等使用方法。 模块有: springcloud-feign-api springcloud-feign-consumer springcloud-feign-provider springcloud-feign-...

    75-Spring Cloud Feign使用笔记1

    在本文中,我们将深入探讨如何使用 Feign,并了解其与 Spring Cloud 结合的工作原理。 首先,要在主应用类中启用 Feign,你需要添加 `@EnableFeignClients` 注解。这会告诉 Spring 扫描并创建 Feign 客户端实例,...

    SpringCloud之Feign

    【SpringCloud之Feign】是Spring Cloud生态体系中一个重要的组件,主要用于服务间的调用,实现了声明式的服务调用,极大地简化了微服务之间的通信。Feign基于Netflix Hystrix进行了整合,支持服务熔断,提高了系统的...

    Spring Cloud中关于Feign的常见问题总结

    SpringCloud中关于Feign的常见问题总结,包括常用的请求注解、@PathVariable、FeignClient多参数的构造等

    spring cloud feign不支持@RequestBody+ RequestMethod.GET报错的解决方法

    在使用spring cloud feign时,我们可能会遇到org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported的报错,这是因为feign client中的RequestMethod.GET或@...

    SpringCloud-创建服务消费者-Feign方式示例代码.zip

    在这个名为"SpringCloud-创建服务消费者-Feign方式示例代码.zip"的压缩包中,我们预计将看到一个简单的Spring Cloud应用,该应用展示了如何利用Feign作为服务消费者来调用其他服务。 首先,让我们了解Feign的基本...

    糞坑-SpringCloud中使用Feign的坑

    本文将深入探讨在SpringCloud中使用Feign时可能出现的问题,并提供解决方案。 首先,我们来理解Feign的工作原理。Feign是基于Java的注解和HTTP的客户端,它可以创建一个接口并将其动态地实现为HTTP客户端。通过在...

    Spring Cloud Feign 自定义配置(重试、拦截与错误码处理) 代码实践

    Spring Cloud Feign是Spring Cloud中用于简化微服务调用的一个重要组件,它与Ribbon和Eureka共同工作,提供了声明式的服务调用功能。 在实际开发中,开发者可能会遇到需要对Feign的默认行为进行定制化配置的场景。...

    Spring Cloud 之 Eureka集群整合Zuul、Feign-源码

    在实际开发中,还需要考虑安全、性能优化等因素,例如使用Ribbon进行客户端负载均衡,添加Hystrix熔断机制以防止服务雪崩,以及使用Spring Cloud Gateway替换Zuul以获取更多高级特性。 总之,通过Eureka集群实现...

    38-Spring Cloud Feign重试1

    Spring Cloud Feign 重试机制是微服务架构中不可或缺的一部分,它确保了服务间的通信可靠性。Feign 是基于声明式的客户端,它通过 Ribbon 进行客户端负载均衡来调用其他服务。Ribbon 提供了自动重试的功能,使得在...

    SpringCloud项目源码下载.docx

    通过以上介绍,我们不仅了解了Spring Cloud的基本概念和核心组件,还掌握了如何下载并使用其源码进行深入学习的方法。这对于开发者来说是非常宝贵的学习资源,有助于更好地理解和应用Spring Cloud技术栈。

Global site tag (gtag.js) - Google Analytics