微服务通信

目录

一、Feign远程调用

1、Feign简介

2、基本使用

二、Dubbo

1、基本简介

2、基础实现


一、Feign远程调用

        先来看我们以前利用RestTemplate发起远程调用的代码:

        //通过restTemplate调用商品微服务String url = "service-product";Product product = restTemplate.getForObject( "http://"+url+"/product/" + pid, Product.class);

        这段代码存在着代码可读性差,编程体验不统一、参数复杂URL难以维护、硬编码等问题。

1、Feign简介

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

2、基本使用

        加入Fegin的依赖

<!--fegin组件--> 
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> 
</dependency>

        在主类上添加Fegin的注解(shop_order)

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients//开启Fegin
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class);}}

        也就是@EnableFeignClients是用来启用Feign客户端的支持。Feign是一个声明式的HTTP客户端,使用它可以通过定义接口来调用远程服务。这个注解会扫描指定包或当前包及其子包中的所有Feign客户端接口并自动将它们注册为Spring Bean

        然后我们在shop_order中的yml文件中配置连接池:

feign:client:config:default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置loggerLevel: FULL #  日志级别httpclient:enabled: true # 开启feign对HttpClient的支持max-connections: 200 # 最大的连接数max-connections-per-route: 50 # 每个路径的最大连接数

        其中enabled如果是false则不会使用HttpClient,而是使用默认的HTTP客户端。

        max-connections是设置HttpClient连接池的最大连接数。这个配置决定了可以同时打开的最大HTTP连接数量

        max-connections-per-route是设置每个路由(或目标主机)允许的最大连接数。这个配置有助于控制特定服务的并发连接数,防止对单个服务发起过多的请求而导致压力过大。

        总结

        日志级别尽量用basic

        使用HttpClient或OKHttp代替URLConnection

  • 引入feign-httpClient依赖
  • 配置文件开启httpClient功能,设置连接池参数

二、Dubbo

1、基本简介

        Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。Spring Cloud Alibaba微服务开发框架集成了Dubbo,可实现微服务对外暴露Dubbo协议的接口,Dubbo协议相比RESTful协议速度更快RPC:RPC是远程过程(RemoteProcedureCall)的缩写形式,调用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 进程

2、基础实现

        首先是在shop-common中创建一个用于统一业务的方法的接口,这个接口之所以定义在这个地方是因为它是的坐标是要被其他主服务调用使用的,所以把接口定义在实现服务上可以同时调用统一要实现的方法。

/**实战中,会将所有服务接口设计给一个叫做api的服务,单独维护,此处就在common服务设置*/
public interface IProductService {Product findByPid(Integer pid);
}

        在服务提供者上加入dubbo依赖(shop-product)

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

       

        然后还是在服务提供者(shop-product)的yml文件上添加dubbo配置

dubbo:scan:base-packages: com.apesource.service.implprotocols:dubbo:name: dubboport: -1registry:address: spring-cloud://localhost

        其中base-packages指定了要扫描的包路径。在这个路径下,Dubbo会自动扫描并注册标注了Dubbo注解(@Service)的类和接口。这些服务将被Dubbo注册到注册中心或被本地消费者引用。

        name: dubbo指定使用dubbo协议,这是Dubbo框架的默认协议,基于Netty实现的高性能通信协议。port:-1是表示让Dubbo自动选择一个可用端口进行服务暴露。如果你想指定特定端口,可以将-1替换为具体的端口号。

        registry表示这个节点配置服务注册中心,Dubbo服务会向这里注册或者从这里发现其他服务。spring-cloud表示Dubbo与Spring Cloud集成,借助Spring Cloud的服务注册与发现机制来管理服务。localhost指的是本地注册中心地址。

        然后将shop-product模块中的service层实现类的方法进行暴露服务

//暴露服务:注意这里使用的是dubbo提供的注解@Service,而不是Spring的
@Service
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements IProductService,IService<Product> {@AutowiredProductMapper productMapper;@Overridepublic Product findByPid(Integer pid) {return productMapper.selectById(pid);}}

        注意这里的@Service导入的包是dubbo提供的@Service,这个注解用于将当前类作为Dubbo服务暴露出去,供其他微服务消费。

        然后我们再去服务消费者中去编写代码(shop-order):

        首先是添加依赖:

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

        然后去yml中添加配置信息:

