【架构之路】微服务中常用的几种通信方式

2024年,计算机相关专业还值得选择吗?

579a429daf314744b995f37351b46548

强烈推荐

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能

b004071ozy_05_amzn

引言

微服务架构由于其灵活性、高可扩展性和易维护性,已成为构建复杂系统的主流选择。

微服务架构将系统拆分为多个独立的服务,每个服务负责特定的功能,并通过各种通信方式进行协作。

这些通信方式在确保系统高效、可靠运行的过程中起着至关重要的作用。

本文将介绍几种常见的微服务通信方式,包括HTTP REST、gRPC、消息队列和WebSocket,并通过Java示例说明它们的应用场景和实现方法。


几种通信方式

在微服务架构中,服务之间的通信是关键组件之一。常见的通信方式包括HTTP REST、gRPC、消息队列、以及基于WebSocket的通信。下面举例说明这些通信方式。

1. HTTP REST

HTTP REST是一种广泛使用的同步通信方式。每个微服务通过HTTP请求相互通信,通常使用JSON作为数据格式。

示例:

假设有两个微服务,一个用于用户管理(User Service),另一个用于订单管理(Order Service)。Order Service需要从User Service获取用户信息。

User Service:

@RestController
@RequestMapping("/users")
public class UserController {

    @GetMapping("/{id}")
    public ResponseEntity<User> getUserById(@PathVariable String id) {
        // 假设从数据库获取用户信息
        User user = userService.findUserById(id);
        return ResponseEntity.ok(user);
    }
}

Order Service:

@Service
public class UserServiceClient {

    private final RestTemplate restTemplate;

    @Autowired
    public UserServiceClient(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    public User getUserById(String userId) {
        String url = "http://USER-SERVICE/users/" + userId;
        return restTemplate.getForObject(url, User.class);
    }
}

配置RestTemplate:

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
2. gRPC

gRPC是Google开源的一个高性能、通用的RPC框架,使用Protocol Buffers作为接口定义语言,并支持多种编程语言。

示例:

假设有两个微服务,一个用于用户管理(User Service),另一个用于订单管理(Order Service)。Order Service需要从User Service获取用户信息。

User Service:

1.定义.proto文件:

syntax = "proto3";

option java_package = "com.example.userservice";
option java_outer_classname = "UserServiceProto";

service UserService {
    rpc GetUser (UserRequest) returns (UserResponse) {}
}

message UserRequest {
    string id = 1;
}

message UserResponse {
    string id = 1;
    string name = 2;
    string email = 3;
}

2.实现服务端:

public class UserServiceImpl extends UserServiceGrpc.UserServiceImplBase {

    @Override
    public void getUser(UserRequest request, StreamObserver<UserResponse> responseObserver) {
        // 假设从数据库获取用户信息
        UserResponse response = UserResponse.newBuilder()
                .setId(request.getId())
                .setName("John Doe")
                .setEmail("john.doe@example.com")
                .build();
        responseObserver.onNext(response);
        responseObserver.onCompleted();
    }
}

3.配置并启动gRPC服务器:

public class GrpcServer {

    public static void main(String[] args) throws IOException, InterruptedException {
        Server server = ServerBuilder.forPort(8080)
                .addService(new UserServiceImpl())
                .build();

        server.start();
        System.out.println("Server started on port 8080");
        server.awaitTermination();
    }
}

Order Service:

1.创建gRPC客户端:

public class UserServiceClient {

    private final UserServiceGrpc.UserServiceBlockingStub userServiceStub;

    public UserServiceClient() {
        ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8080)
                .usePlaintext()
                .build();
        userServiceStub = UserServiceGrpc.newBlockingStub(channel);
    }

    public UserResponse getUserById(String userId) {
        UserRequest request = UserRequest.newBuilder().setId(userId).build();
        return userServiceStub.getUser(request);
    }
}
3. 消息队列

消息队列是一种异步通信方式,常用的消息队列系统有RabbitMQ、Apache Kafka等。消息队列可以解耦生产者和消费者,实现异步处理。

示例:

假设有两个微服务,一个用于订单管理(Order Service),另一个用于通知服务(Notification Service)。订单服务在订单创建后发送消息到消息队列,通知服务接收并处理消息。

Order Service:

@Service
public class OrderService {

    private final RabbitTemplate rabbitTemplate;

