热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringCloud连载(五):Feign轻松实现Rest接口调用(附视频)

调用RestAPI通常需要创建一个RestTemplete对象然后传入服务地址.使用postgetdelete等不同的请求,操作起来特别麻烦,Feign可以让我们调用RestAPI

上期回顾

上期我们讲了SpringCloud中Ribbon负载均衡.学会了现实中一个非常实用的技能.有兴趣的同学可以看一下.

SpringCloud 连载(四) : Ribbon负载均衡与自定义算法

本期内容

Feign:

1:Feign是什么?

2:如何使用?

Feign是什么

Feign主要用于客户端调用WebService接口,让调用接口变的像调用对象的方法一样简单。

比如:

    创建一个公共的common组件,在里面写一个接口,声明几个方法,然后让服务端去实现这个接口,同时把这个接口打成的jar丢给客户端的工程师调用,工程师通过Spring Autowired去把这个对象取出来,就可以直接调用服务端实现的方法,有点像gRpc技术.

通过SpringCoud的封装使其支持springMVC注解与

HttpMessageConerters,他可以与Eureka和Ribbon配合使用以支持负载均衡.

通俗的说:

Fegin是一个声明式的Web服务客户端,使得开发web客户端变的更加简单.

使用:只需要创建一个接口,然后在上面添加注解就可以了。

以往使用调用Rest Api:

    之前我们使用Ribbon+RestTemlate对Http进行请求封装访问,我们需要写入服务的地址等信息,实际开发中会有很多微服务接口,我们就得定义好多微服务的地址.Fegin在这些的基础上做了一些优化,使得我们在使用的时候,像声明一个 Service一样直接调用接口的方法.

如何使用

第一步:新创建一个模块;

名称:msc-consumer-department-80-feign

内容与msc-consumer-department-80相同;

pom档加入fegin的GAV配置;

1
2<dependency>
3    <groupId>org.springframework.cloudgroupId>
4    <artifactId>spring-cloud-starter-feignartifactId>
5dependency>
6

第二步:在msc-api的pom.xml中加入对feign的支持

因为有可能其他模块也要调用,所以我们把这个类放在一个公共的模块中.

在msc-api的pom.xml中加入对feign的支持

1
2<dependency>
3    <groupId>org.springframework.cloudgroupId>
4    <artifactId>spring-cloud-starter-feignartifactId>
5dependency>
6

第三步:在msc-api模块中创建一个接口类;

注意:

1:里面的方法和Server端Controller里面方法相同.(可不同)

2:每个方法的RequestMapping一定要与Server端Controller里面的注解相同(路径保持一致)

3:添加注解@FeignClient(value = "MSC-DEPARTMENT")参数就是Eureka中注册部门Server的实例名称

** 这个类可以看作是Server端Controller类的一个接口。

请输入标题

1package com.xiaobaibi.webservice;
2
3import com.xiaobaibi.bean.Department;
4import org.springframework.cloud.netflix.feign.FeignClient;
5import org.springframework.web.bind.annotation.PathVariable;
6import org.springframework.web.bind.annotation.*;
7
8import java.util.List;
9
10// 开启Feign,并告诉服务我指向的是Eureka中的哪个微服务
11@FeignClient(value = "MSC-DEPARTMENT")
12public interface DeparmentWebService {
13
14    /**
15     * 新增部门
16     * @param department
17     * @return
18     */

19    @PostMapping(value = "/department/insert")
20    public boolean insertDept(Department department);
21    /**
22     * 根据 ID 查询
23     * @return
24     */

25    @GetMapping(value = "/department/get/{dId}")
26    public Department getDepartmentById(@PathVariable("dId") Long dId);
27
28    /**
29     * 全查
30     * @return
31     */

32    @GetMapping(value = "/department/list")
33    public List list();
34}

第五步:在客户端的主启动类中加入注解,参数传入第四步接口的包名;

1@EnableFeignClients(basePackages = {"com.xiaobaibi.webservice"})

该注解用于让Spring将这个类注入到容器中.

注意:这个一定要在客户端,就是启用Rest API的模块;

1package com.xiaobaibi.consumer;
2
3import org.springframework.boot.SpringApplication;
4import org.springframework.boot.autoconfigure.SpringBootApplication;
5import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
6import org.springframework.cloud.netflix.feign.EnableFeignClients;
7
8@SpringBootApplication
9@EnableEurekaClient
10// 对部门微服务加负载均衡自定义算法
11@EnableFeignClients(basePackages = {"com.xiaobaibi.webservice"})
12public class MscConsumerApplication_Feign {
13
14    public static void main(String[] args) {
15        SpringApplication.run(MscConsumerApplication_Feign.class,args);
16    }
17}

