这里我们要模拟两个 eureka 客户端,一个是 调用的 order 一个是被调用的 product
为例:
eureka 的搭建方式 上一章已经讲过了:
这里在上一章的基础上 填写 下面的依赖
一、 client 的调用端加入 feign 依赖:
<!--feign 用于 client 间 http 通信的 封装-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
二、 在application上添加
@SpringBootApplication
@EnableFeignClients //添加 feign 注解
@EnableDiscoveryClient
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(ProductApplication.class, args);
}
}
被调用端 (product)
配置文件:
server:
port: 8080
eureka:
client:
service-url:
defaultZone: http://localhost:8000/eureka/ # eureka 服务器 地址 多个用逗号隔开。
# 应用注册 eureka 名称
spring:
application:
name: productClient
controller 代码:
@RestController
@RequestMapping("product")
public class ProductController {
@Autowired
private ProductDao productDao;
//无参数 方法可以 使用 GET
@GetMapping("hello")
public String hello(){
return "hello nihao 3Q";
}
//这里要注意 如果 被调用方法带有参数 必须使用 POST 方法接受请求,并 添加 @RequestBody 注解,否则报错
@PostMapping("list")
public List<ProductInfoOut> listProduct(@RequestBody int state){
List<Product> productsByState = productDao.findProductsByState(state);
List<ProductInfoOut> list = new ArrayList<>();
for (int i=0; i<productsByState.size(); i++){
ProductInfoOut pout = new ProductInfoOut();
BeanUtils.copyProperties(pout,productsByState.get(i));
list.add(pout);
}
return list;
}
}
** 调用端(order端 )**
配置文件
server:
port: 8081
eureka:
client:
service-url:
defaultZone: http://localhost:8000/eureka/ # eureka 服务器 地址 多个用逗号隔开。
# 应用注册 eureka 名称
spring:
application:
name: orderClient
编写feign
三,编写一个 feign 的接口:
**这里是 调用端 **
@FeignClient(name = "productClient") //这里的productClient 是 eureka 注册的 被调用服务名称
public interface orderClient {
//这里故意使用 GET 方式 但是你会发现,只要带有参数,你发送过去的参数 必须用 POST 方式接收。
@GetMapping("product/list")
List<ProductInfoOut> listProduct(int state);
@GetMapping("product/hello")
String hello();
}
注意:根据我测试 只有接口中带有参数 ,被调用端 就必须是 post 方式接受,并需要加上 @RequstBody 否则就会报错,如果没有参数 可以使用 Get 方式 代码如下
编写 controller
@RestController()
@RequestMapper("order")
public class OrderClientController {
@Autowired
OrderClient orderClient;
@GetMapping("lists")
public List<ProductInfoOut> list(){
List<ProductInfoOut> productInfoOuts = orderClient.listProduct(0);
return productInfoOuts;
}
@GetMapping("helloya")
public String hello4(){
String aa = orderClient.hello("hello4");
return aa;
}
然后请求:localhost:8081/order/helloya
localhost:8081/order/lists
都可以访问到想要的数据。
这里的ProductInfoOut 是调用使用的是 共享模块(不知道的可以 查看 maven 多模块)