0

0

微服务系统中服务之间的通信方式

WBOY

WBOY

发布时间:2024-08-17 16:50:26

|

1221人浏览过

|

来源于dev.to

转载

1. 同步通讯

同步通信涉及实时交互,其中一个服务向另一个服务发送请求并暂停其操作,直到收到响应。 rest api 和 grpc 是用于促进此类通信的常用协议。

微服务系统中服务之间的通信方式

1.1 rest api

restful api(表述性状态传输)是微服务系统中服务相互通信最常用的方法之一。 rest 利用 http/https 和 json 或 xml 格式进行数据交换。

通常,服务通过直接调用另一个服务的 api 来相互交互。

请求和响应示例:

get /users/12345 http/1.1
host: api.userservice.com
accept: application/json
authorization: bearer your-access-token

{
  "userid": "12345",
  "name": "michel j",
  "email": "mj@example.com",
  "address": "mountain view, santa clara, california"
}

源代码示例

import org.springframework.web.client.resttemplate;
import org.springframework.http.responseentity;

public class orderservice {

    private final resttemplate resttemplate = new resttemplate();
    private final string userserviceurl = "https://api.userservice.com/users/";

    public user getuserbyid(string userid) {
        string url = userserviceurl + userid;
        responseentity response = resttemplate.getforentity(url, user.class);
        return response.getbody();
    }
}

优点:

易于部署并与各种语言和工具集成。

能够轻松使用测试和监控工具。

缺点:

由于其同步性质,对于高速要求可能效率不高。

在处理网络错误或断开连接时可能会遇到困难。

1.2 通用rpc

grpc,全称google remote procedure call,是一个高性能、开源的通用rpc框架。它利用 http/2 进行高效的数据传输,并且通常依赖于协议缓冲区(一种语言中立、平台中立、可扩展的机制,用于序列化结构化数据)来定义发送和接收的数据的结构。

示例,协议缓冲区的定义

syntax = "proto3";

package userservice;

// define message user
message user {
    string userid = 1;
    string name = 2;
    string email = 3;
    string address = 4;
}

// define service userservice
service userservice {
    rpc getuserbyid (useridrequest) returns (user);
}

// define message useridrequest
message useridrequest {
    string userid = 1;
}

对于用户管理服务,您应该实现一个遵循 .proto 文件中提供的服务定义的 grpc 服务器。这包括创建必要的服务器端逻辑来处理传入的 grpc 请求并生成适当的响应。

HTShop网上购物系统
HTShop网上购物系统

