当前位置: 首页 > article >正文

微服务设计模式 - 大使模式(Ambassador Pattern)

微服务设计模式 - 大使模式(Ambassador Pattern)

  • 微服务设计模式 - 大使模式(Ambassador Pattern)
    • 定义
    • 结构
    • 工作过程
    • 优点
    • 使用场景
    • 示例代码
    • 总结

ambassador-in-microservice

定义

Ambassador Pattern 是一种常见的微服务设计模式,通常用于在微服务架构中代理和处理外部服务调用。通过使用 Ambassador Pattern,可以在调用外部服务时添加额外的逻辑,例如监控、日志记录、安全检查等。这种模式类似于一个中介(Ambassador),在真正的服务调用之前处理所有的预处理任务。

结构

  1. 客户端(Client): 发起请求的实体,可以是用户、应用程序或另一个服务。

  2. 大使(Ambassador): 代理实体,接收来自客户端的请求,对请求进行预处理,然后再转发给远程服务。

  3. 远程服务(Remote Service): 实际处理请求并返回响应的外部服务。

工作过程

客户端 (Client)
  |
  | 发出请求
  v
大使 (Ambassador)
  | - 预处理请求(如日志记录、认证、安全检查等)
  | - 转发请求至远程服务
  v
远程服务 (Remote Service)
  | - 接收请求并处理
  | - 返回响应
  v
大使 (Ambassador)
  | - 后处理响应(如日志记录、监控等)
  | - 返回响应至客户端
  v
客户端 (Client)
  1. 客户端向大使发出请求
  2. 大使接收到请求,执行以下操作:
    • 日志记录请求信息。
    • 进行安全检查或身份验证。
    • 将请求转发给远程服务。
  3. 远程服务处理请求并返回响应
  4. 大使接收到远程服务的响应,执行以下操作:
    • 日志记录响应信息。
    • 执行监控操作。
    • 将响应返回给客户端。

ambassador-seq

上面是关于 Ambassador Pattern 的序列图,它展示了客户端、Ambassador 和远程服务之间的交互过程。

优点

通过使用 Ambassador Pattern,可以获得以下优点:

  1. 增强安全性:可以在调用外部服务之前进行安全检查、身份验证等操作。

  2. 监控和日志记录:能够记录每一次外部服务的调用,便于监控和分析。

  3. 重试机制:在外部服务调用失败时,可以在 Ambassador 中实现重试机制。

  4. 抽象复杂性:将外部服务调用的复杂性抽象到 Ambassador 中,使客户端代码更加简洁。

使用场景

在微服务设计中,Ambassador Pattern 常用于以下场景:

  1. 跨网络的服务调用:当需要跨网络调用外部服务时,可以使用 Ambassador 进行额外的处理。

  2. 服务依赖复杂:当服务间的依赖关系复杂,需要在调用前后添加处理逻辑时。

  3. 需要统一的访问控制:在多服务调用中,需要统一进行访问控制和认证时。

示例代码

在 Spring Boot 中,可以通过创建服务层(Service Layer)来实现 Ambassador Pattern。以下示例代码的 AmbassadorService 就是一个典型的 Ambassador,它在调用远程服务之前和之后进行预处理和后处理。

ambassador-class

ClientController.java

@RestController
public class ClientController {
    private final AmbassadorService ambassadorService;
    
    @Autowired
    public ClientController(AmbassadorService ambassadorService) {
        this.ambassadorService = ambassadorService;
    }
    
    @GetMapping("/fetchData")
    public ResponseEntity<String> fetchData() {
        return ambassadorService.callRemoteService();
    }
}

AmbassadorService.java

@Service
public class AmbassadorService {
    
    private static final Logger logger = LoggerFactory.getLogger(AmbassadorService.class);
    
    @Autowired
    private RestTemplate restTemplate;
    
    public ResponseEntity<String> callRemoteService() {
        logger.info("Calling remote service...");
        
        // 预处理(pre-procoessing)中可以添加日志记录、身份验证等操作
        try {
            String response = restTemplate.getForObject("http://remote-service/myApi/myData", String.class);
            // 后处理(post-processing)中可以添加监控、日志记录等操作
            return new ResponseEntity<>(response, HttpStatus.OK);
        } catch (RestClientException e) {
            logger.error("Error calling remote service", e);
            return new ResponseEntity<>("Service Unavailable", HttpStatus.SERVICE_UNAVAILABLE);
        }
    }
}

RestTemplateConfiguration.java

@Configuration
public class RestTemplateConfiguration {
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

总结

Robert-C-Martin-The-first-value-of-software-behavior-is-urgent-but-not-always

Ambassador Pattern 是一种强大的设计模式,可以在微服务架构中处理外部服务调用的复杂性。它不仅可以增加安全性,还能进行监控和日志记录,并对外部服务调用进行重试和统一管理。在 Spring Boot 中,通过创建服务层,可以轻松实现 Ambassador Pattern,从而简化客户端代码的复杂性,并提高整个系统的可靠性和可维护性,适用于各种复杂的微服务架构。

希望这篇技术博客能够帮助你更好地理解大使模式及其在云计算和微服务领域的应用。如果你对大使模式还有其他问题或者想要进一步探讨相关技术,欢迎留言交流。


http://www.kler.cn/a/374860.html

相关文章:

  • 期货跟单、量化交易模拟演示系统
  • 后端开发中的分层思想,DAO、Service、Controller、Mapper,VO、DTO、DO、PO每层的作用及调用关系
  • ApplicationListener<ContextRefreshedEvent> 的使用和作用
  • LC:贪心题解
  • SpringBoot调用SOAP接口步骤详解。
  • 基于LORA的一主多从监测系统_主从节点交互
  • 怎么在哔哩哔哩保存完整视频
  • git入门教程3:安装配置
  • 西瓜书《机器学习》符号表KaTex表示
  • 012:ArcGIS Server 10.2安装与站点创建教程
  • 奇瑞汽车:降阶模型在新能源汽车热管理仿真上的应用
  • (二十四)、在 k8s 中部署自己的 jar 镜像(以 springcloud web 项目为例)
  • kafka如何获取 topic 主题的列表?
  • Python Pendulum库:优雅的时间处理利器
  • uniapp使用websocket
  • Tomcat所需端口及作用
  • class 041 最大公约数、同余原理
  • Threejs渲染3D字体介绍
  • 46-RK3588 quick start for camera
  • Flask轻松上手:从零开始搭建属于你的Web应用
  • .eslintrc.js 的解释
  • SpringBoot的自动配置是如何实现的?
  • Rust: 加密算法库 ring 如何用于 RSA 数字签名?
  • el-dialog支持全局拖拽功能
  • STM32 从0开始系统学习3 启动流程
  • redis为什么快