spring cloud 三 服务间通信 feign

这里我们要模拟两个 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 多模块)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值