第六步:客户端Controller调用;


之前我们是通过RestTemplete输入Rest地址,现在我们把第四步创建的接口当做一个Service直接声明调用就可以了,同其他的Service一样直接Autowired即可。

1/**
2 * Feign方式的 Service
3 */

4@Autowired
5private DeparmentWebService deparmentWebService;

1@RestController
2@RequestMapping(value = "/consumer")
3public class DepartConsumerController {
4    /**
5     * Feign方式的 Service
6     */

7    @Autowired
8    private DeparmentWebService deparmentWebService;
9
10    /**
11     * 新增部门
12     * @param department
13     * @return
14     */

15    @RequestMapping(value = "/insert")
16    public boolean insertDept(Department department){
17        return deparmentWebService.insertDept(department);
18    }
19    /**
20     * 根据 ID 查询
21     * @return
22     */

23    @RequestMapping(value = "/get/{dId}")
24    public Department getDepartmentById(@PathVariable("dId") Long dId){
25        return deparmentWebService.getDepartmentById(dId);
26    }
27
28    /**
29     * 全查
30     * @return
31     */

32    @RequestMapping(value = "/list")
33    public List list(){
34        return deparmentWebService.list();
35    }
36}

总结


如此即可,我们相当于创建一个接口,这个接口可以看作是Server端Controller的接口,之后加入Feign的注解后,在调用的地方直接创建一个service进行调用,非常的方便,另外,该技术自带Ribbon负载均衡功能(默认轮洵)

视频与工具

公众号回复

scdemo] : 本期Demo程式;

2021] : SpringCloud视频地址.

[sbsw] :小编所用的JDK,Maven,IDEA.

[mysql] 或 [mysql.exe]获取mysql的安装包与安装教程.

原创不易,点个赞分享出去吧.感谢支持.



推荐阅读
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 1.脚本功能1)自动替换jar包中的配置文件。2)自动备份老版本的Jar包3)自动判断是初次启动还是更新服务2.脚本准备进入ho ... [详细]
  • Maven构建Hadoop,
    Maven构建Hadoop工程阅读目录序Maven安装构建示例下载系列索引 序  上一篇,我们编写了第一个MapReduce,并且成功的运行了Job,Hadoop1.x是通过ant ... [详细]
  • 在这分布式系统架构盛行的时代,很多互联网大佬公司开源出自己的分布式RPC系统框架,例如:阿里的dubbo,谷歌的gRPC,apache的Thrift。而在我们公司一直都在推荐使用d ... [详细]
  • 服务注册中心到底应该选AP模型还是CP模型?
    当下,分布式系统正变得越来越重要,大型网站几乎都是分布式的。分布式系统的最大难点,就是各个节点的状态 ... [详细]
  • k8s入坑之路(14)scheduler调度 kubelet管理及健康检查
    kubelet主要功能Pod管理在kubernetes的设计中,最基本的管理单位是pod,而不是container。pod是kubernetes在容器上的一层封装,由一组运行在同一 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • ScrollView嵌套Collectionview无痕衔接四向滚动,支持自定义TitleView
    本文介绍了如何实现ScrollView嵌套Collectionview无痕衔接四向滚动,并支持自定义TitleView。通过使用MainScrollView作为最底层,headView作为上部分,TitleView作为中间部分,Collectionview作为下面部分,实现了滚动效果。同时还介绍了使用runtime拦截_notifyDidScroll方法来实现滚动代理的方法。具体实现代码可以在github地址中找到。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • 微信公众号:内核小王子关注可了解更多关于数据库,JVM内核相关的知识;如果你有任何疑问也可以加我pigpdong[^1]jvm一行代码是怎么运行的首先,java代码会被编译成字 ... [详细]
  • 微服务之总体架构篇
    一、单体架构存在的问题缺点:1、难以维护:当单体应用业务不断迭代后代码量非常臃肿,模整个项目非常复杂,每次更改代码都可能带来新的bug;2、部署项目麻烦:庞大之后项目部署效率 ... [详细]
  • 阿里云监控URL的配置笔记
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了阿里云监控URL的配置笔记相关的知识,希望对你有一定的参考价值。有很多细节需要记录 ... [详细]
author-avatar
铲除飞网败类
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有