dubbo:registry:address: spring-cloud://localhostcloud:subscribed-services: service-product

        这里面也是通过adress配置了Dubbo的注册中心地址,cloud表示这个配置项用于指定Dubbo消费者要订阅的服务名称,这里是把service-product的服务订阅,并且从注册中心获取该服务的可用实例信息。当服务消费者启动时,它会从注册中心中获取service-product服务的地址,并通过Dubbo进行远程调用

       

        然后我们在shop-order中的服务器去使用service-product服务

@RestController
public class OrderController {//引用服务@Referenceprivate IProductService productService;@Autowiredprivate IOrderService orderService;//Ribbon下单@RequestMapping("/order/prod/{pid}")public Order order(@PathVariable("pid") Integer pid) {//通过dubbo调用商品微服务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;}}

        @Reference这是Dubbo的注解,用于从注册中心引用远程服务。在这里,它引用了一个刚才在common实体服务中的公共接口IProductService,这个接口又被刚才的ProductServiceImpl所实现,所以这个productService代理对象就是向上转型的ProductServiceImpl对象。它可以调用被调用服务的代码完成查找商品信息操作,这个服务提供了与商品相关的操作。

        后面的业务基本和以前的微服务操作一致。

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

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

相关文章

proc文件的写操作机制

“一切皆是文件”。 Linux的基本哲学之一。它是指linux系统中的所有一切都可以通过文件的方式访问、管理&#xff0c;即便不是文件&#xff0c;也以文件的形式来管理。例如硬件设备、进程、套接字等都抽象成文件&#xff0c;使用统一的用户接口&#xff0c;虽然文件类型各不相同…

qt-内置图片遍历-Lambda按钮

内置图片遍历-Lambda按钮 知识点widget.hwidget.cppmain.cpp运行图 知识点 使用新的connect语法连接信号和槽 --Lambda 使用 connect(btn, &QToolButton::clicked, this, [this, btn,index]() { onToolButtonClicked(btn)}); // Lambda表达式中调用成员函数&#xff0c;并…

Springboot打包、部署

一、导入maven打包插件 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins> </build> 二、执行打包操作&#xff08;…

基于imx6ull平台opencv的图像采集和显示屏LCD显示功能(不带Qt界面)

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境 三、开发流程3.1 编写测试3.2 验证功能 一、概述 本文档是针对imx6ull平台opencv的图像采集和显示屏LCD显示功能&#xff0c;opencv通过摄像头采集视频图像&#xff0c;将采集的视频图像送给显示屏LCD进行显示。 测试结果…

【数据结构3】哈希表、哈希表的应用(集合与字典、md5算法和文件的哈希值)

1 哈希表 哈希表一个通过哈希函数来计算数据存 储位置的数据结构&#xff0c;通常支持如下操作: 插入(键&#xff0c;值):插入键值对(键&#xff0c;值) Get(key):如果存在键为键的键值对则返回其值&#xff0c;否则返回空值 删除(键):删除键为键的键值对哈希表(Hash Table&am…

使用kafka改造分布式事务

文章目录 1、kafka确保消息不丢失&#xff1f;1.1、生产者端确保消息不丢失1.2、kafka服务端确保消息不丢失1.3、消费者确保正确无误的消费 2、生产者发送消息 KafkaService3、UserInfoServiceImpl -> login()4、service-account - > AccountListener.java 1、kafka确保消…

Renesa Version Board开发RT-Thread 之UART驱动应用

目录 概述 1 硬件介绍 2 软件配置 2.1 RT-Thread Studio配置参数 2.2 FSP配置MCU 3 RT-Thread中UART的接口介绍 3.1 RT-Thread UART简介 3.2 RT-Thread 下的UART接口 4 UART的应用 4.1 应用功能实现 4.2 源代码文件 5 测试 程序下载地址&#xff1a; RenesaVersio…

应用层协议(上)Http(URL、Cookie、Session)内含逻辑图解通俗易懂!

绪论​ “少年没有乌托邦 心向远方自明朗”&#xff0c;本章是应用层常用且重要的协议htttp&#xff0c;没看过应用层建议一定先看那一篇后再看本章才能更好的去从上到下的理解应用层。 话不多说安全带系好&#xff0c;发车啦&#xff08;建议电脑观看&#xff09;。 1.Http协…

Linux rocky 9.2 安装mysql-8.0.39-linux-glibc2.28-x86_64.tar.xz

数据库官方下载&#xff1a;MySQL :: Download MySQL Community Server 本文也绑定该资源包&#xff0c;免费提供下载学习。 1.系统版本 2.新建目录&#xff0c;存放数据库安装包&#xff0c;并且上传 需要用到的工具&#xff1a;yum -y install vim lrzsz tar 上传解压&…

探索Python交互式编程的新境界:Python-prompt-toolkit的魔法

文章目录 探索Python交互式编程的新境界&#xff1a;Python-prompt-toolkit的魔法背景&#xff1a;为何选择Python-prompt-toolkit&#xff1f;Python-prompt-toolkit是什么&#xff1f;如何安装Python-prompt-toolkit&#xff1f;简单使用&#xff1a;Python-prompt-toolkit的…

C++,std::queue 详解

文章目录 1. 概述2. 包含头文件3. 基本操作3.1 构造函数3.2 赋值操作3.3 成员函数 4. 迭代器5. 示例6. 注意事项参考 1. 概述 std::queue 是 C 标准模板库&#xff08;STL&#xff09;中的一个容器适配器&#xff0c;它提供了一种先进先出&#xff08;FIFO&#xff09;的数据结…

【研发日记】嵌入式处理器技能解锁(五)——TI C2000 DSP的中断系统

文章目录 前言 背景介绍 中断框架 外设中断 ePIE模块 CPU中断 中断嵌套 应用实例 总结 参考资料 前言 见《【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法》 见《【研发日记】嵌入式处理器技能解锁(二)——TI C2000 DSP的SCI(串口)通信》 见…

基于Java的小区物业管理系统APP的设计与实现(论文+源码)_kaic

摘 要 小区物业管理系统是现代社会中非常热门的软件&#xff0c;伴随着社区规模的不断扩大和住户的不断增多&#xff0c;本系统的主要目的是辞别帐本以及传统的单一数据管理系统&#xff0c;快捷的保存用户各种数据信息。本系统针对Java系统展开&#xff0c;使用Java、SpringB…

无人机RTK定位定向技术详解

无人机RTK&#xff08;Real-Time Kinematic&#xff0c;实时动态差分技术&#xff09;定位定向技术&#xff0c;是无人机领域的一项高精度导航与定位技术。它结合了全球导航卫星系统&#xff08;如GPS、GLONASS、Galileo、BDS等&#xff09;与实时差分技术&#xff0c;通过地面…

超越GPT4V,最强多模态MiniCPM-V2.6模型分享

MiniCPM-V2.6是由OpenBMB开发的一款多模态大型语言模型&#xff08;MLLM&#xff09;&#xff0c;专为视觉-语言理解设计。 MiniCPM-V2.6模型能够处理图像、视频和文本输入&#xff0c;并提供高质量的文本输出。 MiniCPM-V 2.6模型在单图像理解方面超越了广泛使用的专有模型&…

机器学习课程学习周报九

机器学习课程学习周报九 文章目录 机器学习课程学习周报九摘要Abstract一、机器学习部分1.1 Word Embedding1.1.1 词嵌入的基本概念1.1.2 word2vec连续词袋模型CBOW1.1.3 word2vec跳字模型Skip-gram 1.2 Transformer代码实践DatasetDataloaderModelLearning rate scheduleModel…

windows javascript 打开、关闭摄像头

1. 效果 打开摄像头 关闭摄像头&#xff08;包括指示灯也关了的&#xff09; 2. 代码 open_close_camera.html // open_close_camera.html <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>use camera</title>…

使用Dotween制作按钮弹性动画效果

效果&#xff1a; 方式&#xff1a; 优点&#xff0c;不需要写任何代码、稳定、可自定义效果

Agent实际落地的应用 未来生活的无形助手

在这个信息爆炸的时代&#xff0c;我们每个人都在追求更高效的生活方式。想象一下&#xff0c;如果有一个无形的助手&#xff0c;能够理解我们的需求&#xff0c;自动处理繁琐的任务&#xff0c;甚至为我们提供个性化的建议&#xff0c;那将是多么美好的体验&#xff01;这正是…

数字模拟IC设计前端、后端、前仿、后仿新版虚拟机

虚拟化平台&#xff1a;VMware Workstation 15 Pro以上版本 操作系统&#xff1a;CentOS Linux release 7.9.2009 (Core) 一、射频模拟IC设计必备软件 Cadence IC06.18.350/IC23.10.080&#xff08;virtuoso&#xff09; Cadence SPECTRE23.10.538-isr10 Cadence ASSURA04.…