优雅实现远程调用-OpenFeign

news2024/9/23 17:25:28

 

目录

OpenFeign介绍

OpenFeign最佳实践

我再来遇到个问题,我创建的com.xx.xxx包,放到一起了,不是那种一个在一个下面的那种

Nacos,只要看见这种什么网络报错啥的,java.net.SocketException: Network is unreachable


虽然RestTemple对于HTTP封装后,已经比直接使用HTTPClient简单多,但还是存在问题

1.需要拼接URL,灵活度高,但是封装囊肿,URL复杂时,容易出错

2.代码可读性差,风格不统一。

微服务之间通信方式:RPC和HTTP

RestTemplate

OpenFeign

RPC:是一种远程过程调用,是一种通过网络从远程计算机上请求服务,而不需要了解底层网络通信细节,RPC可以使用多种网络协议进行通信,如HTTP,TCP,UDP等,并且在TCP/IP网络四层模型中跨越了传输层和应用层,总之,RPC可以像调用本地方法一样调用远程方法

OpenFeign介绍

OpenFeign是一个声明式的Web Service客户端,他让微服务之间调用变得更加简单,类似Controller调用Service,只需要创建一个接口,添加注解即可使用OpenFeign

Netflix Feign是OpenFeign的祖先,或者说OpenFeign是Netflix的升级版,网络大多使用的Feign都是OpenFeign

Spring Cloud Feign是Spring对Feign的封装,将Feign项目集成到SpringCloud生态环境中

Spring Cloud Feign也有两个starter

spring-cloud-starter-feign

spring-cloud-starter-openfeign(用)

1.引入依赖

2.通过开启,开启Feign的功能

3.编写客户端

4.修改远程调用

5.测试

OpenFeign的参数传递

1.传递单个参数

2.传递多个参数

3.传递对象

4.传递JSON

客户端调用服务端

订单系统调用商品系统

2.传递多个参数

服务端需要提供相应的接口

1.传递单个参数

2.传递多个参数

3.传递对象

4.传递JSON

package com.bite.order.controller;

import com.bite.order.Service.ProductService;
import com.bite.order.model.ProductInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//根据商品ID,获取商品信息
@RequestMapping("/product")
@RestController
@Slf4j
public class ProductController {
    @Autowired
    private ProductService productService;
    //只是一个声明,接口和实现之间的关系绑定,哪个服务,url
    @RequestMapping("/{productId}")
    public ProductInfo getProductById(@PathVariable("productId") Integer productId){
        log.info("接收到参数:productId"+productId);
        return productService.selectProductById(productId);
    }
    @RequestMapping("/p1")
    public String p1(Integer id){
        return "product-service 接收到参数,id:"+id;
    }
    @RequestMapping("/p2")
    public String p2(Integer id,String name){
        return "product-service接收到参数,id:"+id+",name:"+name;
    }
    @RequestMapping("/p3")
    public String p3(ProductInfo productInfo){
        return "product-service 接收到参数:productInfo"+productInfo.toString();
    }
    @RequestMapping("/p4")
    public String p4(@RequestBody ProductInfo productInfo){
        return "profuct-service 接收到参数: productInfo"+productInfo.toString();
    }
}
package com.bite.order.api;

import com.bite.order.model.ProductInfo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

//假如后面加上path,那么说明下面的所有前面都有一个product
@FeignClient(value = "product-service",path ="/product")
public interface ProductApi {
    @RequestMapping("/{productId}")
    ProductInfo getProductInfo(@PathVariable("productId") Integer productId);
    //Feign的客户端
    @RequestMapping("/p1")
    //这个Param不可以省略.
    String p1(@RequestParam("id")Integer id);

    @RequestMapping("/p2")
    //做了一个参数的绑定
    public  String p2(@RequestParam("id") Integer id,  @RequestParam("name") String name);
    @RequestMapping("/p3")
    public String p3(@SpringQueryMap  ProductInfo productInfo); //SpringQueryMap需要把对象绑定给Feign
    @RequestMapping("/p4")
    public  String p4(@RequestBody ProductInfo productInfo);







}
package com.bite.order;

