blob: 09f30dc93da553f44576ad14fe61fef8c8503b00 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.servicecomb.service.center.client;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpStatus;
import org.apache.http.client.utils.URIBuilder;
import org.apache.servicecomb.http.client.auth.RequestAuthHeaderProvider;
import org.apache.servicecomb.http.client.common.HttpConfiguration.SSLProperties;
import org.apache.servicecomb.http.client.common.HttpResponse;
import org.apache.servicecomb.http.client.common.HttpTransport;
import org.apache.servicecomb.http.client.common.HttpTransportFactory;
import org.apache.servicecomb.http.client.common.HttpUtils;
import org.apache.servicecomb.service.center.client.OperationEvents.UnAuthorizedOperationEvent;
import org.apache.servicecomb.service.center.client.exception.OperationException;
import org.apache.servicecomb.service.center.client.model.CreateMicroserviceInstanceRequest;
import org.apache.servicecomb.service.center.client.model.CreateMicroserviceRequest;
import org.apache.servicecomb.service.center.client.model.CreateSchemaRequest;
import org.apache.servicecomb.service.center.client.model.ErrorMessage;
import org.apache.servicecomb.service.center.client.model.FindMicroserviceInstancesResponse;
import org.apache.servicecomb.service.center.client.model.GetSchemaListResponse;
import org.apache.servicecomb.service.center.client.model.GetSchemaResponse;
import org.apache.servicecomb.service.center.client.model.HeartbeatsRequest;
import org.apache.servicecomb.service.center.client.model.Microservice;
import org.apache.servicecomb.service.center.client.model.MicroserviceInstance;
import org.apache.servicecomb.service.center.client.model.MicroserviceInstanceResponse;
import org.apache.servicecomb.service.center.client.model.MicroserviceInstanceStatus;
import org.apache.servicecomb.service.center.client.model.MicroserviceInstancesResponse;
import org.apache.servicecomb.service.center.client.model.MicroserviceResponse;
import org.apache.servicecomb.service.center.client.model.MicroservicesResponse;
import org.apache.servicecomb.service.center.client.model.ModifySchemasRequest;
import org.apache.servicecomb.service.center.client.model.RbacTokenRequest;
import org.apache.servicecomb.service.center.client.model.RbacTokenResponse;
import org.apache.servicecomb.service.center.client.model.RegisteredMicroserviceInstanceResponse;
import org.apache.servicecomb.service.center.client.model.RegisteredMicroserviceResponse;
import org.apache.servicecomb.service.center.client.model.SchemaInfo;
import org.apache.servicecomb.service.center.client.model.UpdatePropertiesRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.eventbus.EventBus;
public class ServiceCenterClient implements ServiceCenterOperation {
private static final Logger LOGGER = LoggerFactory.getLogger(ServiceCenterClient.class);
private final ServiceCenterRawClient httpClient;
private EventBus eventBus;
public ServiceCenterClient(ServiceCenterRawClient httpClient) {
this.httpClient = httpClient;
}
public ServiceCenterClient setEventBus(EventBus eventBus) {
this.eventBus = eventBus;
return this;
}
public ServiceCenterClient(ServiceCenterAddressManager addressManager,
SSLProperties sslProperties,
RequestAuthHeaderProvider requestAuthHeaderProvider,
String tenantName,
Map<String, String> extraGlobalHeaders) {
HttpTransport httpTransport = HttpTransportFactory.createHttpTransport(sslProperties, requestAuthHeaderProvider);
httpTransport.addHeaders(extraGlobalHeaders);
this.httpClient = new ServiceCenterRawClient.Builder()
.setTenantName(tenantName)
.setAddressManager(addressManager)
.setHttpTransport(httpTransport).build();
}
@Override
public MicroserviceInstancesResponse getServiceCenterInstances() {
try {
HttpResponse response = httpClient.getHttpRequest("/registry/health", null, null);
if (response.getStatusCode() == HttpStatus.SC_OK) {
return HttpUtils.deserialize(response.getContent(), MicroserviceInstancesResponse.class);
}
sendUnAuthorizedEvent(response);
throw new OperationException(
"get service-center instances fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
+ "; content = " + response.getContent());
} catch (IOException e) {
throw new OperationException(
"get service-center instances fails", e);
}
}
@Override
public RegisteredMicroserviceResponse registerMicroservice(Microservice microservice) {
try {
CreateMicroserviceRequest request = new CreateMicroserviceRequest();
request.setService(microservice);
HttpResponse response = httpClient
.postHttpRequest("/registry/microservices", null, HttpUtils.serialize(request));
if (response.getStatusCode() == HttpStatus.SC_OK) {
return HttpUtils.deserialize(response.getContent(), RegisteredMicroserviceResponse.class);
}
sendUnAuthorizedEvent(response);
throw new OperationException(
"register service fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
+ "; content = " + response.getContent());
} catch (IOException e) {
throw new OperationException(
"register service fails", e);
}
}
@Override
public MicroservicesResponse getMicroserviceList() {
try {
HttpResponse response = httpClient.getHttpRequest("/registry/microservices", null, null);
if (response.getStatusCode() == HttpStatus.SC_OK) {
return HttpUtils.deserialize(response.getContent(), MicroservicesResponse.class);
}
sendUnAuthorizedEvent(response);
throw new OperationException(
"get service List fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
+ "; content = " + response.getContent());
} catch (IOException e) {
throw new OperationException(
"get service List fails", e);
}
}
@Override
public RegisteredMicroserviceResponse queryServiceId(Microservice microservice) {
try {
URIBuilder uriBuilder = new URIBuilder("/registry/existence");
uriBuilder.setParameter("type", "microservice");
uriBuilder.setParameter("appId", microservice.getAppId());
uriBuilder.setParameter("serviceName", microservice.getServiceName());
uriBuilder.setParameter("version", microservice.getVersion());
uriBuilder.setParameter("env", microservice.getEnvironment());
HttpResponse response = httpClient.getHttpRequest(uriBuilder.build().toString(), null, null);
if (response.getStatusCode() == HttpStatus.SC_OK) {
return HttpUtils.deserialize(response.getContent(), RegisteredMicroserviceResponse.class);
}
sendUnAuthorizedEvent(response);
LOGGER.info("Query serviceId fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
+ "; content = " + response.getContent());
return null;
} catch (IOException e) {
throw new OperationException(
"query serviceId fails", e);
} catch (URISyntaxException e) {
throw new OperationException(
"build url failed.", e);
}
}
@Override
public Microservice getMicroserviceByServiceId(String serviceId) {
try {
HttpResponse response = httpClient.getHttpRequest("/registry/microservices/" + serviceId, null, null);
if (response.getStatusCode() == HttpStatus.SC_OK) {
MicroserviceResponse microserviceResponse = HttpUtils
.deserialize(response.getContent(), MicroserviceResponse.class);
return microserviceResponse.getService();
}
sendUnAuthorizedEvent(response);
throw new OperationException(
"get service message fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
+ "; content = " + response.getContent());
} catch (IOException e) {
throw new OperationException(
"get service message fails", e);
}
}
@Override
public RegisteredMicroserviceInstanceResponse registerMicroserviceInstance(MicroserviceInstance instance) {
try {
CreateMicroserviceInstanceRequest request = new CreateMicroserviceInstanceRequest();
request.setInstance(instance);
HttpResponse response = httpClient
.postHttpRequest("/registry/microservices/" + instance.getServiceId() + "/instances", null,
HttpUtils.serialize(request));
if (response.getStatusCode() == HttpStatus.SC_OK) {
return HttpUtils.deserialize(response.getContent(), RegisteredMicroserviceInstanceResponse.class);
}
sendUnAuthorizedEvent(response);
throw new OperationException(
"register service instance fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
+ "; content = " + response.getContent());
} catch (IOException e) {
throw new OperationException(
"register service instance fails", e);
}
}
@Override
public FindMicroserviceInstancesResponse findMicroserviceInstance(String consumerId, String appId, String serviceName,
String versionRule,
String revision) {
try {
Map<String, String> headers = new HashMap<>();
headers.put("X-ConsumerId", consumerId);
HttpResponse response = httpClient
.getHttpRequest("/registry/instances?appId=" + URLEncoder.encode(appId, "UTF-8")
+ "&serviceName=" + HttpUtils.encodeURLParam(serviceName)
+ "&version=" + HttpUtils.encodeURLParam(versionRule)
+ "&rev=" + HttpUtils.encodeURLParam(revision)
, headers, null);
FindMicroserviceInstancesResponse result = new FindMicroserviceInstancesResponse();
if (response.getStatusCode() == HttpStatus.SC_OK) {
result.setModified(true);
result.setRevision(response.getHeader("X-Resource-Revision"));
result.setMicroserviceInstancesResponse(
HttpUtils.deserialize(response.getContent(), MicroserviceInstancesResponse.class));
return result;
}
if (response.getStatusCode() == HttpStatus.SC_NOT_MODIFIED) {
result.setModified(false);
return result;
}
sendUnAuthorizedEvent(response);
throw new OperationException(
"get service instances list fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
+ "; content = " + response.getContent());
} catch (IOException e) {
throw new OperationException(
"get service instances list fails", e);
}
}
@Override
public MicroserviceInstancesResponse getMicroserviceInstanceList(String serviceId) {
try {
HttpResponse response = httpClient
.getHttpRequest("/registry/microservices/" + serviceId + "/instances", null, null);
if (response.getStatusCode() == HttpStatus.SC_OK) {
return HttpUtils.deserialize(response.getContent(), MicroserviceInstancesResponse.class);
}
sendUnAuthorizedEvent(response);
throw new OperationException(
"get service instances list fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
+ "; content = " + response.getContent());
} catch (IOException e) {
throw new OperationException(
"get service instances list fails", e);
}
}
@Override
public MicroserviceInstance getMicroserviceInstance(String serviceId, String instanceId) {
try {
HttpResponse response = httpClient
.getHttpRequest("/registry/microservices/" + serviceId + "/instances/" + instanceId, null, null);
if (response.getStatusCode() == HttpStatus.SC_OK) {
MicroserviceInstanceResponse instanceResponse = HttpUtils
.deserialize(response.getContent(), MicroserviceInstanceResponse.class);
return instanceResponse.getInstance();
}
sendUnAuthorizedEvent(response);
throw new OperationException(
"get service instance message fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
+ "; content = " + response.getContent());
} catch (IOException e) {
throw new OperationException(
"get service instance message fails", e);
}
}
@Override
public void deleteMicroserviceInstance(String serviceId, String instanceId) {
try {
HttpResponse response = httpClient
.deleteHttpRequest("/registry/microservices/" + serviceId + "/instances/" + instanceId, null, null);
if (response.getStatusCode() == HttpStatus.SC_OK) {
LOGGER.info("Delete service instance successfully.");
return;
}
sendUnAuthorizedEvent(response);
throw new OperationException(
"delete service instance fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
+ "; content = " + response.getContent());
} catch (IOException e) {
throw new OperationException(
"delete service instance fails", e);
}
}
@Override
public boolean updateMicroserviceInstanceStatus(String serviceId, String instanceId,
MicroserviceInstanceStatus status) {
try {
HttpResponse response = httpClient.putHttpRequest(
"/registry/microservices/" + serviceId + "/instances/" + instanceId + "/status?value=" + status, null, null);
if (response.getStatusCode() == HttpStatus.SC_OK) {
return true;
}
sendUnAuthorizedEvent(response);
throw new OperationException(
"update service instance status fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
+ "; content = " + response.getContent());
} catch (IOException e) {
throw new OperationException(
"update service instance status fails", e);
}
}
@Override
public void sendHeartBeats(HeartbeatsRequest heartbeatsRequest) {
try {
HttpResponse response = httpClient
.putHttpRequest("/registry/heartbeats", null, HttpUtils.serialize(heartbeatsRequest));
if (response.getStatusCode() == HttpStatus.SC_OK) {
return;
}
sendUnAuthorizedEvent(response);
throw new OperationException(
"heartbeats fails, statusCode = " + response.getStatusCode() + "; message = " + response.getMessage()
+ "; content = " + response.getContent());
} catch (IOException e) {
throw new OperationException(
"heartbeats fails ", e);
}
}
@Override
public boolean sendHeartBeat(String serviceId, String instanceId) {
try {
HttpResponse response = httpClient
.putHttpRequest("/registry/microservices/" + serviceId + "/instances/" + instanceId + "/heartbeat",
null, null);
if (response.getStatusCode() == HttpStatus.SC_OK) {
return true;
}
sendUnAuthorizedEvent(response);
throw new OperationException(
"heartbeats fails, statusCode = " + response.getStatusCode() + "; message = " + response.getMessage()
+ "; content = " + response.getContent());
} catch (IOException e) {
throw new OperationException(
"heartbeats fails ", e);
}
}
@Override
public List<SchemaInfo> getServiceSchemasList(String serviceId, boolean withContent) {
String url = "/registry/microservices/" + serviceId + "/schemas";
if (withContent) {
url = url + "?withSchema=1";
}
try {
HttpResponse response = httpClient
.getHttpRequest(url, null, null);
if (response.getStatusCode() == HttpStatus.SC_OK) {
GetSchemaListResponse getSchemaResponse = HttpUtils
.deserialize(response.getContent(), GetSchemaListResponse.class);
return getSchemaResponse.getSchemas();
}
sendUnAuthorizedEvent(response);
throw new OperationException(
"get service schemas list fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
+ "; content = " + response.getContent());
} catch (IOException e) {
throw new OperationException(
"get service schemas list fails", e);
}
}
/**
* Get one schema context of service
*
* @param serviceId
* @param schemaId
* @return
* @throws OperationException
*/
public String getServiceSchemaContext(String serviceId, String schemaId) {
try {
HttpResponse response = httpClient
.getHttpRequest("/registry/microservices/" + serviceId + "/schemas/" + schemaId, null, null);
if (response.getStatusCode() == HttpStatus.SC_OK) {
GetSchemaResponse getSchemaResponse = HttpUtils.deserialize(response.getContent(), GetSchemaResponse.class);
return getSchemaResponse.getSchema();
}
sendUnAuthorizedEvent(response);
throw new OperationException(
"get service schema context fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
+ "; content = " + response.getContent());
} catch (IOException e) {
throw new OperationException(
"get service schemas context fails", e);
}
}
@Override
public boolean registerSchema(String serviceId, String schemaId, CreateSchemaRequest schema) {
try {
HttpResponse response = httpClient
.putHttpRequest("/registry/microservices/" + serviceId + "/schemas/" + schemaId, null,
HttpUtils.serialize(schema));
if (response.getStatusCode() == HttpStatus.SC_OK) {
return true;
}
sendUnAuthorizedEvent(response);
throw new OperationException(
"update service schema fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
+ "; content = " + response.getContent());
} catch (IOException e) {
throw new OperationException(
"update service schema fails", e);
}
}
@Override
public boolean updateServiceSchemaContext(String serviceId, SchemaInfo schemaInfo) {
try {
CreateSchemaRequest request = new CreateSchemaRequest();
request.setSchema(schemaInfo.getSchema());
request.setSummary(schemaInfo.getSummary());
HttpResponse response = httpClient
.putHttpRequest("/registry/microservices/" + serviceId + "/schemas/" + schemaInfo.getSchemaId(), null,
HttpUtils.serialize(request));
if (response.getStatusCode() == HttpStatus.SC_OK) {
return true;
}
sendUnAuthorizedEvent(response);
throw new OperationException(
"update service schema fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
+ "; content = " + response.getContent());
} catch (IOException e) {
throw new OperationException(
"update service schema fails", e);
}
}
@Override
public boolean batchUpdateServiceSchemaContext(String serviceId, ModifySchemasRequest modifySchemasRequest) {
try {
HttpResponse response = httpClient
.postHttpRequest("/registry/microservices/" + serviceId + "/schemas", null,
HttpUtils.serialize(modifySchemasRequest));
if (response.getStatusCode() == HttpStatus.SC_OK) {
return true;
}
sendUnAuthorizedEvent(response);
throw new OperationException(
"update service schema fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
+ "; content = " + response.getContent());
} catch (IOException e) {
throw new OperationException(
"update service schema fails", e);
}
}
private void sendUnAuthorizedEvent(HttpResponse response) {
if (this.eventBus != null && response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {
this.eventBus.post(new UnAuthorizedOperationEvent());
}
}
@Override
public RbacTokenResponse queryToken(RbacTokenRequest request) {
try {
HttpResponse response = httpClient
.postHttpRequestAbsoluteUrl("/v4/token", null,
HttpUtils.serialize(request));
if (response.getStatusCode() == HttpStatus.SC_OK) {
RbacTokenResponse result = HttpUtils.deserialize(response.getContent(), RbacTokenResponse.class);
result.setStatusCode(HttpStatus.SC_OK);
return result;
}
if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) {
RbacTokenResponse result = new RbacTokenResponse();
result.setStatusCode(response.getStatusCode());
return result;
}
if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED ||
response.getStatusCode() == HttpStatus.SC_FORBIDDEN) {
RbacTokenResponse result = new RbacTokenResponse();
result.setStatusCode(response.getStatusCode());
ErrorMessage errorMessage = HttpUtils.deserialize(response.getContent(), ErrorMessage.class);
result.setErrorCode(errorMessage.getErrorCode());
return result;
}
throw new OperationException(
"query token failed, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
+ "; content = " + response.getContent());
} catch (IOException e) {
throw new OperationException(
"query token failed", e);
}
}
@Override
public boolean updateMicroserviceProperties(String serviceId, Map<String, String> serviceProperties) {
try {
UpdatePropertiesRequest request = new UpdatePropertiesRequest();
request.setProperties(serviceProperties);
HttpResponse response = httpClient.putHttpRequest(
"/registry/microservices/" + serviceId + "/properties", null, HttpUtils.serialize(request));
if (response.getStatusCode() == HttpStatus.SC_OK) {
return true;
}
sendUnAuthorizedEvent(response);
throw new OperationException(
"update service instance status fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
+ "; content = " + response.getContent());
} catch (IOException e) {
throw new OperationException(
"update service instance status fails", e);
}
}
}