摘自 https://blog.csdn.net/qq_16549251/article/details/125453830
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值
————————————————
版权声明:本文为CSDN博主「愤怒代码」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_16549251/article/details/125453830
标签:map,调用,22,OpenFeign,Map,参数,put,public From: https://www.cnblogs.com/shaowangwu/p/16723319.html