import com.bite.order.api.ProductApi;
import com.bite.order.model.ProductInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/feign")
public class FeignController {
    @Autowired
    private ProductApi productApi;
    //通过远程调用,o1访问商品服务p1方法
  @RequestMapping("/o1")
    public String o1(Integer id){
        return productApi.p1(id);
    }
    @RequestMapping("/o2")
    public String o2(Integer id,String name){
        return productApi.p2(id,name);
    }
    @RequestMapping("/o3")
    public String o3(){
        ProductInfo productInfo=new ProductInfo();
        productInfo.setId(23);
        productInfo.setProductName("乔丹");
        return productApi.p3(productInfo);
    }
    @RequestMapping("/o4")
    public String o4(){
        ProductInfo productInfo=new ProductInfo();
        productInfo.setId(24);
        productInfo.setProductName("科比");
        return productApi.p4(productInfo);
    }
}

OpenFeign最佳实践

我们的一些业务代码不方便给使用者展示,以外一些代码冗余,客户端代码和服务提供者代码十分相似,有没有一种办法可以把公共的代码提出来呢?

 点击install把当前工程打成jar包,放到Maven本地仓库。

但是我发现会一个没有主类的错误

我再来遇到个问题,我创建的com.xx.xxx包,放到一起了,不是那种一个在一个下面的那种

这种情况是因为idea选择了空文件夹,会自动折叠。点击项目的设置

把我光标指的地方取消勾即可

OpenFeign的最佳实验

1.继承的方式,把公共的放到一个接口里面,

Nacos,只要看见这种什么网络报错啥的,java.net.SocketException: Network is unreachable

不是端口没开,就是 protocol/ 没删除,它是你运行一会他会再次生成,所以,一旦出现问题,就去把这个鬼东西删除,浪费我两小时,真恶心。

2.抽取的方式

企业开发中,更多是把Feigm接口抽取成为一个独立的模块(做法和继承类似,但是理念不同)             

1.抽取方式,完成抽取,

2.打包install,

3.启动服务端。    

4.服务调用方,引入抽取过来的模块

 (抽取的模块通常由服务提供方来写),抽取的时候提供的API可以只写其中四五个,因为这样整个这个对外提供的服务通常由服务提供方,然后调用方来引入

服务部署

1.确认配置

2.打包,上传包

3.启动服务

4.测试

我们那个抽取的模块,无法进行打包,因为打包都是从Maven下载的,

方法

1.:上传到Maven中央仓库(麻烦)

2.搭建Maven私服(企业)

3.从本地读取jar包(推荐,个人学习)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2081417.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

十、软件工程基础知识(考点篇)

1 软件工程 软件开发生命周期: 软件定义时期:包括可行性研究和详细需求分析过程,任务是确定软件开发工程必须完成的总目 标,具体(步骤)可分成问题定义、可行性研究、需求分析等。 软件开发时期:就是软件的设计与实…

Hive的体系架构、安装

目录 一、Hive体系架构二、安装1.嵌入模式2.本地模式和远程模式 一、Hive体系架构 二、安装 1.嵌入模式 特点 不需要Mysql支持,数据存储在自带的derby中只支持一个链接,即一时间只能有一个用户操作 部署 根据如下文件自行编写hive-site.xml hive-sit…

Docker 部署 Kafka 可视化 Kafka-UI

前言 本文部署的Kafka-UI 是基于Docker Compose 部署 Kafka的KRaft模式,如有需要可访问下文链接 Docker Compose 部署 Kafka的KRaft模式 不用依赖 Zookeeper 此部署也适用于不是docker部署的kafka集群 1.启动 Kafka-UI 服务 1.1 kafka 来自docker安装 docker r…

无法验证 Anaconda 仓库证书

无法验证 Anaconda 仓库证书 这个错误表明无法验证 Anaconda 仓库的证书。你可以尝试添加参数 --no-check-certificate 来解决这个问题(不推荐但还挺好用,嘻嘻): wget --no-check-certificate https://repo.anaconda.com/archive…

【案例63】SSL RC4 加密套件支持检测 (Bar Mitzvah)修复方案

漏洞详情信息 漏洞名称 SSL RC4 加密套件支持检测 (Bar Mitzvah) 漏洞等级 高 漏洞描述 远程主机支持在一个或多个密码组中使用 RC4。 RC4 密码在伪随机字节流的生成中存在缺陷,导致引入了各种各样的小偏差,降低了其随机 性。 如果反复加密明文&am…

【北森-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…

八款主流图纸加密软件强力推荐|2024年图纸加密软件最佳选择!

