3. 广告服务
服务代理目录提供了一组元数据,用于描述可用的服务及其属性,例如成本和功能。该目录通过服务代理的/v2/catalog端点向平台的服务市场提供。
服务代理可以提供一个类型为 Catalog 的 Spring Bean,或者实现服务 CatalogService。
3.1. 提供一个Catalog Bean
你可以在Spring 0类中执行此操作,如下所示:
package com.example.servicebroker;
@Configuration
public class ExampleCatalogConfiguration {
@Bean
public Catalog catalog() {
Plan plan = Plan.builder()
.id("simple-plan")
.name("standard")
.description("A simple plan")
.free(true)
.build();
ServiceDefinition serviceDefinition = ServiceDefinition.builder()
.id("example-service")
.name("example")
.description("A simple example")
.bindable(true)
.tags("example", "tags")
.plans(plan)
.build();
return Catalog.builder()
.serviceDefinitions(serviceDefinition)
.build();
}
}
3.2.提供属性文件中的目录
您可以在 Java 属性文件或 YAML 文件中使用 Spring Boot 外部化配置来配置目录。
在自动配置期间,将解析目录并将其作为 Catalog bean 可用。
此 YAML 文件配置了一个目录:
# Example Spring Boot YAML configuration
spring:
cloud:
openservicebroker:
catalog:
services:
- id: example-service
name: example
description: A simple example
bindable: true
tags:
- example
- tags
plans:
- id: simple-plan
name: standard
description: A simple plan
以下属性文件配置了目录:
# Example Spring Boot properties configuration
spring.cloud.openservicebroker.catalog.services[0].id=example-service
spring.cloud.openservicebroker.catalog.services[0].name=example
spring.cloud.openservicebroker.catalog.services[0].description=A simple example
spring.cloud.openservicebroker.catalog.services[0].bindable=true
spring.cloud.openservicebroker.catalog.services[0].tags[0]=example
spring.cloud.openservicebroker.catalog.services[0].tags[1]=tags
spring.cloud.openservicebroker.catalog.services[0].plans[0].id=simple-plan
spring.cloud.openservicebroker.catalog.services[0].plans[0].name=standard
spring.cloud.openservicebroker.catalog.services[0].plans[0].description=A simple plan
3.3.实现产品目录服务
服务中介可以实现CatalogService接口,更全面地控制目录。这可能需要一些目录元数据细节从环境或外部数据源读取。
此示例实现接口CatalogService如下所示:
package com.example.servicebroker;
@Service
public class ExampleCatalogService implements CatalogService {
@Override
public Mono<Catalog> getCatalog() {
return getServiceDefinition("example-service")
.map(serviceDefinition -> Catalog.builder()
.serviceDefinitions(serviceDefinition)
.build());
}
@Override
public Mono<ServiceDefinition> getServiceDefinition(String serviceId) {
return Mono.just(ServiceDefinition.builder()
.id(serviceId)
.name("example")
.description("A simple example")
.bindable(true)
.tags("example", "tags")
.plans(getPlan())
.build());
}
@Override
public Mono<ResponseEntity<Catalog>> getResponseEntityCatalog(HttpHeaders httpHeaders) {
// Use this method to handle catalog caching and ETag support.
// The example below is a basic ETag comparison and response.
if ("useful-etag-value".equals(httpHeaders.getIfNoneMatch())) {
return Mono.just(ResponseEntity
.status(304)
.eTag("useful-etag-value")
.build());
}
else {
return getCatalog()
.map(catalog -> ResponseEntity
.status(200)
.eTag("different-etag-value")
.body(catalog));
}
}
private Plan getPlan() {
return Plan.builder()
.id("simple-plan")
.name("standard")
.description("A simple plan")
.free(true)
.build();
}
}