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注入

Unity中Shader法线贴图(上)

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

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

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;是科学研究、数据分析和工程实践中非常常用的一种软件工具。本文将…

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

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…

ArkTS - HarmonyOS服务卡片(创建)

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

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…

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

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

毕业设计ASP.NET 2368酒店信息管理系统【程序源码+文档+调试运行】

一、摘要 本文旨在设计并实现一个功能全面、易于使用的酒店信息管理系统。系统将管理员、客户和前台客服三种用户的需求纳入考虑&#xff0c;并针对每种用户设计了相应的功能模块。系统功能包括用户管理、客户管理、客房管理、商品管理、客房预订管理、入住管理和系统管理。此…

Android跨进程通信,IPC,RPC,Binder系统,C语言应用层调用

文章目录 Android跨进程通信&#xff0c;IPC&#xff0c;RPC&#xff0c;Binder系统&#xff0c;C语言应用层调用&#xff08;&#xff09;1.概念2.流程3.bctest.c3.1 注册服务&#xff0c;打开binder驱动3.2 获取服务 4.binder_call Android跨进程通信&#xff0c;IPC&#xf…

Linux 下集成开发环境 – PyCharm介绍

介绍 在这篇指南中&#xff0c;我将向你介绍一个集成开发环境 - PyCharm&#xff0c; 你可以在它上面使用 Python 编程语言开发专业应用。 Python 是一门优秀的编程语言&#xff0c;因为它真正实现了跨平台&#xff0c;用它开发的应用程序在 Windows、Linux 以及 Mac 系统上均…

Redis-核心数据结构

五种数据结构 String结构 String结构应用场景 Hash结构 Hash结构应用场景 List结构 List结构应用场景 Set结构 Set结构应用场景 ZSet有序结构 ZSet有序结构应用场景

智能井盖传感器功能有哪些?

智能井盖传感器是一种集成了多种先进技术的传感器设备&#xff0c;旨在强化城市的公共安全&#xff0c;确保城市基础设施的稳定运作。这种传感器具有多种功能&#xff0c;例如实时监测井盖状态、监测井下气体等是否超出阈值。借助智能井盖传感器&#xff0c;政府和城市管理部门…

sapjco3.dll has version “721.619“, but required is at least version “721.913“

context with path [] threw exception [org.glassfish.jersey.server.ContainerException: java.lang.ExceptionInInitializerError: Native library sapjco3 is too old. Found library C:\Windows\System32\sapjco3.dll has version “721.619”, but required is at least …

ThinkPHP 系列漏洞

目录 2、thinkphp5 sql注入2 3、thinkphp5 sql注入3 4、 thinkphp5 SQL注入4 5、 thinkphp5 sql注入5 6、 thinkphp5 sql注入6 7、thinkphp5 文件包含漏洞 8、ThinkPHP5 RCE 1 9、ThinkPHP5 RCE 2 10、ThinkPHP5 rce3 11、ThinkPHP 5.0.X 反序列化漏洞 12、ThinkPHP…

Python---函数的嵌套(一个函数里面又调用了另外一个函数)

函数嵌套调用------就是一个函数里面又调用了另外一个函数。 基本语法&#xff1a; # 定义 函数B def funcB():print(这是funcB函数的函数体部分...)# 定义 函数A def funcA():print(- * 80) # 这一行为了更好区分print(这是funcA函数的函数体部分...)# 假设我们在调用funcA…

论文速览 Arxiv 2023 | DMV3D: 单阶段3D生成方法

注1:本文系“最新论文速览”系列之一,致力于简洁清晰地介绍、解读最新的顶会/顶刊论文 论文速览 Arxiv 2023 | DMV3D: DENOISING MULTI-VIEW DIFFUSION USING 3D LARGE RECONSTRUCTION MODEL 使用3D大重建模型来去噪多视图扩散 论文原文:https://arxiv.org/pdf/2311.09217.pdf…