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

news2024/11/15 9:25:40

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 {
    
      @Autowired
      private IProductService productService;
    
      @Autowired
      private 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: BASIC
       http: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{
      @AutoWired
      private ProductMapper productMapper;
      @Override
      public 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;
      
        // 引用服务
        @Reference
        private 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.coloradmin.cn/o/1231571.html

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

相关文章

指针变量和地址

A.指针变量和地址 理解了内存和地址的关系&#xff0c;我们再回到C语⾔&#xff0c;在C语⾔中创建变量其实就是向内存申请空间&#xff0c;比如&#xff1a; #include <stdio.h> int main() {int a 10;return 0; } ⽐如&#xff0c;上述的代码就是创建了整型变量a&…

Android设计模式--责任链模式

无善无恶心之体&#xff0c;有善有恶意之动。知善知恶是良知&#xff0c;为善去恶是格物。 一&#xff0c;定义 使多个对象都有机会处理请求&#xff0c;从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直…

AcWing 717. 简单斐波那契

原题链接 题目 以下数列 0 1 1 2 3 5 8 13 21 … 被称为斐波纳契数列。 这个数列从第 3 项开始&#xff0c;每一项都等于前两项之和。 输入一个整数 N &#xff0c;请你输出这个序列的前 N 项。 输入格式 一个整数 N 。 输出格式 在一行中输出斐波那契数列的前 N 项&…

Visio免费版!Visio国产平替软件,终于被我找到啦!

作为一个职场人士&#xff0c;我经常需要绘制各种流程图和图表&#xff0c;而Visio一直是我使用的首选工具。但是&#xff0c;随着公司的发展和工作的需要&#xff0c;我逐渐发现了Visio的优点和不足。 首先&#xff0c;让我们来看看Visio的优点。Visio是一个专业的流程图和图…

生成perf flame性能分析图

flame svg图是一种用来可视化CPU的调用栈的图形&#xff0c;可以帮助分析程序的性能瓶颈。flame svg图的每一列代表一个CPU的采样点&#xff0c;每一行代表一个函数调用&#xff0c;颜色代表不同的函数或模块。flame svg图的高度表示CPU的利用率&#xff0c;宽度表示函数的执行…

PCIe协议加持,SD卡9.1规范达到媲美SSD的速度4GB/s

近日&#xff0c;SD协会&#xff08;SDA&#xff09;宣布了最新的SD Express存储卡的进化&#xff0c;将microSD Express存储卡的速度提高了一倍&#xff0c;达到2GB/s&#xff0c;并引入了4个新的SD Express速度等级&#xff0c;以确保新的SD 9.1规范中最低的顺序性能水平。这…

基于梯度算法优化概率神经网络PNN的分类预测 - 附代码

基于梯度算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于梯度算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于梯度优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

常见负载均衡算法/策略(概念)

目录 1.1. 轮循均衡&#xff08;Round Robin&#xff09; 1.2. 权重轮循均衡&#xff08;Weighted Round Robin&#xff09; 1.3. 随机均衡&#xff08;Random&#xff09; 1.4. 权重随机均衡&#xff08;Weighted Random&#xff09; 1.5. 响应速度均衡&#xff08;R…

场景交互与场景漫游-对象选取(8-2)

对象选取示例的代码如程序清单8-11所示&#xff1a; /******************************************* 对象选取示例 *************************************/ // 对象选取事件处理器 class PickHandler :public osgGA::GUIEventHandler { public:PickHandler() :_mx(0.0f), _my…

Excel数据可视化—波士顿矩阵图【四象限图】

EXCEL系列文章目录 Excel系列文章是本人亲身经历职场之后萌发的想法&#xff0c;为什么Excel覆盖如此之广&#xff0c;几乎每个公司、学校、家庭都在使用&#xff0c;但是它深藏的宝藏功能却很少被人使用&#xff0c;PQ、BI这些功能同样适用于数据分析&#xff1b;并且在一些需…

海云安入选证券期货业网络和数据安全实验室“安全合作伙伴”--助力金融科技产业安全发展

近日&#xff0c;为进一步把握数字经济发展新机遇&#xff0c;推进金融与科技深度融合&#xff0c;推动金融业高质量发展&#xff0c;搭建产业链各方交流分享平台。以“数向金科&#xff0c;智引未来”为主题的2023&#xff08;第六届&#xff09;金融科技产业大会在北京举办。…

#gStore-weekly | gAnswer的使用

gAnswer能够将自然语言问题转化成包含语义信息的查询图&#xff0c;然后&#xff0c;将查询图转化成标准的SPARQL查询&#xff0c;并将这些查询在图数据库中执行&#xff0c;最终得到用户的答案。这篇文章将介绍gAnswer的使用。 目前gAnswer仅仅提供了HTTP API&#xff0c;以J…

1688API接口接入|阿里1688-B类电商基础链路专业化体验升级

新挑战&#xff0c;新契机&#xff01; 当下整个互联网的竞争环境的变化为我们带来新的机遇和挑战。1688作为连接中小生产商、贸易商和零售商的源头货源首选平台&#xff0c;持续不断地为B类买家提供更专业的服务和更优质的源头厂货供给&#xff0c;打造核心竞争力。 面对新的…

管家婆订货易在线商城任意文件上传漏洞复现

0x01 产品简介 管家婆订货易&#xff0c;帮助传统企业构建专属的订货平台&#xff0c;PC微信APP小程序h5商城5网合一&#xff0c;无缝对接线下的管家婆ERP系统&#xff0c;让用户订货更高效。支持业务员代客下单&#xff0c;支持多级推客分销&#xff0c;以客带客&#xff0c;拓…

比赛调研资料

视觉文旅 现有的模型 数据 功能 精准营销 基于地理推荐能力 乡村圈分析能力 都市圈分析能力 产品体系 三大数据平台 携程问道 旅游服务框架&#xff1a;前置&#xff08;推荐种草&#xff09;&#xff0c;途中&#xff08;客服&#xff09;&#xff0c;售后&#xff0…

淘宝商品详情数据接口(Taobao.item_get)

淘宝商品详情接口是一种程序化的接口&#xff0c;允许开发者根据商品ID或商品链接&#xff0c;获取淘宝平台上的商品详细信息。通过这个接口&#xff0c;开发者可以方便地获取商品的标题、价格、销量、描述等数据&#xff0c;进而提供给用户进行展示和购买。 使用淘宝商品详情…

基于饥饿游戏算法优化概率神经网络PNN的分类预测 - 附代码

基于饥饿游戏算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于饥饿游戏算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于饥饿游戏优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

前端入门(二)Vue2到Vue3

文章目录 Vue简介Vue的特点Hello, Vue Vue基本语法模板语法数据绑定&#xff08;v-bind、v-model&#xff09;el与data的两种写法 数据代理实现原理Object.defineProperty()数据代理 事件处理&#xff08;v-on:click / click&#xff09;事件修饰符键盘事件&#xff08;略&…

关于RecyclerView的瀑布流 分割线左右间距问题

记录一下开发遇到的RecyclerView 的 瀑布流 左右间距设置问题。 在GridLayoutManager中 &#xff0c;item的布局顺序为 在该布局中&#xff0c;他的index就是左右左右&#xff0c;position所对应的itemView就是准确的。即 左0&#xff0c;右1&#xff0c;左2&#xff0c;右3&a…

卷积神经网络(VGG-19)灵笼人物识别

文章目录 前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;我的环境&#xff1a; 2. 导入数据3. 查看数据 二、数据预处理1. 加载数据2. 可视化数据3. 再次检查数据4. 配置数据集5. 归一化 三、构建VGG-19网络1. 官方模型&#xff08;已打包好&#xff…