HTShop网上购物系统由恒天网络科技有限公司根据国际先进技术和国内商务特点自主版权开发的一款具有强大功能的B2C电子商务网上购物平台。HTShop以国际上通用流行的B/S(浏览器/服务器)模式进行设计,采用微软公司的ASP.NET(C#)技术构建而成。 2007-11-10 HTShop CS 通用标准版 v1.1.11.10 更新内容自由更换模版功能开放 修改了购买多款商品,会员中心订单只显示

下载
import io.grpc.stub.StreamObserver;
import userservice.User;
import userservice.UserIdRequest;
import userservice.UserServiceGrpc;

public class UserServiceImpl extends UserServiceGrpc.UserServiceImplBase {

    @Override
    public void getUserById(UserIdRequest request, StreamObserver responseObserver) {
        // Assuming you have a database to retrieve user information.
        User user = User.newBuilder()
                .setUserId(request.getUserId())
                .setName("Michel J")
                .setEmail("MJ@example.com")
                .setAddress("Mountain View, Santa Clara, California")
                .build();

        responseObserver.onNext(user);
        responseObserver.onCompleted();
    }
}

import io.grpc.Server;
import io.grpc.ServerBuilder;

public class UserServer {
    public static void main(String[] args) throws Exception {
        Server server = ServerBuilder.forPort(9090)
                .addService(new UserServiceImpl())
                .build()
                .start();

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

优点:

由于使用 http/2 和 protocol buffers,因此具有高性能和带宽效率。

支持多种编程语言,具有良好的扩展性。

缺点:

如果服务不支持 grpc,则需要翻译层。

部署和管理可能更加复杂。

2. 异步通信

异步通信是指一个服务向另一个服务发送请求,而不阻塞自己的操作以等待回复的过程。这通常是通过消息队列或发布/订阅系统来实现的。

微服务系统中服务之间的通信方式

1.消息队列

消息队列系统,如 rabbitmq 和 apache activemq,促进服务之间的异步通信。

优点:

高可扩展性和容错能力:系统可以更好地处理增加的工作负载,并且不易出现故障。

减少服务负载:通过解耦请求发送和接收,主要服务可以专注于处理任务,而不会被不断的请求淹没。

缺点:

可能需要额外的精力来管理和维护:基于队列的系统可能更复杂,并且需要更多的资源来操作。

处理排序和确保消息传递的困难:确保以正确的顺序处理请求并且不丢失消息可能是一项技术挑战。

2.2.发布/订阅系统

pub/sub(发布/订阅)系统,例如 apache kafka 或 google pub/sub,允许服务发布消息和订阅主题。

优点:

支持大规模和高吞吐量的数据流。

减少服务之间的依赖关系。

缺点:

需要更复杂的层来管理和监控主题和消息。

处理消息的排序和可靠性问题可能具有挑战性。”

如果有兴趣,可以阅读我之前关于 pub/sub 主题的文章。

消息代理中的死信队列第 1 部分

消息代理中的死信队列第 2 部分

消息代理系统内的一致性和可靠性问题

3. 事件驱动的沟通

事件驱动的通信是指一个服务发出事件并且其他服务根据这些事件做出响应或采取操作。

3.1.同步事件

当一个服务发出事件并等待其他服务的响应时,就会发生同步事件。

优点:

易于控制和监控事件处理过程。

缺点:

如果响应服务缓慢或遇到错误,可能会导致瓶颈

3.2.异步事件

当服务发出事件并且不需要等待立即响应时,就会发生异步事件。

优点:

减少等待时间并提高可扩展性。

帮助服务更独立地运行并减少相互依赖。

缺点:

需要额外的机制来确保事件得到正确和及时的处理。

难以确保顺序和处理重复事件。

4. 结论

微服务系统中服务之间通信方式的选择取决于性能需求、可靠性、系统复杂度等因素。每种方法都有自己的优点和缺点,了解这些方法将帮助您构建更高效、更灵活的微服务系统。仔细考虑您系统的要求,选择最合适的通信方式。

相关专题

更多
rabbitmq和kafka有什么区别
rabbitmq和kafka有什么区别

rabbitmq和kafka的区别:1、语言与平台;2、消息传递模型;3、可靠性;4、性能与吞吐量;5、集群与负载均衡;6、消费模型;7、用途与场景;8、社区与生态系统;9、监控与管理;10、其他特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

200

2024.02.23

PHP API接口开发与RESTful实践
PHP API接口开发与RESTful实践

本专题聚焦 PHP在API接口开发中的应用,系统讲解 RESTful 架构设计原则、路由处理、请求参数解析、JSON数据返回、身份验证(Token/JWT)、跨域处理以及接口调试与异常处理。通过实战案例(如用户管理系统、商品信息接口服务),帮助开发者掌握 PHP构建高效、可维护的RESTful API服务能力。

146

2025.11.26

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

411

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

532

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

kafka消费者组有什么作用
kafka消费者组有什么作用

kafka消费者组的作用:1、负载均衡;2、容错性;3、广播模式;4、灵活性;5、自动故障转移和领导者选举;6、动态扩展性;7、顺序保证;8、数据压缩;9、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

167

2024.01.12

kafka消费组的作用是什么
kafka消费组的作用是什么

kafka消费组的作用:1、负载均衡;2、容错性;3、灵活性;4、高可用性;5、扩展性;6、顺序保证;7、数据压缩;8、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

149

2024.02.23

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

10

2026.01.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RunnerGo从入门到精通
RunnerGo从入门到精通

共22课时 | 1.7万人学习

尚学堂Mahout视频教程
尚学堂Mahout视频教程

共18课时 | 3.2万人学习

Linux优化视频教程
Linux优化视频教程

共14课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号