第 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/catalog | GET |
创建服务实例 | /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_operation | GET |
用户定义服务与服务代理的区别
- 用户定义服务:适合连接传统资源或外部 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 客户端
}
}
应用只需将自动配置和相关依赖加入类路径,并配置好环境变量,即可直接使用服务。
典型服务代理开发与消费流程
- 实现服务代理(Catalog、ServiceInstanceService、ServiceInstanceBindingService)
- 部署服务代理到 Cloud Foundry
- 注册服务代理,集成到服务市场
- 创建服务实例并绑定到应用
- 应用自动获取服务凭证,集成业务逻辑
总结
本章系统梳理了 Cloud Foundry 服务代理的原理、服务实例创建与绑定流程,以及基于 Spring Cloud Service Broker 实现自定义服务代理的关键实践。通过服务代理,平台可实现服务的自动化调配与多租户隔离,开发者可专注于业务创新,提升云原生系统的可扩展性与一致性。Open Service Broker API 已成为多云服务集成的行业标准,值得深入学习与实践。