OpenFeign实现远程调用


Posted in Java/Android onAugust 14, 2022

本文实例为大家分享了OpenFeign远程调用实现的具体代码,供大家参考,具体内容如下

什么是OpenFeign

OpenFeign目前是Spring Cloud 二级子项目。平时说的Feign指的是Netflix下的Feign,现在我们学习的是OpenFeign,是Spring提供的。

OpenFeign是一种声明式、模板化的HTTP客户端(仅在Application Client中使用)(称OpenFeign作用:声明式服务调用)。声明式调用是指,就像调用本地方法一样调用远程方法,无需感知操作远程http请求。学习完OpenFeign后可以不使用RestTemplate进行调用。

Spring Cloud的声明式调用, 可以做到使用 HTTP请求远程服务时能就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。Feign的应用,让Spring Cloud微服务调用像Dubbo一样,Application Client直接通过接口方法调用Application Service,而不需要通过常规的RestTemplate构造请求再解析返回数据。它解决了让开发者调用远程接口就跟调用本地方法一样,无需关注与远程的交互细节,更无需关注分布式环境开发。

使用OpenFeign时就好像在写控制器方法,OpenFeign都是写在接口中,在声明的方法上添加SpringMVC注解或声明的参数上添加SpringMVC注解就可以完成调用远程的控制器方法。

OpenFeign用途

openfeign的用途:服务发现,负载均衡,服务调用

openfeign的实现原理:基于@EnableFeignClients 将所有被@FeignClient注解的类 注册到容器中。当这些被@FeignClient注解的类被调用时会创建一个动态代理的对象为我们创建被调用类的实例,然后都会被统一转发给 Feign 框架所定义的一个 InvocationHandler , 由该 Handler 完成后续的 HTTP 转换, 发送, 接收, 翻译HTTP响应的工作。本文主要介绍OpenFeign服务调用的用途,实现微服务间的远程调用。

具体案例

springboot版本为2.3.5

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.5.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

pom依赖

<!-- openfeign -->
     <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
        <version>2.2.5.RELEASE</version>
    </dependency>

     <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
     <version>2.2.5.RELEASE</version>
</dependency>

服务请求方

1.在springboot启动类中添加注解@EnableFeignClients

package com.anjiplus.template.gaea.business;

import com.anji.plus.gaea.annotation.enabled.EnabledGaeaConfiguration;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import springfox.documentation.oas.annotations.EnableOpenApi;

// openFeign注解,括号内容为远程调用类包路径
@EnableFeignClients("com.anjiplus.template.gaea.business.modules.model.openFeign")
@EnableOpenApi
public class ReportApplication {
    public static void main( String[] args ) {
        SpringApplication.run(ReportApplication.class);
    }
}

2.添加远程调用接口类,接口类上需要使用@FeignClient注解标注调用服务的服务名和服务地址

package com.anjiplus.template.gaea.business.modules.model.openFeign;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.*;

/**
 * @author 莫须有
 * @Date 2022/6/10 15:52
 * @Description openFeign服务调用类
 */
//注解表示服务调用的服务名称和服务地址
@FeignClient(value = "kg-data-manage", url = "http://127.0.0.1:10100/datamanage")
@Component
public interface ModelOpenFeign {

    /**
     * @Description 查询用户下所用的模型信息
     * @author 莫须有
     * @date 2022/6/17
     * @param userId 用户编号
     * @return list
     */
    @GetMapping("/dashBoard/getFactory")// 调用的路径为服务提供方接口请求路径
    String getFactoryList(@RequestParam("userId") String userId);

    @GetMapping("/dashBoard/getPointList")
    String getPointList(@RequestParam("taskId") String factoryId);

    @GetMapping("/dashBoard/getData")
    String getData(@RequestParam("sql") String sql);
}

服务提供方

服务提供方只需像正常的controller层接口一样编写就可以,不需要额外的配置,根据需要在controller层进行接口开发,然后再service层中做具体的实现即可,需要注意的是请求参数和返回参数的类型需要两边一致,这是必须满足的。

package com.xasj.controller.model.openFeign;

import com.xasj.entity.model.vo.DashBoardModelInfo;
import com.xasj.entity.model.vo.DashBoardPointInfo;
import com.xasj.service.model.openFeign.DashBoardOpenFeignService;

import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author 莫须有
 * @Date 2022/6/10 17:52
 * @Description openFeign服务提供类
 */
@RestController
public class DashBoardOpenFeignController {
    @Resource
    private DashBoardOpenFeignService dashBoardOpenFeignService;

