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.mzph.cn/news/151516.shtml

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

相关文章

Java code auditing

1) FindBugs Checkstyle PMD 2) OWASP ZAP Burp Suite (XSS漏洞) 3) SQL注入

大数据-之LibrA数据库系统告警处理(ALM-25000 LdapServer服务不可用)

告警解释 系统按30秒周期性检测LdapServer的服务状态&#xff0c;当检测到两个LdapServer服务均异常时产生该告警。 当检测到一个或两个LdapServer服务恢复时告警恢复。 告警属性 告警ID 告警级别 可自动清除 25000 致命 是 告警参数 参数名称 参数含义 ServiceNam…

Unity中Shader法线贴图(上)

文章目录 前言一、法线纹理的作用二、为什么法线贴图长这样&#xff1f;&#xff08;蓝色&#xff09;三、法线贴图能使纹理采样时&#xff0c;进行偏移采样四、在Shader中使用法线贴图1、在属性面板定义一个变量来接收法线贴图2、在使用前声明 _NormalTex3、在片元着色器中&am…

金融数字化是什么?如何进行金融数字化转型?

​金融数字化 金融数字化&#xff0c;简单来说&#xff0c;就是利用数字技术对金融服务进行升级和转型。这包括但不限于电子支付、移动银行、网上银行、智能投顾、数字货币等。这些创新不仅优化了金融服务体验&#xff0c;也提高了金融效率&#xff0c;使金融行业能够更好地服…

编程刷题网站以及实用型网站推荐

1、牛客网在线编程 牛客网在线编程https://www.nowcoder.com/exam/oj?page1&tab%E8%AF%AD%E6%B3%95%E7%AF%87&topicId220 2、力扣 力扣https://leetcode.cn/problemset/all/ 3、练码 练码https://www.lintcode.com/ 4、PTA | 程序设计类实验辅助教学平台 PTA | 程…

【赠书第6期】MATLAB科学计算从入门到精通

文章目录 前言 1 安装与配置 2 变量定义 3 数据处理 4 绘图 5 算法设计 6 程序调试 7 推荐图书 8 粉丝福利 前言 MATLAB 是一种高级的科学计算和数据可视化平台。它由 MathWorks 公司开发&#xff0c;是科学研究、数据分析和工程实践中非常常用的一种软件工具。本文将…

禁止点击-样式及事件不可用

禁用样式&#xff1a;cursor: not-allowed 事件不可用&#xff1a;pointer-events:none <div class"rightButton" style"cursor: not-allowed"><el-buttonstyle"background: #165DFF; color: #FFFFFF;pointer-events:none;"click"…

《微信小程序开发从入门到实战》学习二十二

3.3 开发创建投票页面 3.3.10 使用switch开关组件 用switch开关组件增加一个设置是否匿名投票的功能。 switch常用属性如下&#xff1a; checked 开还是关&#xff0c;默认false关 disabled 是否禁用&#xff0c;默认false不禁用&#xff0…

Java Web——JS中的BOM

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

Oracle 查找非系统用户结合了10,11,12,19

oracle 12开始有了INHERITEDYES;字段来区分系统用户 select username from dba_users where INHERITEDYES; 对于12以下的版本&#xff0c;按created日期字段筛选会发现创建时间间隔比较大&#xff0c;好区分。 本人当前有个需求需要找出所有数据库的非系统用户&#xff0c;来…

ArkTS - HarmonyOS服务卡片(创建)

可以参考官网文档 其中我们在已有的文件中File > New > Service Widget创建你想要的小卡片 本文章发布时目前可使用的模板就三种 有卡片后的new 最终效果

解决word之间复制公式时,公式编辑器变成图片

在从一个word向另一个word复制公式时&#xff0c;有时会出现公式编辑器里的公式复制后变成了很糊的图片的情况。这是由于word版本不对造成的。一个word后缀是.doc&#xff0c;另一个是.docx。 解决方法是新建一个word,同步两个word版本后缀 可以尝试的方法&#xff1a;更改wo…

对uniapp弹窗封装

1.新建文件wyb-popup在里面创建wyb-popup.vue和iconfont.css <template><view v-if"isShow"><viewtap.stop.preventtouchmove.stop.preventclass"wyb-popup-box":style"{transitionDuration: duration ms,opacity: contentOpacity ||…

iceberg学习笔记(2)—— 与Hive集成

前置知识&#xff1a; 1.了解hadoop基础知识&#xff0c;并能够搭建hadoop集群 2.了解hive基础知识 3.Iceberg学习笔记&#xff08;1&#xff09;—— 基础知识-CSDN博客 可以参考&#xff1a; Hadoop基础入门&#xff08;1&#xff09;&#xff1a;框架概述及集群环境搭建_TH…

【Go学习之 go mod】gomod小白入门,在github上发布自己的项目(项目初始化、项目发布、项目版本升级等)

参考 Go语言基础之包 | 李文周的博客Go mod的使用、发布、升级 | weiGo Module如何发布v2及以上版本1.2.7. go mod命令 — 新溪-gordon V1.7.9 文档golang go 包管理工具 go mod的详细介绍-腾讯云开发者社区-腾讯云Go Mod 常见错误的原因 | walker的博客 项目案例 oceanweav…

AI实践与学习2_提示词工程(PE)学习与实践

前言 想要GPT模型回答的更好&#xff0c;更好的应用在业务场景中&#xff0c;需要考虑Prompt的写法规则、模型参数、渲染方式&#xff08;流式响应&#xff09;等 下面主要结合开源文档梳理一些写Prompt的一些技巧。 https://learningprompt.wiki/zh-Hans/docs/chatgpt-lear…

网络机顶盒什么牌子好?内行盘点最新网络机顶盒排行榜

网络机顶盒是我们使用率最高的数码产品&#xff0c;因工作关系经常会有朋友问我网络机顶盒什么牌子好&#xff0c;怎么挑选网络机顶盒&#xff1f;今天要介绍的是目前业内最新发布的网络机顶盒排行榜&#xff0c;不懂行的朋友们可以以此作为参考。 第一名&#xff1a;泰捷WEBOX…

CocoaPods podfile 文件配置

记录一下关于 CocoaPods podfile 文件配置 指定源(Source) 默认情况下&#xff0c;在全局级别指定的源将按照依赖项匹配指定的顺序进行搜索。 对于特定的依赖&#xff0c;可以单独指定依赖源: pod PonyDebugger, :source > https://github.com/CocoaPods/Specs.git使用字库…

【Java并发编程九】同步控制

ReentrantLock(重入锁) ReentrantLock的基本使用 ReentrantLock可以自己决定加锁的位置和解锁的位置。 package myTest;import java.util.ArrayList; import java.util.concurrent.locks.ReentrantLock;public class myTest implements Runnable{// 重入锁public static Reen…

CISP模拟试题(三)

免责声明 文章仅做经验分享用途,利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行承担!!! 1. 人们对信息安全的认识从信息技术安全发展到信息安全保障,主要是由于: A.为了更好地完成组…