在当今数字化设计的世界中,保护企业的图纸和设计文件至关重要。无论是建筑图纸、机械设计还是电子电路图,这些宝贵的知识产权都需要被妥善保护,以防止未经授权的访问和数据泄露。本文将为您推荐2024年最值得选择的八款主流图纸加密软件&#…

1. Redis 相关背景

文章目录 一 . 初识 Redis二 . 浅谈分布式系统2.1 单机架构2.2 分布式2.3 服务分离和负载策略2.4 数据库读写分离2.5 引入缓存2.6 数据库的分库分表2.7 引入微服务2.8 其他概念 三 . Redis 的特性四 . Redis 的应用场景4.1 Redis 能做的事4.2 Redis 不能做的事 Hello , 大家好 …

第二证券:A股公司中期分红踊跃 红利资产获机构关注

A股公司2024年半年报正在密布宣布,上市公司中期分红计划备受商场重视。据统计,到8月26日,有中期分红计划的A股公司近370家,创下前史新高。业内人士称,得益于政策层面的生动引导,上市公司分红“大军”敏捷扩…

随笔七、开启gst-rtsp-server服务及推流测试

目录 1. 环境 2. 启用gst-rtsp-server服务 3. 交叉编译测试程序examples 4. 推流测试 1. 环境 泰山派RK3566开发板的SDK使用了GStreamer媒体编解码框架,其扩展能力应该是优于ffmpeg,因此目前不考虑移植ffmpeg。要实现摄像头推流,还需要流…

MySQL的半同步模式

MySQL 的半同步复制 MySQL 的半同步复制(Semi-Synchronous Replication, SSR)是一种增强的复制机制,旨在减少主服务器(Master)发生故障时的数据丢失风险,并在一定程度上提高复制的可靠性。半同步复制结合了…

零基础5分钟上手亚马逊云科技-高可用负载均衡器

简介: 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列,适用于任何无云计算或者亚马逊云科技技术背景的开发者,通过这篇文章大家零基础5分钟就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我会每天介绍一个基于亚马逊云科技…

怎么将文档翻译成英语?5个方法一键将文档翻译成所需语言

夏日的尾声,处暑的凉风轻轻拂过,不仅带来了季节的更迭,也悄然拉开了国际交流的新序幕。 那份精心雕琢的处暑宣传文案,字字珠玑,情感饱满。但别急,想要这份佳作跨越语言的长河,触及更广阔的国际…

中资优配:信用债市场遭遇卖盘压力

近期,诺言债遭受卖盘压力,连跌多日,引发商场关注。 近两日,诺言债商场出现回调,工业债、城投债与二级本钱债价格均出现跌落。到8月27日收盘,“24兴业银行二级本钱债01”上行7.5个基点至2.355%,…

佰朔资本:股指预计保持震荡格局 关注化学制药、石油化工等板块

2024年1—7月规上工业企业赢利平稳增加,较前值略有上升。工业企业赢利能否企稳的要害在于有用需求,其时以价换量特征依然显着,供应快于需求使得工业企业库存继续被动冲高。在内需方面,大规模设备更新、消费品以旧换新政策有助于继…

uboot环境变量擦除之烧录工具擦除flash mtd0分区

有时会uboot环境变量修改了没有生效,需要擦除整个mtd分区 Erasing at 0x100000 – 100% complete. (1M) uboot给flash的中分区

正方体挖出几小块后的体积

如图,有一个边长为20厘米的大正方体,分别在它的角上、棱上、面上各挖掉一个大小相同的小立方体后,表面积变为2454平方厘米,那么挖掉的小立方体的边长是多少厘米?() A 2 B 2.5 C 3【正确答案】 D 3.5 这道题和上一期《立体空间想象…

算法学习-基础数据结构

基础数据结构 一.栈 1.普通栈 套路:从前往后遍历 需要考虑相邻元素 有消除操作 栈。 2.单调栈 二.队列 1.普通队列 2.优先队列 三.Trie 使用场景:可以求某个字符串在众多字符串中出现的次数,以某个字符串为前缀出现的次数 Trie中…

设计一个最小栈

问题 请你设计一个 最小栈 。它提供 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆…

昂科烧录器支持MindMotion灵动微电子的微控制器MM32F5333D7P

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表,其中MindMotion灵动微电子的32位微控制器MM32F5333D7P已经被昂科的通用烧录平台AP8000所支持。 MM32F5333D7P微控制器搭载了由安谋科技授权的Armv8-M架构“星辰”STAR-MC1处理器&a…