    @GetMapping("/dashBoard/getFactory")
    public List<DashBoardModelInfo> getFactoryList(@RequestParam(name = "userId") String userId){
        return dashBoardOpenFeignService.getFactoryList(userId);
    }

    @GetMapping("/dashBoard/getPointList")
    public List<DashBoardPointInfo> getPointList(@RequestParam(name = "taskId")String taskId){
        return dashBoardOpenFeignService.getPointList(taskId);
    }

    @GetMapping("/dashBoard/getData")
    public List getData(@RequestParam("sql") String sql){
        return dashBoardOpenFeignService.getData(sql);
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Java/Android 相关文章推荐
解决Maven项目中 Invalid bound statement 无效的绑定问题
Jun 15 Java/Android
SpringBoot项目中控制台日志的保存配置操作
Jun 18 Java/Android
Java中常用解析工具jackson及fastjson的使用
Jun 28 Java/Android
Java生成读取条形码和二维码的简单示例
Jul 09 Java/Android
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
Aug 30 Java/Android
JPA 通过Specification如何实现复杂查询
Nov 23 Java/Android
JavaCV实现照片马赛克效果
Jan 22 Java/Android
Spring Cloud Netflix 套件中的负载均衡组件 Ribbon
Apr 13 Java/Android
Elasticsearch 配置详解
Apr 19 Java/Android
带你了解Java中的ForkJoin
Apr 28 Java/Android
IDEA中sout快捷键无效问题的解决方法
Jul 23 Java/Android
Springboot集成kafka高级应用实战分享
Aug 14 Java/Android
httpclient调用远程接口的方法
Aug 14 #Java/Android
Java Spring读取和存储详细操作
Aug 05 #Java/Android
AndroidStudio图片压缩工具ImgCompressPlugin使用实例
Aug 05 #Java/Android
Java代码规范与质量检测插件SonarLint的使用
Aug 05 #Java/Android
Spring boot admin 服务监控利器详解
Aug 05 #Java/Android
volatile保证可见性及重排序方法
Aug 05 #Java/Android
app场景下uniapp的扫码记录
Jul 23 #Java/Android
You might like
一个从别的网站抓取信息的例子(域名查询)
2006/10/09 PHP
微信公众号开发之文本消息自动回复php代码
2016/08/08 PHP
基于jQuery的弹出警告对话框美化插件(警告,确认和提示)
2010/06/10 Javascript
jQuery1.6 正式版发布并提供下载
2011/05/05 Javascript
js关闭浏览器窗口及检查浏览器关闭事件
2013/09/03 Javascript
关于页面嵌入swf覆盖div层的问题的解决方法
2014/02/11 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
2014/02/20 Javascript
JS+CSS实现大气的黑色首页导航菜单效果代码
2015/09/10 Javascript
jQuery复制表单元素附源码分享效果演示
2015/09/30 Javascript
JS+Canvas绘制时钟效果
2020/08/20 Javascript
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
利用JS判断鼠标移入元素的方向
2016/12/11 Javascript
JS前端开发判断是否是手机端并跳转操作(小结)
2017/02/05 Javascript
JavaScript数据结构中串的表示与应用实例
2017/04/12 Javascript
详解Webpack-dev-server的proxy用法
2018/09/08 Javascript
深入解析vue 源码目录及构建过程分析
2019/04/24 Javascript
layui异步加载table表中某一列数据的例子
2019/09/16 Javascript
解决vue-router 切换tab标签关闭时缓存问题
2020/07/22 Javascript
原生js实现点击按钮复制内容到剪切板
2020/11/19 Javascript
使用Python写一个小游戏
2018/04/02 Python
浅谈Pycharm中的Python Console与Terminal
2019/01/17 Python
Python Web版语音合成实例详解
2019/07/16 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
python实现发送form-data数据的方法详解
2019/09/27 Python
python打印n位数“水仙花数”(实例代码)
2019/12/25 Python
台湾森森购物网:U-mall
2017/10/16 全球购物
在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排
2014/01/13 面试题
应届生高等护理求职信
2013/10/12 职场文书
培训演讲稿范文
2014/01/12 职场文书
防灾减灾日活动总结
2014/08/26 职场文书
2014年十一国庆节爱国演讲稿
2014/09/23 职场文书
党员教师群众路线个人整改措施
2014/10/28 职场文书
爱心捐款感谢信
2015/01/20 职场文书
导游词之无锡华莱坞
2019/12/02 职场文书
Element-ui Layout布局(Row和Col组件)的实现
2021/12/06 Vue.js
Python中的tkinter库简单案例详解
2022/01/22 Python