相比于@LoadBalance+RestTemplate的方式,使用feign无需将路径全部写出来,从而更加简洁。
并且feign的使用现在的最为广泛的。下面是我的第一个使用feign的项目,第一次使用,感觉很方便,也容易理解,感觉很好用
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
`1、在这里的类上面没加@RequestMapping("/product"),目的是方便后面调用方的接口的方法可以直接从这里复制
`2、这里的带普通参数参数的都加@RequestParam(可以不加),目的也是后面调用方的接口的方法可以直接从这里复制
package org.study.springcloud.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.study.springcloud.entity.Product;
import java.util.HashMap;
import java.util.Map;
@RestController
@Slf4j
public class ProductController {
@Value("${server.port}")
private String port;
@GetMapping("product/showMsg")
public String showMsg() {
log.info("进入商品服务,查看商品~~~");
return "进入商品服务,查看商品~~~,当前服务的端口号:" + port;
}
@GetMapping("/product/findAll")
public Map<String, Object> findAll() {
log.info("商品服务查询所有,当前接口为:[{}]" + port);
Map<String, Object> map = new HashMap<>();
map.put("status", true);
map.put("msg", "查询所有服务调用成功,服务提供的端口为:" + port);
return map;
}
//传参时,如果是参数是普通参数,则加@RequestParam,如果参数是对象则加@RequestBody
@GetMapping("/product/one")
public Map<String, Object> findAOne(@RequestParam("productId") String productId) {
log.info("商品服务查询所有,当前商品id为:" + productId);
Map<String, Object> map = new HashMap<>();
map.put("status", true);
map.put("msg", "查询所有服务调用成功,服务提供的端口为:" + port);
map.put("productId", productId);
return map;
}
@PostMapping("/product/save")
public Map<String, Object> save(@RequestParam("name") String name) {
log.info("商品服务查询所有,当前商品name为:" + name);
Map<String, Object> map = new HashMap<>();
map.put("status", true);
map.put("msg", "查询所有服务调用成功,服务提供的端口为:" + port);
map.put("name", name);
return map;
}
@PostMapping("/product/update")
public Map<String, Object> update(@RequestBody Product product) {
log.info("商品服务查询所有,当前商品product为:" + product);
Map<String, Object> map = new HashMap<>();
map.put("status", true);
map.put("msg", "查询所有服务调用成功,服务提供的端口为:" + port);
map.put("product", product);
return map;
}
}
1、在接口上加入@FeignClient(value = "提供者的服务id")
2、将调用的服务的controller的请求方法复制过来
package org.study.springcloud.clients;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.study.springcloud.entity.Product;
import java.util.Map;
//调用商品服务的openfeign组件,openfeign集成了ribbon,默认使用轮询策略
//使用时注入调用
@FeignClient(value = "Product") //作用:用来标识当前接口是一个feign 的组件 value:书写调用服务的服务id
public interface ProductClient {
@GetMapping("product/showMsg")
String showMsg();
@GetMapping("/product/findAll")
Map<String, Object> findAll();
//使用openfeign的GET方式传参数,参数变量必须通过@RequestParam注解进行修饰且value需与product的controller的方法的参数名一致,不加注解会报错
@GetMapping("/product/one")
Map<String, Object> findOne( @RequestParam("productId") String aa );
//测试post请求传参
@PostMapping("/product/save")
Map<String, Object> save(@RequestParam("name")String name);
//使用post方式传递参数为对象时,提供方和调用者必须加入@requestBody注解
@PostMapping("/product/update")
Map<String, Object> update(@RequestBody Product product);
}
# 方法的特别点
`返回值为String的get请求`
@GetMapping("product/showMsg")
public String showMsg()
`返回值为一个Map集合的get请求,页面展示为json格式的数据`
@GetMapping("/product/findAll")
public Map findAll()
`带普通参数的get请求传参,必须加入@RequestParam`
@GetMapping("/product/findAll")
public Map findAOne(@RequestParam("productId") String productId)
`带普通参数的post请求传参`
@PostMapping("/product/save")
public Map save(@RequestParam("name") String name)
`//使用post方式传递参数为对象时,提供方和调用者必须加入@requestBody注解`
@PostMapping("/product/update")
Map update(@RequestBody Product product);
package org.study.springcloud.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.study.springcloud.clients.ProductClient;
import org.study.springcloud.entity.Product;
import java.util.Map;
@RestController
@Slf4j
public class TestFeignController {
@Autowired
private ProductClient productClient;
@GetMapping("/feign/test")
public String test(){
log.info("进入测试fegin调用的方法");
String msg = productClient.showMsg();
log.info("调用商品服务返回的信息[{}]",msg);
return msg;
}
@GetMapping("/feign/test2")
public Map<String,Object> test2(){
log.info("进入测试fegin调用的方法2");
Map<String, Object> map = productClient.findAll();
log.info("调用商品服务2返回的信息[{}]",map);
return map;
}
//测试get请求传参
@GetMapping("/feign/test3")
public Map<String,Object> test3(String id){
log.info("进入测试fegin调用的方法3,id为[{}]",id);
Map<String, Object> map = productClient.findOne(id);
log.info("调用商品服务2返回的信息[{}]",map);
return map;
}
//测试post请求传参,
@GetMapping("/feign/test4")
public Map<String,Object> test4(String name){
log.info("进入测试feign调用的方法4,name为[{}]",name);
Map<String, Object> map = productClient.findOne(name);
log.info("调用商品服务2返回的信息[{}]",map);
return map;
}
//测试post请求传参(对象),
@GetMapping("/feign/test5")
public Map<String,Object> test5(Product product){
log.info("进入测试feign调用的方法5,product为[{}]",product);
Map<String, Object> map = productClient.update(product);
log.info("调用商品服务2返回的信息[{}]",map);
return map;
}
}
注:这里的请求方式都是GetMapping