ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【架构之路】微服务中常用的几种通讯方式 [打印本页]

作者: 忿忿的泥巴坨    时间: 2024-7-11 07:58
标题: 【架构之路】微服务中常用的几种通讯方式
2024年,盘算机相干专业还值得选择吗?


强烈推荐

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

引言

微服务架构由于其灵活性、高可扩展性和易维护性,已成为构建复杂系统的主流选择。
微服务架构将系统拆分为多个独立的服务,每个服务负责特定的功能,并通过各种通讯方式进行协作。
这些通讯方式在确保系统高效、可靠运行的过程中起着至关重要的作用。
本文将先容几种常见的微服务通讯方式,包括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:
  1. @RestController
  2. @RequestMapping("/users")
  3. public class UserController {
  4.     @GetMapping("/{id}")
  5.     public ResponseEntity<User> getUserById(@PathVariable String id) {
  6.         // 假设从数据库获取用户信息
  7.         User user = userService.findUserById(id);
  8.         return ResponseEntity.ok(user);
  9.     }
  10. }
复制代码
Order Service:
  1. @Service
  2. public class UserServiceClient {
  3.     private final RestTemplate restTemplate;
  4.     @Autowired
  5.     public UserServiceClient(RestTemplate restTemplate) {
  6.         this.restTemplate = restTemplate;
  7.     }
  8.     public User getUserById(String userId) {
  9.         String url = "http://USER-SERVICE/users/" + userId;
  10.         return restTemplate.getForObject(url, User.class);
  11.     }
  12. }
复制代码
设置RestTemplate:
  1. @Configuration
  2. public class RestTemplateConfig {
  3.     @Bean
  4.     public RestTemplate restTemplate() {
  5.         return new RestTemplate();
  6.     }
  7. }
复制代码
2. gRPC

gRPC是Google开源的一个高性能、通用的RPC框架,利用Protocol Buffers作为接口界说语言,并支持多种编程语言。
示例:
假设有两个微服务,一个用于用户管理(User Service),另一个用于订单管理(Order Service)。Order Service需要从User Service获取用户信息。
User Service:
1.界说.proto文件:
  1. syntax = "proto3";
  2. option java_package = "com.example.userservice";
  3. option java_outer_classname = "UserServiceProto";
  4. service UserService {
  5.     rpc GetUser (UserRequest) returns (UserResponse) {}
  6. }
  7. message UserRequest {
  8.     string id = 1;
  9. }
  10. message UserResponse {
  11.     string id = 1;
  12.     string name = 2;
  13.     string email = 3;
  14. }
复制代码
2.实现服务端:
  1. public class UserServiceImpl extends UserServiceGrpc.UserServiceImplBase {
  2.     @Override
  3.     public void getUser(UserRequest request, StreamObserver<UserResponse> responseObserver) {
  4.         // 假设从数据库获取用户信息
  5.         UserResponse response = UserResponse.newBuilder()
  6.                 .setId(request.getId())
  7.                 .setName("John Doe")
  8.                 .setEmail("john.doe@example.com")
  9.                 .build();
  10.         responseObserver.onNext(response);
  11.         responseObserver.onCompleted();
  12.     }
  13. }
复制代码
3.设置并启动gRPC服务器:
  1. public class GrpcServer {
  2.     public static void main(String[] args) throws IOException, InterruptedException {
  3.         Server server = ServerBuilder.forPort(8080)
  4.                 .addService(new UserServiceImpl())
  5.                 .build();
  6.         server.start();
  7.         System.out.println("Server started on port 8080");
  8.         server.awaitTermination();
  9.     }
  10. }
复制代码
Order Service:
1.创建gRPC客户端:
  1. public class UserServiceClient {
  2.     private final UserServiceGrpc.UserServiceBlockingStub userServiceStub;
  3.     public UserServiceClient() {
  4.         ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8080)
  5.                 .usePlaintext()
  6.                 .build();
  7.         userServiceStub = UserServiceGrpc.newBlockingStub(channel);
  8.     }
  9.     public UserResponse getUserById(String userId) {
  10.         UserRequest request = UserRequest.newBuilder().setId(userId).build();
  11.         return userServiceStub.getUser(request);
  12.     }
  13. }
复制代码
3. 消息队列

消息队列是一种异步通讯方式,常用的消息队列系统有RabbitMQ、Apache Kafka等。消息队列可以解耦生产者和消费者,实现异步处理。
示例:
假设有两个微服务,一个用于订单管理(Order Service),另一个用于关照服务(Notification Service)。订单服务在订单创建后发送消息到消息队列,关照服务吸收并处理消息。
Order Service:
  1. @Service
  2. public class OrderService {
  3.     private final RabbitTemplate rabbitTemplate;
  4.     @Autowired
  5.     public OrderService(RabbitTemplate rabbitTemplate) {
  6.         this.rabbitTemplate = rabbitTemplate;
  7.     }
  8.     public void createOrder(Order order) {
  9.         // 创建订单逻辑
  10.         rabbitTemplate.convertAndSend("order.exchange", "order.created", order);
  11.     }
  12. }
复制代码
Notification Service:
  1. @Service
  2. public class NotificationService {
  3.     @RabbitListener(queues = "order.queue")
  4.     public void handleOrderCreated(Order order) {
  5.         // 处理订单创建通知
  6.         System.out.println("Received order: " + order);
  7.     }
  8. }
复制代码
设置RabbitMQ:
  1. @Configuration
  2. public class RabbitMQConfig {
  3.     @Bean
  4.     public Queue queue() {
  5.         return new Queue("order.queue");
  6.     }
  7.     @Bean
  8.     public TopicExchange exchange() {
  9.         return new TopicExchange("order.exchange");
  10.     }
  11.     @Bean
  12.     public Binding binding(Queue queue, TopicExchange exchange) {
  13.         return BindingBuilder.bind(queue).to(exchange).with("order.created");
  14.     }
  15. }
复制代码
4. WebSocket

WebSocket是一种双向通讯协议,适用于需要实时通讯的场景。
示例:
假设有一个谈天应用,两个微服务分别处理用户和谈天信息。
Chat Service:
  1. @Configuration
  2. @EnableWebSocket
  3. public class WebSocketConfig implements WebSocketConfigurer {
  4.     @Override
  5.     public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
  6.         registry.addHandler(new ChatWebSocketHandler(), "/chat");
  7.     }
  8. }
  9. @Component
  10. public class ChatWebSocketHandler extends TextWebSocketHandler {
  11.     @Override
  12.     public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
  13.         // 处理收到的消息
  14.         session.sendMessage(new TextMessage("Received: " + message.getPayload()));
  15.     }
  16. }
复制代码

应用场景

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

应用场景:

示例场景:

2. gRPC

应用场景:

示例场景:

3. 消息队列

应用场景:

示例场景:

4. WebSocket

应用场景:

示例场景:

场景应用总结


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

总结

微服务通讯方式的选择在很大程度上影响系统的性能、可靠性和扩展性。
通过了解和掌握HTTP REST、gRPC、消息队列和WebSocket等不同通讯方式的特点和应用场景,开发者可以根据具体业务需求选择最合适的通讯方式,从而构建出高效、灵活和可扩展的微服务系统。
在现实应用中,大概需要结合多种通讯方式,以发挥各自的优势,满意系统的不同需求。

强烈推荐

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


专栏集锦

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

写在最后

感谢您的支持和鼓励!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4