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

作者:simonsfan 时间:2023-01-22 08:18:05 

一、Feign简介

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

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

1、添加Feign依赖


<dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

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<String,Object> map);
}

@RestController
public class TicketController {
 @Autowired
 private UserServiceFeign userServiceFeign;

@GetMapping("ticketpurchase")
 public CommonResult (Long id, String actId) {
   Map map = new HashMap<String, Object>();
   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<User> userList = userService.getUserByName(user.getName());
   return CommonResult.success(CommonEnum.SUCESS.getCode(), CommonEnum.SUCESS.getMessage(),userList);
 }
}

项目的github

来源:https://blog.csdn.net/fanrenxiang/article/details/78499935

标签:java,Feign,Restful
0
投稿

猜你喜欢

  • Android实现简单水波纹效果

    2021-11-09 12:40:45
  • DevExpress实现GridControl单元格编辑验证的方法

    2022-01-13 17:18:45
  • 两天没解决的问题chatgpt用了5秒搞定隐藏bug

    2023-11-18 22:54:08
  • 详解Android自定义View--自定义柱状图

    2023-10-13 19:33:06
  • 深入解读Android的内部进程通信接口AIDL

    2022-09-09 04:02:02
  • C#实现启动,关闭与查找进程的方法

    2023-01-12 23:27:35
  • 详解maven的setting配置文件中mirror和repository的区别

    2022-03-19 11:56:42
  • 详解Android端与JavaWeb传输加密(DES+RSA)

    2022-05-18 09:36:47
  • Android中通过view方式获取当前Activity的屏幕截图实现方法

    2021-09-20 09:17:22
  • java后台验证码生成的实现方法

    2021-10-01 05:59:26
  • springboot整合mybatis实现数据库的更新批处理方式

    2023-11-29 07:08:37
  • Spring boot集成Mybatis的方法教程

    2023-11-25 06:20:41
  • Flutter 日历组件简单实现

    2023-10-21 11:04:35
  • 浅谈java获取UUID与UUID的校验

    2023-08-10 12:18:32
  • Java实现AES算法的实例代码

    2021-09-25 15:05:52
  • java中URLEncoder.encode与URLDecoder.decode处理url特殊参数的方法

    2022-05-22 05:32:00
  • javascript最新2020经典面试题

    2023-05-15 09:04:43
  • 如何实现自定义SpringBoot的Starter组件

    2023-06-28 14:49:04
  • Java8中 LocalDate和java.sql.Date的相互转换操作

    2022-01-05 20:01:28
  • Java 多线程等待优雅的实现方式之Phaser同步屏障

    2023-11-29 09:47:43
  • asp之家 软件编程 m.aspxhome.com