第 14 章:服务代理

本章系统梳理了 Cloud Foundry 服务代理的原理、服务实例的创建与绑定流程,以及如何基于 Spring Cloud Service Broker 实现自定义服务代理,帮助开发者扩展平台能力,实现云原生服务的自动化集成。

服务代理与后台服务的云原生模式

在云原生平台中,后台服务(backing service)如数据库、消息队列、对象存储等,通常通过服务代理(service broker)实现自动化的服务实例创建、绑定和生命周期管理。Cloud Foundry 通过 VCAP_SERVICES 环境变量向应用注入服务连接信息,实现应用与服务的解耦,便于环境迁移和弹性扩展。

服务代理本质上是一个实现了标准 REST API 的应用,负责与平台交互,动态调配和管理服务实例。平台通过服务代理统一管理服务目录、实例创建、绑定、解绑和销毁等操作。

服务实例的创建与绑定流程

Cloud Foundry 服务市场(marketplace)提供统一的服务目录,用户可通过 cf create-service 命令创建服务实例,并通过 cf bind-service 绑定到应用。绑定后,服务代理将连接信息注入到应用的环境变量中,应用无需关心服务的具体实现细节。

说明路由方法
读取服务目录/v2/catalogGET
创建服务实例/v2/service_instances/{instanceId}PUT
删除服务实例/v2/service_instances/{instanceId}DELETE
更新服务实例/v2/service_instances/{instanceId}PATCH
创建服务实例绑定/v2/service_instances/{instanceId}/service_bindings/{bindingId}PUT
删除服务实例绑定/v2/service_instances/{instanceId}/service_bindings/{bindingId}DELETE
查询服务实例/v2/service_instances/{instanceId}GET
查询最后操作状态/v2/service_instances/{instanceId}/last_operationGET
表 1: Cloud Foundry 服务代理 REST API 端点

用户定义服务与服务代理的区别

  • 用户定义服务:适合连接传统资源或外部 REST API,由运维手动创建,适合单租户或特殊场景。
  • 服务代理:适合多租户和自动化场景,支持服务实例的自动创建、销毁和多租户隔离,平台通过 REST API 与代理通信。

Spring Cloud Service Broker 实现自定义服务代理

Spring Cloud Cloud Foundry Service Broker 项目极大简化了服务代理的开发。开发者只需实现 Catalog、ServiceInstanceService、ServiceInstanceBindingService 三个核心组件,即可快速构建符合 Open Service Broker API 的服务代理。

目录定义(Catalog)

Catalog 描述服务代理可提供的服务及套餐(plan),如 S3 存储桶、数据库等。每个服务和套餐需有全局唯一 ID。

@Configuration
class CatalogConfiguration {
    @Bean
    Catalog catalog() {
        Plan basic = new Plan("plan-id", "basic", "Basic plan", ...);
        ServiceDefinition definition = new ServiceDefinition("service-id", "s3-service-broker", "Provides AWS S3 access", true, Arrays.asList(basic));
        return new Catalog(Collections.singletonList(definition));
    }
}

服务实例管理(ServiceInstanceService)

负责服务实例的创建、更新、删除等生命周期管理。可结合数据库持久化实例信息,并与第三方 API(如 AWS S3)集成。

@Service
class DefaultServiceInstanceService implements ServiceInstanceService {
    @Override
    public CreateServiceInstanceResponse createServiceInstance(CreateServiceInstanceRequest request) {
        // 创建 S3 存储桶、IAM 用户等
        // 持久化实例信息
        return new CreateServiceInstanceResponse();
    }
    // ...实现其他方法
}

服务绑定管理(ServiceInstanceBindingService)

负责服务实例与应用的绑定与解绑,返回应用所需的连接凭证(如 bucket、accessKeyId、secretKey)。

@Service
class DefaultServiceInstanceBindingService implements ServiceInstanceBindingService {
    @Override
    public CreateServiceInstanceBindingResponse createServiceInstanceBinding(CreateServiceInstanceBindingRequest request) {
        Map<String, Object> credentials = new HashMap<>();
        credentials.put("bucket", ...);
        credentials.put("accessKeyId", ...);
        credentials.put("accessKeySecret", ...);
        return new CreateServiceInstanceAppBindingResponse().withCredentials(credentials);
    }
    // ...实现解绑逻辑
}

服务代理的安全与部署

服务代理需通过 HTTP Basic 认证保护,Cloud Controller 通过认证信息与代理通信。建议通过环境变量或配置文件管理认证信息,避免硬编码。

服务代理可作为普通应用部署到 Cloud Foundry,也可通过 BOSH 进行更复杂的分布式部署。部署前需确保依赖的数据库、外部服务等已配置好,并在 manifest.yml 中声明相关服务绑定和环境变量。

服务代理注册与市场集成

部署完成后,通过 cf create-service-broker 命令注册服务代理,并可通过 cf marketplace 查看服务目录。注册时可指定作用范围(如 –space-scoped),控制服务的可见性。

cf create-service-broker s3-broker admin admin http://s3-service-broker.cfapps.io --space-scoped

客户端应用消费服务实例

应用通过绑定服务实例,自动获取连接信息(如 S3 bucket、accessKeyId、secretKey),可结合 Spring Boot 自动配置实现无缝集成。例如:

@Configuration
@EnableConfigurationProperties(AmazonProperties.class)
public class S3AutoConfiguration {
    @Bean
    public AmazonS3 amazonS3(AmazonProperties awsProps) {
        // 使用凭证创建 AmazonS3 客户端
    }
}

应用只需将自动配置和相关依赖加入类路径,并配置好环境变量,即可直接使用服务。

典型服务代理开发与消费流程

  1. 实现服务代理(Catalog、ServiceInstanceService、ServiceInstanceBindingService)
  2. 部署服务代理到 Cloud Foundry
  3. 注册服务代理,集成到服务市场
  4. 创建服务实例并绑定到应用
  5. 应用自动获取服务凭证,集成业务逻辑

总结

本章系统梳理了 Cloud Foundry 服务代理的原理、服务实例创建与绑定流程,以及基于 Spring Cloud Service Broker 实现自定义服务代理的关键实践。通过服务代理,平台可实现服务的自动化调配与多租户隔离,开发者可专注于业务创新,提升云原生系统的可扩展性与一致性。Open Service Broker API 已成为多云服务集成的行业标准,值得深入学习与实践。

文章导航

独立页面

这是书籍中的独立页面。

书籍首页

评论区