SpringCloud微服务通信两种方式Feign和Dubbo:Feign基本使用、自定义配置、使用优化;Dubbo基本实现

RestTemplate存在的问题

  1. 代码可读性差,编程体验不统一
  2. 参数复杂,URL难以维护

Feign远程调用

Feign简介

​ Feign是SpringCloud提供的一个声明式的伪Http客户端,它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一个注解即可。Nacos很好的兼容了Feign,Feign默认集成Ribbon,所以在Nacos下默认使用Fegin默认就是实现了负载均衡的效果

官方地址:https://github.com/OpenFeign/feign

基本使用

  1. 导入Fegin的依赖

    <!--fegin组件-->
    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    
  2. 在主类上添加Fegin的注解

    @EnableFeignClients  // 开启Feign
    
  3. 创建一个service,并使用Fegin实现为服务调用

    @FeignClient("service-product")//声明调用的提供者的name
    public interface IProductService {//指定调用提供者的哪个方法// @FeignClient+@GetMapping 就是一个完整的请求路径 http://service-product/product/{pid}@GetMapping(value = "/product/{pid}")Product findByPid(@PathVariable("pid") Integer pid);
    }
    
  4. 修改controller代码,并启动验证

    @RestController
    public class OrderController {@Autowiredprivate IProductService productService;@Autowiredprivate IOrderService orderService;//Ribbon下单@RequestMapping("/order/prod/{pid}")public Order order(@PathVariable("pid") Integer pid) {//通过fegin调用商品微服务Product product = productService.findByPid(pid);//下单(创建订单)Order order = new Order();order.setUid(1);order.setUsername("测试用户");order.setPid(pid);order.setPname(product.getPname());order.setPprice(product.getPprice());order.setNumber(1);orderService.createOrder(order);return order;}
    }
    
  5. 重启order微服务,查看效果

在这里插入图片描述

自定义配置

Feign支持很多的自定义配置,如:

类型作用说明
feign.Logger.Level修改日志级别包括四种不同的界别:NONE,BASIC,HEADERS,FULL
feign.coder.Decoder响应结果的解析器http远程调用的结果做解析,例如解析json字符串为java对象
feign.coder.Encoder请求参数编码将请求参数编码,便于通过http请求发送
feign.Contract支持的注解格式默认是SpringMVC的注解
feign.Retryer失败重试机制请求失败的重试鸡翅,默认是没有,不会使用Ribbon的 重试

一般情况下,默认值就能满足使用,如果需要自定义时,只需要创建自定义的@Bean覆盖默认Bean,即可

配置文件方式

基于配置文件修改fegin的日志级别就可以针对单个服务

feign:client:config:service-product:   #针对某个微服务的配置loggerLevel: FULL  #日志级别

也可以针对所有服务

feign:client:config:default:   #这里用default就是全局配置,如果写服务名就是针对某个服务的配置loggerLevel: FULL  #日志级别

注意:需要把日志级别设置

logging:level:com.apesource: debug

而日志的级别分为四种

  1. NONE:不记录任何日志信息,这是默认值
  2. BASIC:仅记录请求的方法,URL以及影响状态码和执行时间
  3. HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
  4. FULL:记录所有的响应的明细,包括头信息,请求体,元数据

Fegin使用优化

Feign底层发起http请求,依赖于其他的宽街。其底层客户端实现包括:

  • URLConnection:默认实现,不支持连接池
  • Apache HttpClient:支持连接池
  • OKHttp:支持连接池

因此提高Feign的性能主要手段就是使用连接池代替默认的URLConection

  1. 导入坐标(openfeign也需要有)

    <!--httpClient的依赖 -->
    <dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId>
    </dependency>
    
  2. 配置连接池

    feign:client:config:default:loggerLevel: BASIChttp:client:enable: true #开启feign对HttpClient的支持max-connections: 200 #最大的连接数max-connections-per-route: 50 #每个路径的最大连接数
    

总结:

  1. 日志级别尽量使用Basic
  2. 使用HttpClient或OKHttp代替 URLConnection
    • 引入feign-httpClient依赖
    • 配置问价你开启httpClient功能,设置连接池参数

Dubbo

Dubbo简介

Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。 Spring Cloud Alibaba微服务开发框架集成了Dubbo,可实现微服务对外暴露Dubbo协议的接口,Dubbo协议相比RESTful协议速度更快RPC:RPC是远程过程 (Remote Procedure Cal) 的缩写形式,调用RPC远程方法就像调用本地方法一样,Dubbo之前阿里研发,中间停止维护2年,最后开启维护并捐献给Apache

dubbo官网:http://dubbo.io/

在这里插入图片描述