    @Autowired
    public OrderService(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }

    public void createOrder(Order order) {
        // 创建订单逻辑
        rabbitTemplate.convertAndSend("order.exchange", "order.created", order);
    }
}

Notification Service:

@Service
public class NotificationService {

    @RabbitListener(queues = "order.queue")
    public void handleOrderCreated(Order order) {
        // 处理订单创建通知
        System.out.println("Received order: " + order);
    }
}

配置RabbitMQ:

@Configuration
public class RabbitMQConfig {

    @Bean
    public Queue queue() {
        return new Queue("order.queue");
    }

    @Bean
    public TopicExchange exchange() {
        return new TopicExchange("order.exchange");
    }

    @Bean
    public Binding binding(Queue queue, TopicExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with("order.created");
    }
}

4. WebSocket

WebSocket是一种双向通信协议,适用于需要实时通信的场景。

示例:

假设有一个聊天应用,两个微服务分别处理用户和聊天信息。

Chat Service:

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new ChatWebSocketHandler(), "/chat");
    }
}

@Component
public class ChatWebSocketHandler extends TextWebSocketHandler {

    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        // 处理收到的消息
        session.sendMessage(new TextMessage("Received: " + message.getPayload()));
    }
}

应用场景

不同的通信方式适用于不同的应用场景,每种方式都有其优缺点和适用领域。以下是对上述几种通信方式的应用场景的说明:

1. HTTP REST

应用场景:

  • Web服务与API接口:HTTP REST是构建Web服务和API接口的首选方法,广泛应用于提供对外部系统的访问接口。
  • 同步请求响应:适用于需要立即得到响应的请求,比如用户查询、订单查询等。
  • 简单易用:对开发者友好,易于实现和调试,适合快速开发。

示例场景:

  • 用户注册、登录等操作。

  • 产品信息查询,订单管理系统。

2. gRPC

应用场景:

  • 高性能通信:适用于需要高性能、低延迟通信的场景,如微服务之间的大量数据传输。
  • 多语言支持:适用于多语言环境,因为gRPC支持多种编程语言。
  • 严格的接口定义:适用于需要严格接口和数据类型约束的场景,通过Protocol Buffers定义接口。

示例场景:

  • 实时数据处理,如在线游戏、实时数据分析。

  • 微服务内部通信,如电商系统中的订单服务与库存服务之间的通信。

3. 消息队列

应用场景:

  • 异步处理:适用于需要异步处理的场景,避免长时间的同步等待。
  • 解耦系统:适用于希望解耦生产者和消费者的场景,使得系统更加灵活和可扩展。
  • 任务队列:适用于需要将任务放入队列中逐步处理的场景,如邮件发送、日志处理。

示例场景:

  • 订单创建后发送通知或进行库存更新。

  • 用户注册后发送欢迎邮件。

  • 日志收集与处理系统。

4. WebSocket

应用场景:

  • 实时通信:适用于需要实时双向通信的场景,如聊天应用、在线游戏、实时协作工具。
  • 低延迟要求:适用于对延迟有严格要求的应用,能够提供持续的低延迟连接。
  • 状态保持:适用于需要保持连接状态的应用,如实时数据更新。

示例场景:

  • 聊天应用,如即时消息系统。

  • 实时交易平台,如股票交易、加密货币交易。

  • 实时协作工具,如在线文档协作、实时编辑器。

场景应用总结
  • HTTP REST适用于简单的请求响应模型和对外提供API的场景,易于实现和使用。
  • gRPC适用于需要高性能通信和严格接口定义的场景,适合多语言环境和实时数据处理。
  • 消息队列适用于异步处理和解耦的场景,适合任务队列和事件驱动架构。
  • WebSocket适用于需要实时双向通信和低延迟的场景,适合实时应用和需要保持连接状态的场景。

根据具体的业务需求和性能要求,开发者可以选择最适合的通信方式来实现微服务之间的通信。


总结

微服务通信方式的选择在很大程度上影响系统的性能、可靠性和扩展性。

通过了解和掌握HTTP REST、gRPC、消息队列和WebSocket等不同通信方式的特点和应用场景,开发者可以根据具体业务需求选择最合适的通信方式,从而构建出高效、灵活和可扩展的微服务系统。

在实际应用中,可能需要结合多种通信方式,以发挥各自的优势,满足系统的不同需求。


