SpringCloud-day07-Feign
7.Feign
7.1.Feign简介
介绍Feign前,我们先来说一下Ribbon的缺点
1.在实际生产中,Ribbon调用服务提供者,通过restTemplate调用,缺点是,多个地方调用,同一个请求要写多次,不方便统一维护;
2.调用方式,与传统的MVC方式不一样,原来是直接注入Service,所有在实际使用我们跟希望保持与原来的一致;
Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。
在Spring Cloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完成了。Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。
Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,要配置负载均衡的话,直接配置Ribbon即可,无其他特殊地方,从而让Feign的使用更加方便。
Fiegn也整合了服务容错保护,断路器Hystrix等,后面我们会详细讲解。
7.2.Feign实战应用
第一步:在common项目里建一个service接口作为Feign客户端,用Feign客户端来调用服务器提供者,当然可以配置负载均衡;
Feign客户端定义的目的,就是为了方便给其他项目调用;
修改 common模块
pom.xml引入Feign依赖:
<!-- feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
在common中建立TicketClientService接口:
package com.wfd360.service; import com.wfd360.model.Ticket; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import java.util.List; /** * @author 姿势帝-博客园 * @address https://www.cnblogs.com/newAndHui/ * @WeChat 851298348 * @create 07/18 8:49 * @description */ //调用的服务名称 @FeignClient(value = "SERVICE-TICKET") public interface TicketClientService { /** * 根据id查询车票信息 * * @param id * @return */ @GetMapping(value = "/ticket/get/{id}") Ticket get(@PathVariable("id") Integer id); /** * 查询车票信息 * * @return */ @GetMapping(value = "/ticket/list") List<Ticket> list(); /** * 添加或者修改车票信息 * * @param ticket * @return */ @PostMapping(value = "/ticket/save") boolean save(Ticket ticket); /** * 根据id删除车票信息 * * @return */ @GetMapping(value = "/ticket/delete/{id}") boolean delete(@PathVariable("id") Integer id); }
第二步:拷贝一个ticket-consumer-80 并将端口号改为81,项目名称为:ticket-consumer-81
其实可以在80上修改的,只是为了便于学习比对区别,这里单独建立一个模块.
第三步:加注解,启动加个注解@EnableFeignClients,支持下Feign;
重点注意:要注释掉@EnableEurekaClient
第四步:修改TicketConsumerController,代码如下:
package com.wfd360.controller; import com.wfd360.model.Ticket; import com.wfd360.service.TicketClientService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import java.util.List; /** * @author 姿势帝-博客园 * @address https://www.cnblogs.com/newAndHui/ * @WeChat 851298348 * @create 06/29 10:25 * @description */ @Controller @RequestMapping("/ticket") public class TicketConsumerController { @Autowired private TicketClientService ticketClientService; /** * 添加或者修改车票信息 * * @param ticket * @return */ @PostMapping(value = "/save") @ResponseBody public boolean save(Ticket ticket) { return ticketClientService.save(ticket); } /** * 查询车票信息 * * @return */ @SuppressWarnings("unchecked") @GetMapping(value = "/list") @ResponseBody public List<Ticket> list() { return ticketClientService.list(); } /** * 根据id查询车票信息 * * @return */ @GetMapping(value = "/get/{id}") @ResponseBody public Ticket get(@PathVariable("id") Integer id) { return ticketClientService.get(id); } /** * 根据id删除车票信息 * * @return */ @GetMapping(value = "/delete/{id}") @ResponseBody public boolean delete(@PathVariable("id") Integer id) { try { ticketClientService.delete(id); return true; } catch (Exception e) { return false; } } }
现在用Fiegn,所以把restTemplate去掉,改成注入service,调用service方法来实现服务的调用;
第五步:测试负载均衡
启动3个eureak,在启动3个服务提供者,最后启动 feign消费者,访问
http://localhost:81/ticket/list
如果需要自定义负载均衡规则,可以按照之前那的 SpringCloudConfig类的myRule方式;
Feign实战应用就讲到这里,大家自己动手实战吧,
springCloud课程与代码下载:https://www.cnblogs.com/newAndHui/p/13210228.html
完美!