上图是Dubbo的工作原理图,从抽象架构上 分为两层:服务治理抽象控制面和Dubbo数据面

  • **服务治理控制面:**服务治理控制面不是特指如注册中心类的单个具体组件,而是对 Dubbo 治理体系的抽象表达。控制面包含协调服务发现的注册中心、流量管控策略、Dubbo Admin 控制台等,如果采用了 Service Mesh 架构则还包含 lstio 等服务网格控制面。
  • **Dubbo数据面:**据面代表集群部署的所有 Dubbo 进程,进程之间通过 RPC 协议实现数据交换,Dubbo 定义了微服务应用开发与调用规范并负责完成数据传输的编解码工作
    • 服务消费者(Dubbo Consumer),发起业务调用或 RPC 通信的 Dubbo 进程
    • 服务提供者(Dubbo Provider),接收业务调用或 RPC 通信的 Dubbo 进程

基础实现

  1. 提供统一业务api

    实战中将所有的服务接口设计给一个叫做api的服务,单独维护

    此服务需要导入common(实体类服务)的gav

    public interface IProductService{Procuct findById(Integer pid);
    }
    
  2. 编辑服务提供者product

    添加依赖

    <!--dubbo-->
    <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId>
    </dependency>
    

    除dubbo依赖外,还需要导入 api服务的gav

    添加dubbo的配置

    dubbo:scan:base-packages: com.apesource.service.imp   #此处写接口实现类的包路径protocols:dubbo:name: dubbo #服务协议port: -1 #服务端口 -1代表随机端口registry:address: spring-cloud://localhost  # 注册中心
    

    编写并暴露服务

    @Service  // 暴露服务:此处的@Service是Dubbo提供的注解,而不是Spring的注意导包 
    public class ProductServiceImp implements ProductService{@AutoWiredprivate ProductMapper productMapper;@Overridepublic Product findById(Integer pid){return productMapper.findById(pid);}
    }
    
  3. 编辑服务消费者

    添加依赖

    <!--dubbo-->
    <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId>
    </dependency>
    

    添加dubbo配置

    dubbo:registry:address: spring-cloud://localhost # 注册中心cloud:subscribed-services:	service-product  #订阅的提供者名称
    

    引用服务

    @RestController
    @RequestMapping("/order")
    public class OrderController {@Autowired(required = false)private IOrderService orderService;// 引用服务@Referenceprivate IProductService productService;// 模拟下订单业务@RequestMapping("/save/{pid}")public Order order (@PathVariable("pid") int pid) {// 调用商品的微服务Product product = productService.findById(pid);// 创建订单Order order = new Order();order.setUid(1);order.setUsername("测试用户");order.setPid(pid);order.setPname(product.getPname());order.setPprice(product.getPprice());order.setNumber(1);orderService.save(order);return order;}
    }
    

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python如何实现原型设计模式?什么是原型设计模式?Python 原型设计模式示例代码

什么是原型&#xff08;ProtoType&#xff09;设计模式&#xff1f; 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;旨在通过复制现有对象来创建新对象&#xff0c;而无需通过标准的构造方式。它允许我们基于现有对象创建新对象&#xf…

计算机毕业设计 基于SpringBoot的企业内部网络管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

《rPPG》——(1)PyTorch——Windows环境配置

《rPPG》——&#xff08;1&#xff09;PyTorch——Windows环境配置 如何查看电脑是否已安装Python环境以及Python版本 anaconda对应python3.8的版本号是多少? 强烈建议大家安装最新版的anaconda&#xff0c;虽然最新版的anaconda是Python3.11的&#xff0c;但是这个并不会影…

java源码-工程讲解

说明&#xff1a; 源码工程目录讲解部分&#xff0c;讲解过程会让大家对后端源码工程有一个大致的了解&#xff0c;能让大家在此改造&#xff0c;就可以衍生出一些新的功能&#xff0c;需要对java技术深入了解&#xff0c;需要看后续java技术讲解部分&#xff0c;源码也是以前很…

uniapp Android如何授权打开系统蓝牙Bluetooth?

uniapp Android如何授权打开系统蓝牙&#xff1f; 使用uniapp开发蓝牙项目过程中&#xff0c;涉及到检测手机系统蓝牙是否打开功能&#xff0c;这里介绍Android&#xff0c;iOS暂时没有找到优方法。朋友们如果有好的方案&#xff0c;欢迎评论分享~ 文章目录 uniapp Android如何…

设计模式-责任链-笔记

动机&#xff08;Motivation&#xff09; 在软件构建过程中&#xff0c;一个请求可能被多个对象处理&#xff0c;但是每个请求在运行时只能有个接受者&#xff0c;如果显示指定&#xff0c;将必不可少地带来请求者与接受者的紧耦合。 如何使请求的发送者不需要指定具体的接受…

Elasticsearch备份与还原:使用elasticdump

在数据管理的世界里&#xff0c;备份和还原数据是重中之重的日常工作&#xff0c;特别是对于Elasticsearch这样的强大而复杂的搜索引擎。备份不仅可以用于灾难恢复&#xff0c;还可以在数据迁移、测试或者升级等场景中发挥重要作用。 在本博客中&#xff0c;我们将会重点介绍如…

