java使用Feign实现声明式Restful风格调用

这篇文章主要为大家详细介绍了java使用Feign实现声明式Restful风格调用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

一、Feign简介

Feign是netflix开发的声明式、模板化的http客户端,在使用时就像调用本地(服务消费者自己)的方法一般,帮助我们更加优雅的调用服务提供者的API。Feign自身支持springMVC,还整合了Eureka、Ribbon,极大的简化了Feign的使用。就整合Euraka而言,只需和普通的服务配置Eureka server的信息即可。整合Ribbon,就意味着不再需要通过标注@LoadBalanced的实例化后的RestTemplate去调用服务提供者方法了。Feign只需通过简单的定义一个接口即可实现负载均衡。

二、在服务消费者中使用Feign

1、添加Feign依赖

org.springframework.cloudspring-cloud-starter-feign

2、创建一个feign接口,并在头部加上@FeignClient注解

import com.simons.cn.util.CommonResult; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; @FeignClient(name = "user-provider") public interface UserFeignService { @RequestMapping(value = "/getuserinfo",method = RequestMethod.GET) CommonResult getUserByName(@RequestParam(required = false,value = "name") String name); }

这里的name="user-provider" 会被解析为注册到Eureka server上的其中一个客户端,换句话说就是注册到Eureka中的其中一个服务,利用它可以实现负载均衡。也可以结合value来指定@FeignClient(name="user-provider",value = "http://localhost:8000/")

3、修改Controller,不再调用@LoadBalanced标注的RestTemplate,而是通过标注@FeignClient的自定义接口

import com.simons.cn.UserFeignService; import com.simons.cn.util.CommonResult; 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.RequestParam; import org.springframework.web.bind.annotation.RestController; @Slf4j @RestController public class TicketFeignController { @Autowired private UserFeignService userFeignService; @GetMapping("/ticketpurchase") public CommonResult purchaseTicket(@RequestParam(required = false,value = "name") String name){ CommonResult result = userFeignService.getUserByName(name); return result; } }

4、修改启动类,头部添加@EnableFeignClients注解

import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnablediscoveryClient; import org.springframework.cloud.netflix.feign.EnableFeignClients; @EnableFeignClients @EnablediscoveryClient @SpringBootApplication public class TicketConsumerFeignApplication { public static void main(String[] args) { SpringApplication.run(TicketConsumerFeignApplication.class, args); } }

测试:

启动多个user-provider-eureka服务实例,其配置文件中的application.name=user-provider;

启动discovery-eureka服务实例;

启动ticket-consumer-feign服务实例

如上测试结果可以看到ticket-consumer-feign消费者顺利调用user-provider-eureka服务提供者的方法,并且实现了负载均衡。

三、使用Feign构造多参数请求

1、get请求:多个参数就用多个@RequestParam标注几个

@FeignClient(name = "user-provider") public interface UserFeignService { @RequestMapping(value = "/getuserinfo",method = RequestMethod.GET) CommonResult getUserByName(@RequestParam(required = false,value = "name") String name); }

或者用Map来封装参数

@FeignClient(name="user-provider") public interface UserServiceFeign { @RequestMapping(value = "/getuserinfo",method = RequestMethod.GET) public CommonResult getUserByName(@RequestParam Map map); }

@RestController public class TicketController { @Autowired private UserServiceFeign userServiceFeign; @GetMapping("ticketpurchase") public CommonResult (Long id, String actId) { Map map = new HashMap(); map.put("id", id); map.put("actId", actId); return this.userServiceFeign.getUserByName(map); } }

2、post请求就相对简单的多

// 服务消费者方 @FeignClient(name="user-provider") public interface UserServiceFeign { @RequestMapping(value="/getuserbyname",method = RequestMethod.POST) public COmmonResult getUserByName(@RequestBody User user); }

//服务提供者 @Slf4j @RestController public class UserController { @Autowired private UserServiceImpl userService; @GetMapping(value = "/getuserinfo") public CommonResult getUserInfo(@RuquestBody User user){ List userList = userService.getUserByName(user.getName()); return CommonResult.success(CommonEnum.SUCESS.getCode(), CommonEnum.SUCESS.getMessage(),userList); } }

项目的github

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...