22.OpenFeign调用第三方服务

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

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

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

@SpringBootApplication
@EnableFeignClients //开启OpenFeign组件的使用
public class OrderServerApplication1020 {
    public static void main(String[] args) {
        SpringApplication.run(OrderServerApplication1020.class);
    }
}

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

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

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;
    }
}

4.1.2 客户端 UserClient接口 :

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

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;
    }
}

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;
}

4.2.2 客户端 UserClient接口 :

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

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;
}

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;
}

4.3.1.2 客户端 UserClient接口 :

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

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;
}

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;
}

4.3.2.2 客户端 UserClient接口 :

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

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;
}

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

接口方法定义方式
资源Restful方式,参数需要使用@PathVariable注解;
使用GET方式:参数使用@RequestParam注解;
使用POST方式:
    普通参数使用@RequestParam注解;
    自定义对象参数使用@RequestBody注解,否则无法传递对象信息,传递过来的对象是无内容的,属性值都是NULL值
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值