达梦数据库常用参数查询

字符集 字符是各种文字和符号的统称&#xff0c;包括各个国家文字、标点符号、表情、数字等等。 字符集 就是一系列字符的集合。字符集的种类较多&#xff0c;每个字符集可以表示的字符范围通常不同&#xff0c;就比如说有些字符集是无法表示汉字的。 常见的字符集有 ASCII、G…

基于Springboot的地方美食分享网站(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的地方美食分享网站(有报告)。Javaee项目&#xff0c;springboot项目。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 项目介绍&#xff1a; 采用…

C++设计模式——单例模式

单例设计模式 应用场景特点设计模式分类懒汉设计模式饿汉设计模式使用编写的测试代码运行结果 应用场景 当多个类都需要调用某一个类的一些公共接口&#xff0c;同时不想创建多个该类的对象&#xff0c;可以考虑将该类封装为一个单例模式。 特点 单例模式的特点&#xff1a;…

竞赛 题目:基于深度学习的中文对话问答机器人

文章目录 0 简介1 项目架构2 项目的主要过程2.1 数据清洗、预处理2.2 分桶2.3 训练 3 项目的整体结构4 重要的API4.1 LSTM cells部分&#xff1a;4.2 损失函数&#xff1a;4.3 搭建seq2seq框架&#xff1a;4.4 测试部分&#xff1a;4.5 评价NLP测试效果&#xff1a;4.6 梯度截断…

有Mac或无Mac电脑通用的获取安卓公钥的方案

从2023年9月开始&#xff0c;所有上架应用市场的app都需要进行APP备案。 其中后端服务器在阿里云的可以在阿里云备案&#xff0c;后端服务器在腾讯云的可以在腾讯云备案。但无论你是在什么云厂商里做备案&#xff0c;无一例外的是&#xff0c;无论是上架安卓应用还是上架IOS应…

释放机器人潜力,INDEMIND深耕底层技术

市场转暖&#xff0c;但攘外需要同时安内。 市场降温之后&#xff0c;正迎来拐点 疫情之后&#xff0c;经济逐渐下行&#xff0c;服务机器人的“好日子”也随之结束&#xff0c;整个行业都在动荡中经历渡劫。根据TE智库报告显示&#xff0c;从2022年开始&#xff0c;我国服务…

详解自动化测试之 Selenium

目录 1. 什么是自动化 2.自动化测试的分类 3. selenium&#xff08;web 自动化测试工具&#xff09; 1&#xff09;选择 selenium 的原因 2&#xff09;环境部署 3&#xff09;什么是驱动&#xff1f; 4. 一个简单的自动化例子 5.selenium 常用方法 5.1 查找页面元素&…

获取阿里云Docker镜像加速器

1、阿里云官网&#xff08;www.aliyun.com&#xff09;注册账号 2、打开“控制台首页” 控制台首页地址&#xff1a;https://home.console.aliyun.com/home/dashboard/ProductAndService 3、点击“概览->容器镜像服务 ACR” 4、打开“镜像工具->镜像加速器”页面&#x…

Motion Plan之搜素算法笔记

背景&#xff1a; 16-18年做过一阵子无人驾驶&#xff0c;那时候痴迷于移动规划&#xff1b;然而当时可学习的资料非常少&#xff0c;网上的论文也不算太多。基本就是Darpa的几十篇无人越野几次比赛的文章&#xff0c;基本没有成系统的文章和代码讲解实现。所以对移动规划的认…

Java Web——JS中的BOM

1. Web API概述 Web API 是指浏览器提供的一套接口&#xff0c;这些接口允许开发人员使用 JavaScript&#xff08;JS&#xff09;来操作浏览器功能和页面元素。通过 Web API&#xff0c;开发人员可以与浏览器进行交互&#xff0c;以实现更复杂的功能和效果。 1.1. 初识Web AP…

1.0 Zookeeper 教程

分类 Zookeeper 教程 ZooKeeper 是 Apache 软件基金会的一个软件项目&#xff0c;它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。 ZooKeeper 的架构通过冗余服务实现高可用性。 Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来&…

数据分析 - 分散性与变异的量度

全距 - 极差 处理变异性 方差度量 数值与均值的距离&#xff0c;也就是数据的差异性 标准差描述&#xff1a;典型值 和 均值的距离的方法&#xff0c;数据与均值的分散情况

开发者生态:共享知识,携手共进,共创技术辉煌

开发者生态&#xff1a;共享知识&#xff0c;携手共进&#xff0c;共创技术辉煌 在数字化时代&#xff0c;开发者是推动技术进步和创新的重要力量。他们创造着改变世界的软件和应用&#xff0c;推动着技术的边界不断向前。而在这个快速发展的时代&#xff0c;建立一个健康、活跃…