当前位置:   article > 正文

22.OpenFeign调用第三方服务_openfeign调用第三方接口

openfeign调用第三方接口

1.在pom.xml文件中添加OpenFeign的依赖.OpenFeign中集成了ribbion实现负载均衡

<!-- OpenFeign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

2. SpringBoootApplication启动类上使用@EnableFeignClients标签来开启OpenFeign组件的使用

@SpringBootApplication
@EnableFeignClients //开启OpenFeign组件的使用
public class OrderServerApplication1020 {
    public static void main(String[] args) {
        SpringApplication.run(OrderServerApplication1020.class);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3.创建Feign接口(第三方服务的客户端),使用@FeignClient标签.其中value配置为第三方服务的服务名称,接口方法和服务端的接口方法完全保持一致,无论是参数还是返回值以及访问地址.

@FeignClient(value = "user-server")
public interface UserClient {
    //Restful方式
    //调用目标服务的controller的方法,和UseController中的方法路径保持一致
    @GetMapping("/user/{id}")
    User getById(@PathVariable Long id);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4.OpenFegin调用服务

4.1 第一种:无参,客户端和服务器端的方法保持一致即可

4.1.1 服务端 UserController:

//用户服务
@RestController
@Slf4j
public class UserController {
    @GetMapping("/product/findAll")
    public Map<String,Object> findAll(){
        log.info("商品服务查询所有调用成功,当前服务端口:[{}]",port);
        Map<String, Object> map = new HashMap<>();
        map.put("msg","服务调用成功,服务提供端口为: "+port);
        map.put("status",true);
        return map;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

4.1.2 客户端 UserClient接口 :

@FeignClient(value = "user-server")
public interface UserClient {
    //第一种:无参
    @GetMapping("/product/findAll")
    public Map<String,Object> findAll();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4.1.3 调用端 OrderController:

//订单服务
@RestController
@Slf4j
public class OrderController {
    @Autowired
    private UserClient userClient;
    //第一种:无参
    @GetMapping("/feign/findAll")
        public Map<String,Object> test2() {
        log.info("进入测试feign调用的方法...");
        Map<String, Object> map = userClient.findAll();
        log.info("调用商品服务返回的信息:[{}]", map);
        return map;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

4.2 第二种:GET方式传参,参数需使用@RequestParam标签

4.2.1 服务端 UserController:

//Get传参测试
@GetMapping("/product/findOne")
public Map<String,Object> findOne(@RequestParam("productId") String productId) throws Exception {
    log.info("商品服务,接收到的商品id为:[{}]",productId);
    Map<String, Object> map = new HashMap<>();
    //Thread.sleep(2000);
    map.put("productdId",productId);
    map.put("msg","根据商品id查询商品信息成功!");
    map.put("status",true);
    map.put("port", port);
    return map;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

4.2.2 客户端 UserClient接口 :

//根据商品id查询商品信息
@GetMapping("/product/findOne")
//注意使用openfeign 的GET方式传递参数 参数变量必须通过@RequestParam注解进行修饰
Map<String,Object> findOne(@RequestParam("productId") String productId);
  • 1
  • 2
  • 3
  • 4

4.2.3 调用端 OrderController:

//测试参数GET方式调用传参
@GetMapping("/feign/findOne")
public Map<String,Object> test3(String id ){
    log.info("进入测试feign的GET方式传递参数...");
    Map<String, Object> map = userClient.findOne(id);
    log.info("调用商品服务返回的信息:[{}]",map);
    return map;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4.3 第三种:POST方式传参,

4.3.1. 传递普通键值对参数,参数使用标签@RequestParam

4.3.1.1 服务端 UserController:

@PostMapping("/product/save")
public Map<String,Object> save(@RequestParam("name") String name){
    log.info("商品服务,接收到的商品name为:[{}]",name);
    Map<String, Object> map = new HashMap<>();
    map.put("name",name);
    map.put("msg","添加商品信息成功!");
    map.put("status",true);
    map.put("port", port);
    return map;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

4.3.1.2 客户端 UserClient接口 :

//注意使用openfeign 的Post方式传递参数 参数变量必须通过@RequestParam注解进行修饰
@PostMapping("/product/save")
Map<String,Object> save(@RequestParam("name") String name);
  • 1
  • 2
  • 3

4.3.1.3 调用端 OrderController:

//1. 传递普通键值对参数
@GetMapping("/feign/save")
public Map<String,Object> test4(String name){
    log.info("进入测试feign的Post方式传递参数...");
    Map<String, Object> map = userClient.save(name);
    log.info("调用商品服务返回的信息:[{}]",map);
    return map;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4.3.2 传递对象类型参数,参数使用@RequestBody注解

4.3.2.1 服务端 UserController:

//使用openfeign的post方式传递对象信息
//要求服务提供方和服务调用方都是用@RequestBody 进行参数声明
//注意:服务提供方和调用方一定要加入@RequestBody注解
@PostMapping("/product/update")
//@RequestBody 将JSON格式对象转为对应的对象信息
public Map<String,Object> update(@RequestBody User user){
    log.info("商品服务,接收到的商品name为:[{}]",user);
    Map<String, Object> map = new HashMap<>();
    map.put("product",user);
    map.put("msg","添加商品信息成功!");
    map.put("status",true);
    map.put("port", port);
    return map;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

4.3.2.2 客户端 UserClient接口 :

@PostMapping("/product/update")
//2.传递对象类型参数
//使用openfeign的post方式传递对象信息
//要求服务提供方和服务调用方都是用@RequestBody 进行参数声明
//注意:服务提供方和调用方一定要加入@RequestBody注解
Map<String,Object> update(@RequestBody User user);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4.3.2.3 调用端 OrderController:

//2.传递对象类型参数
//测试参数post方式对象的参数传递
@GetMapping("/feign/update")
public Map<String,Object> test5(User user){
    log.info("接收的商品信息:[{}]",user);
    Map<String, Object> map = userClient.update(user);
    log.info("调用商品服务返回的信息:[{}]",map);
    return map;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

4.总结:使用OpenFegin调用第三方服务时,客户端和服务端方法完全保持一致,无论是方法名称、方法参数、返回值以及请求路径,标签注解也须保持一致;

接口方法定义方式
资源Restful方式,参数需要使用@PathVariable注解;
使用GET方式:参数使用@RequestParam注解;
使用POST方式:
    普通参数使用@RequestParam注解;
    自定义对象参数使用@RequestBody注解,否则无法传递对象信息,传递过来的对象是无内容的,属性值都是NULL值
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/84541
推荐阅读
相关标签
  

闽ICP备14008679号