强烈推荐

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能

b004071ozy_05_amzn


专栏集锦

大佬们可以收藏以备不时之需:

Spring Boot 专栏:http://t.csdnimg.cn/peKde

ChatGPT 专栏:http://t.csdnimg.cn/cU0na

Java 专栏:http://t.csdnimg.cn/YUz5e

Go 专栏:http://t.csdnimg.cn/Jfryo

Netty 专栏:http://t.csdnimg.cn/0Mp1H

Redis 专栏:http://t.csdnimg.cn/JuTue

Mysql 专栏:http://t.csdnimg.cn/p1zU9

架构之路 专栏:http://t.csdnimg.cn/bXAPS


写在最后

感谢您的支持和鼓励! 😊🙏

如果大家对相关文章感兴趣,可以关注公众号"架构殿堂",会持续更新AIGC,java基础面试题, netty, spring boot, spring cloud等系列文章,一系列干货随时送达!

如果有项目或者毕设合作,请V:fengyelin8866,备注毕设

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis脑裂问题详解及解决方案

Redis脑裂问题 Redis脑裂问题是指在主从集群中同时存在两个主节点&#xff0c;这会导致不同客户端往不同的主节点写入数据&#xff0c;最终导致数据不一致&#xff0c;甚至数据丢失。 哨兵主从集群脑裂 场景描述 假设有三台服务器&#xff1a;一台主服务器&#xff0c;两台…

对Java中二维数组的深层认识

首先&#xff0c;在JAVA中&#xff0c;二维数组是一种数组的数组。它可以看作是一个矩阵&#xff0c;通常是由于表示二维数据节后&#xff0c;如表格和网格。 1.声明和初始化二维数组 声明 int[][] arr;初始化 int[][] arrnew int[3][4];或者用花括号嵌套 int[][] arr{{1,…

高温预警,快收下这份机房运维攻略

高温预警 华东区即将迎来最强高温&#xff0c;根据历史经验&#xff0c;数据机房在夏季高温环境导致设备温度过高&#xff0c;宕机事件明显增加&#xff0c;为保障系统健康稳定运行&#xff0c;需要针对数据机房空调、设备的运行状态及环境进行检查&#xff0c;并同时期开展防尘…

[Shell编程学习路线]--shell中重定向和管道符(详细介绍)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f6e0;️Shell编程专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月12日10点50分 &#x1f004;️文章质量&#xff1a;93分 ——前言—— 在Shell编程中&#xff0c;重定向和管道符是两个…

MySQL 示例数据库大全

前言&#xff1a; 我们练习 SQL 时&#xff0c;总会自己创造一些测试数据或者网上找些案例来学习&#xff0c;其实 MySQL 官方提供了好几个示例数据库&#xff0c;在 MySQL 的学习、开发和实践中具有非常重要的作用&#xff0c;能够帮助初学者更好地理解和应用 MySQL 的各种功…

内行都在学的大模型黑书!外网爆火LLM手册

前言 在人工智能的浪潮中&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域正经历着前所未有的变革。而在这场变革中&#xff0c;Transformer架构无疑成为了最引人瞩目的明星。作为对Transformer工作原理充满好奇的你&#xff0c;是否渴望深入了解这一技术的奥秘&…

Flutter基础 -- Flutter常用组件

目录 1. 文本组件 Text 1.1 基础用法 1.2 Text 定义 1.3 Text 示例 1.4 Text.rich、RichText 、TextSpan 1.5 RichText 示例 2. 导入资源 2.1 加入资源 2.2 加入图片 3. 图片组件 image 3.1 colorBlendMode 混合参数 3.2 fit 图片大小适配 3.3 ImageProvider 图片…

AI开发基础1-操作系统

这里介绍AI服务器开发所需的必要操作系统知识 1.文件系统 理论基础是《操作系统》&#xff0c;再深入些是《计算机组成原理》 目的是管理操作系统&#xff0c;核心是文件系统, 通过命令行操作 路径是文件系统中用来指示文件或目录位置的描述。 1.1 绝对路径 (Absolute Path)…

Linux ldd和ldconfig

ldconfig ldconfig 查看默认库路径和ld.so.conf包含的库路径&#xff0c;来建立运行时动态装载的库查找路径。 ldconfig命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),…

【python】OpenCV—Cartoonify and Portray

