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);
}
View Code

第二步:拷贝一个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;
        }
    }
}
View Code

现在用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

完美!

原文地址:https://www.cnblogs.com/newAndHui/p/10623254.html