热门标签 | 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的安装包与安装教程.

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



推荐阅读
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 本文详细探讨了几种常用的Java后端开发框架组合及其具体应用场景。通过对比分析Spring Boot、MyBatis、Hibernate等框架的特点和优势,结合实际项目需求,为开发者提供了选择合适框架组合的参考依据。同时,文章还介绍了这些框架在微服务架构中的应用,帮助读者更好地理解和运用这些技术。 ... [详细]
  • 本文详细解析了ASP.NET 2.0中的Callback机制,不仅介绍了基本的使用方法,还深入探讨了其背后的实现原理。通过对比Atlas框架,帮助读者更好地理解和应用这一机制。 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 阿里巴巴终面技术挑战:如何利用 UDP 实现 TCP 功能?
    在阿里巴巴的技术面试中,技术总监曾提出一道关于如何利用 UDP 实现 TCP 功能的问题。当时回答得不够理想,因此事后进行了详细总结。通过与总监的进一步交流,了解到这是一道常见的阿里面试题。面试官的主要目的是考察应聘者对 UDP 和 TCP 在原理上的差异的理解,以及如何通过 UDP 实现类似 TCP 的可靠传输机制。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
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社区 版权所有