本文共 3772 字,大约阅读时间需要 12 分钟。
现在介绍如何通过实现Feign接口的形式,更简单的使用Feign
使用的版本:spring-cloud-openfeign 2.1.0.RELEASE
SpringCloud版本:Greenwich.RELEASE1、新建一个Maven模块,该模块只存放定义的Feign接口(因为消费者和提供者都需要使用该接口,所以将它们抽取出来单独部署成一个模块),添加依赖feign依赖
org.springframework.cloud spring-cloud-starter-openfeign org.springframework.cloud spring-cloud-dependencies Greenwich.RELEASE pom import
2、该模块下编写相应的服务接口
package feign.webservice;import com.fei.common.constant.ServerContant;import com.fei.common.model.employee.EmployeeModel;import org.springframework.cloud.openfeign.FeignClient;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import java.util.List;/** * @Author: xiaoshijiu * @Date: 2019/7/4 * @Description: 员工feign接口 * @FeignClient: name表示为哪个服务配置feign申明式服务调用 */@FeignClient(name = ServerContant.SERVER_PROVIDER)@RequestMapping("/feign/empl")public interface EmployeeWebService { /** * 查询所有员工 * @return 员工模型列表 */ @RequestMapping(value = "/list", method = RequestMethod.GET) List在接口上添加注解@FeignClient(name = ServerContant.SERVER_PROVIDER),表明这是一个Feign客户端,name属性表示具体为哪个服务配置 然后接口的具体方法可以填写@RequestMapping,请求路径映射list();}
3、服务提供者,与第一种方法不同的就是在这里
第一种方法:服务提供者Controller中方法的@RequestMapping路径映射要和Feign接口中方法的路径映射一样 现在:服务提供者实现Feign接口package com.fei.springcloudprovide8001.webservice.feign;import com.alibaba.fastjson.JSON;import com.fei.common.model.employee.EmployeeModel;import com.fei.springcloudprovide8001.employee.EmployeeService;import feign.webservice.EmployeeWebService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RestController;import java.util.List;/** * @Author: xiaoshijiu * @Date: 2019/7/4 * @Description: 员工feign接口实现类 */@RestControllerpublic class EmployeeWebServiceImpl implements EmployeeWebService { @Autowired private EmployeeService employeeService; @Override public List4、服务消费者,与第一种方法一致,就像调用本地方法一样去调用定义的feign接口就可以了list() { // 使用阿里巴巴的fastjson进行集合中对象的模型转换 return JSON.parseArray(JSON.toJSONString(employeeService.list()), EmployeeModel.class); }}
package com.fei.springcloudconsumer.consumer.employee.feign;import com.fei.common.model.employee.EmployeeModel;import feign.webservice.EmployeeWebService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;import java.util.List;/** * @Author: xiaoshijiu * @Date: 2019/7/4 * @Description: feign组件,消费服务接口 */@RestController@RequestMapping("/consume/feign/empl")public class EmployeeFeignController { /** * 使用了Feign,就像调用本地方法一样,调用远程HTTP请求 */ @Autowired private EmployeeWebService employeeWebService; /** * 获取员工列表,使用feign组件 */ @GetMapping("/list") public List有一点需要注意的是:这里的RequestMapping路径不能和Feign接口定义RequestMapping路径重复list2() { List employeeModels = employeeWebService.list(); return webEmployeeModels; }}
5、最后要在服务消费者的主启动类上加上@EnableFeignClients(basePackages = "feign.webservice")注解
需要注意的是,如果你定义的Feign接口不在主启动类包或其子包下(即不在@ComponentScan扫描范围内),则需添加basePackages属性去指明Feign接口的包位置。 这一点很重要,不然会报 不能@Autowired EmployeeWebService 的错。
6、测试,成功调用,并自带了Ribbon负载均衡的作用
转载地址:http://icyws.baihongyu.com/