忿忿的泥巴坨 发表于 2024-7-11 07:58:04

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

2024年,盘算机相干专业还值得选择吗?

https://img-blog.csdnimg.cn/img_convert/2e80b53700b103ab0994334f84b98ea8.gif
强烈推荐

前些天发现了一个巨牛的人工智能学习网站,普通易懂,风趣幽默,不由得分享一下给大家。点击跳转到网站:人工智能
https://img-blog.csdnimg.cn/img_convert/45f260f36b9daeb9a565d7b6c350f1e3.jpeg
引言

微服务架构由于其灵活性、高可扩展性和易维护性,已成为构建复杂系统的主流选择。
微服务架构将系统拆分为多个独立的服务,每个服务负责特定的功能,并通过各种通讯方式进行协作。
这些通讯方式在确保系统高效、可靠运行的过程中起着至关重要的作用。
本文将先容几种常见的微服务通讯方式,包括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等不同通讯方式的特点和应用场景,开发者可以根据具体业务需求选择最合适的通讯方式,从而构建出高效、灵活和可扩展的微服务系统。
在现实应用中,大概需要结合多种通讯方式,以发挥各自的优势,满意系统的不同需求。
强烈推荐

前些天发现了一个巨牛的人工智能学习网站,普通易懂,风趣幽默,不由得分享一下给大家。点击跳转到网站:人工智能
https://img-blog.csdnimg.cn/img_convert/15a3a543338dd9c59b33a5804a0390ef.jpeg
专栏集锦

大佬们可以收藏以备不时之需:
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
写在最后

感谢您的支持和鼓励!
页: [1]
查看完整版本: 【架构之路】微服务中常用的几种通讯方式