• 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

    完美!

  • 相关阅读:
    忘记的知识点补充
    mysql使用过程中出现的问题总结
    身份证校验
    数据库plsql配置
    前端字符间间距与单词间间距
    Oracle中的instr()函数 详解及应用
    Oracle执行过程中出现的问题
    572. Subtree of Another Tree 大树里包括小树
    404. Sum of Left Leaves 左叶子之和
    637. Average of Levels in Binary Tree 二叉树的层次遍历再求均值
  • 原文地址:https://www.cnblogs.com/newAndHui/p/10623254.html
Copyright © 2020-2023  润新知