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开发人员来说,Idea的普及率已经很高了。但是还是很多好用的技巧没有用到,只是用到一些基本的功能,蛮浪费IDEA这个优秀的IDE
- 本文实例总结了Android横竖屏切换相关技巧。分享给大家供大家参考,具体如下:一、禁止横竖屏切换Android横竖屏切换在手机开发中比较常
- 第一种方法:同步代码块:作用:把出现线程安全的核心代码上锁原理:每次只能一个线程进入,执行完毕后自行解锁,其他线程才能进来执行锁对象要求:理
- @Validated和BindingResult 使用遇到的坑@Validated 与BindingResult 需要相邻,否则 变量res
- 今天学习到了SpringBoot 的属性赋值@Value用法先总结@Value(" 张三 "):直接附在属性名上,在Be
- WPF 使用 DrawingContext 绘制刻度条框架使用大于等于.NET40;Visual Studio 2022;项目使用 
- 本文实例讲述了Android编程实现类似天气预报图文字幕垂直滚动效果的方法。分享给大家供大家参考,具体如下:在很多天气或者新闻的应用中,我们
- 这篇文章主要介绍了java多线程加锁以及Condition类的使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参
- 使用maven引入jar<dependency> <groupId>com.itextpdf</g
- 背景在写一个东西滑动删除列表的时候,出现了一个问题。我的需求是,左滑然后出现delete,然后点击delete,让该滑块消失。我在点列表的第
- 前言本文给大家分享一个使用Android开发写字板功能Dem、简单操作内存中的图像、对图像进行简单的处理、绘制直线、以达到写字板的效果效果图
- 本文总结分析了Android7.0版本影响开发的改进。分享给大家供大家参考,具体如下:低电耗模式会对闹铃、GPS 和 Wi-Fi 扫描 产生
- 一、Kotlin 调用 Java1. kotlin 关键字转义java 中的方法或变量 是 kotlin 的关键字时,使用反引号 `` 对关
- MainActivity如下: package cn.testnbackpressed; import android.os.Bundle;
- 本文实例为大家分享了java日期操作工具类,获取指定日期前一天、后一天;日期转换;两个日期之间相隔天数等工具类,供大家参考,具体内容如下im
- Android CalendarView,DatePicker,TimePicker,以及NumberPicker的使用简单复习
- SpringBoot打jar包遇到的xml文件丢失在pom.xml的build标签中添加如下内容指定资源路径<resources>
- AndroidMaifest.xml中声明权限<!-- 声明所有需要的权限(包括普通权限和危险权限) --><uses-p
- Apache Dubbo是一款高性能、轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡
- 方法参数public String listFireEvent(@Valid FireSearch fireSearch, Ht