参考来自 使用PythonOpenCV将照片变成卡通照片 文章目录 1 卡通化codecv2.medianBlurcv2.adaptiveThresholdcv2.kmeanscv2.bilateralFilter 2 肖像画cv2.divide 1 卡通化 code import cv2 import numpy as npdef edge_mask(img, line_size, blur_value):gray cv2.cvtColor(…

第二证券炒股技巧:科创板和创业板参与门槛一样吗?

科创板和创业板参加门槛是不相同的。 科创板注册条件&#xff1a;申请注册权限前20个生意日证券及资金账户日均财物不低于50万元&#xff0c;不包括融资融券融入的资金与证券&#xff0c;两年及以上的股票生意经历&#xff0c;风险承受才能C4及以上。 创业板注册条件&#xf…

Redux 与 MVI:Android 应用的对比

Redux 与 MVI&#xff1a;Android 应用的对比 在为 Android 应用选择合适的状态管理架构时可能会感到困惑。在这个领域中&#xff0c;有两种流行的选择是 Redux 和 MVI&#xff08;Model-View-Intent&#xff09;。两者都有各自的优缺点&#xff0c;因此在深入研究之前了解它们…

【YOLO系列】YOLOv1学习(PyTorch)原理加代码

论文网址&#xff1a;https://arxiv.org/pdf/1506.02640 训练集博客链接&#xff1a;目标检测实战篇1——数据集介绍(PASCAL VOC&#xff0c;MS COCO)-CSDN博客 代码文件&#xff1a;在我资源里&#xff0c;但是好像还在审核&#xff0c;大家可以先可以&#xff0c;如果没有的…

Hadoop3:MapReduce源码解读之Map阶段的FileInputFormat的切片原理(2)

Job那块的断点代码截图省略&#xff0c;直接进入切片逻辑 参考&#xff1a;Hadoop3&#xff1a;MapReduce源码解读之Map阶段的Job任务提交流程&#xff08;1&#xff09; 4、FileInputFormat切片源码解析 切片入口 获取切片 获取切片最大的Size和切片最小的Size 判断文件是…

[Shell编程学习路线]——编制第一个shell脚本入门篇

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f6e0;️Shell编程专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月12日10点23分 &#x1f004;️文章质量&#xff1a;93分 目录 ——前言—— &#x1f4a5;常用的几种shell Bash Sh …

ip地址的表示方式有哪几种

在当今数字化、网络化的时代&#xff0c;IP地址已成为我们生活中不可或缺的一部分。无论是浏览网页、在线购物&#xff0c;还是远程办公、视频会议&#xff0c;IP地址都在背后默默发挥着作用。IP地址是互联网协议地址的简称&#xff0c;它为每一个连接到互联网的设备提供了一个…

antdv 下拉框增加全选功能

由于select下拉框中内容过多&#xff0c;使用下拉框多选需要一个一个选取太过于麻烦&#xff0c;所以在下拉中增加全选和取消全选操作。 看官方文档发现&#xff0c;dropdownRender 可以自定义下拉框内容&#xff0c;可以满足我们的需要。 代码实现 <a-select mode"…

5款非常好用的小众软件,你值得拥有

​ 今天为大家推荐五款不常见但好用的win10软件&#xff0c;它们都有着各自的特色和优势&#xff0c;相信你会喜欢的。 1. 文件夹查看——Folder Size View ​ Folder Size View是一款高效的文件夹大小查看工具&#xff0c;它能够快速扫描并展示文件夹及其子文件夹的占用空间…

力扣42 接雨水

听说字节每人都会接雨水&#xff0c;我也要会哈哈哈 数据结构&#xff1a;数组 算法&#xff1a;核心是计算这一列接到多少雨水&#xff0c;它取决于它左边的最大值和右边的最大值&#xff0c;如下图第三根柱子能接到的雨水应该是第一根柱子高度和第五根柱子高度的最小值减去第…

光学知识 | 什么是超透镜,其工作原理是什么?

在复杂的成像和照明设备中&#xff0c;超透镜&#xff08;以及更普遍的超表面&#xff09;被越来越多地视为一种切实可行的解决方案&#xff0c;以用于提高系统性能&#xff0c;同时缩小系统尺寸并减轻重量。这是因为通常单个超透镜即可达到原本需要在设备中使用多个“传统”光…