parent
90fdbbccf2
commit
7d5d6ed3e3
@ -1,4 +1,4 @@ |
|||||||
package com.gitee.sop.registryapi.bean; |
package com.gitee.sop.adminserver.bean; |
||||||
|
|
||||||
import lombok.Data; |
import lombok.Data; |
||||||
import lombok.Getter; |
import lombok.Getter; |
@ -1,4 +1,4 @@ |
|||||||
package com.gitee.sop.registryapi.bean; |
package com.gitee.sop.adminserver.bean; |
||||||
|
|
||||||
import lombok.Data; |
import lombok.Data; |
||||||
|
|
@ -1,4 +1,4 @@ |
|||||||
package com.gitee.sop.registryapi.bean; |
package com.gitee.sop.adminserver.bean; |
||||||
|
|
||||||
import lombok.Data; |
import lombok.Data; |
||||||
|
|
@ -1,12 +0,0 @@ |
|||||||
package com.gitee.sop.adminserver.config; |
|
||||||
|
|
||||||
import com.gitee.sop.registryapi.config.BaseRegistryConfig; |
|
||||||
import org.springframework.context.annotation.Configuration; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author tanghc |
|
||||||
*/ |
|
||||||
@Configuration |
|
||||||
public class RegistryConfig extends BaseRegistryConfig { |
|
||||||
|
|
||||||
} |
|
@ -1,7 +1,7 @@ |
|||||||
package com.gitee.sop.registryapi.service; |
package com.gitee.sop.adminserver.service; |
||||||
|
|
||||||
import com.gitee.sop.registryapi.bean.ServiceInfo; |
import com.gitee.sop.adminserver.bean.ServiceInfo; |
||||||
import com.gitee.sop.registryapi.bean.ServiceInstance; |
import com.gitee.sop.adminserver.bean.ServiceInstance; |
||||||
|
|
||||||
import java.util.List; |
import java.util.List; |
||||||
|
|
@ -1,74 +0,0 @@ |
|||||||
<?xml version="1.0" encoding="UTF-8"?> |
|
||||||
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
|
||||||
<modelVersion>4.0.0</modelVersion> |
|
||||||
<groupId>com.gitee.sop</groupId> |
|
||||||
<artifactId>sop-registry-api</artifactId> |
|
||||||
<version>2.0.0-SNAPSHOT</version> |
|
||||||
|
|
||||||
<properties> |
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
|
||||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> |
|
||||||
<java.version>1.8</java.version> |
|
||||||
<okhttp.version>3.11.0</okhttp.version> |
|
||||||
</properties> |
|
||||||
|
|
||||||
<dependencies> |
|
||||||
<dependency> |
|
||||||
<groupId>com.squareup.okhttp3</groupId> |
|
||||||
<artifactId>okhttp</artifactId> |
|
||||||
<version>${okhttp.version}</version> |
|
||||||
</dependency> |
|
||||||
|
|
||||||
<!-- nacos sdk --> |
|
||||||
<dependency> |
|
||||||
<groupId>com.alibaba.nacos</groupId> |
|
||||||
<artifactId>nacos-client</artifactId> |
|
||||||
<version>1.1.3</version> |
|
||||||
</dependency> |
|
||||||
|
|
||||||
<dependency> |
|
||||||
<groupId>org.springframework</groupId> |
|
||||||
<artifactId>spring-context</artifactId> |
|
||||||
<version>5.1.6.RELEASE</version> |
|
||||||
<optional>true</optional> |
|
||||||
</dependency> |
|
||||||
<dependency> |
|
||||||
<groupId>org.projectlombok</groupId> |
|
||||||
<artifactId>lombok</artifactId> |
|
||||||
<version>1.18.6</version> |
|
||||||
<optional>true</optional> |
|
||||||
</dependency> |
|
||||||
<dependency> |
|
||||||
<groupId>org.springframework.boot</groupId> |
|
||||||
<artifactId>spring-boot-autoconfigure</artifactId> |
|
||||||
<version>2.1.4.RELEASE</version> |
|
||||||
<optional>true</optional> |
|
||||||
</dependency> |
|
||||||
|
|
||||||
<dependency> |
|
||||||
<groupId>junit</groupId> |
|
||||||
<artifactId>junit</artifactId> |
|
||||||
<version>4.11</version> |
|
||||||
<scope>test</scope> |
|
||||||
</dependency> |
|
||||||
|
|
||||||
</dependencies> |
|
||||||
|
|
||||||
<build> |
|
||||||
<plugins> |
|
||||||
<plugin> |
|
||||||
<groupId>org.apache.maven.plugins</groupId> |
|
||||||
<artifactId>maven-compiler-plugin</artifactId> |
|
||||||
<version>3.1</version> |
|
||||||
<configuration> |
|
||||||
<source>${java.version}</source> |
|
||||||
<target>${java.version}</target> |
|
||||||
<encoding>UTF-8</encoding> |
|
||||||
</configuration> |
|
||||||
</plugin> |
|
||||||
</plugins> |
|
||||||
</build> |
|
||||||
|
|
||||||
</project> |
|
@ -1,3 +0,0 @@ |
|||||||
# sop-registry-api |
|
||||||
|
|
||||||
统一各注册中心接口 |
|
@ -1,14 +0,0 @@ |
|||||||
package com.gitee.sop.registryapi.bean; |
|
||||||
|
|
||||||
import lombok.Data; |
|
||||||
|
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author tanghc |
|
||||||
*/ |
|
||||||
@Data |
|
||||||
public class EurekaApplication { |
|
||||||
private String name; |
|
||||||
private List<EurekaInstance> instance; |
|
||||||
} |
|
@ -1,13 +0,0 @@ |
|||||||
package com.gitee.sop.registryapi.bean; |
|
||||||
|
|
||||||
import lombok.Data; |
|
||||||
|
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author tanghc |
|
||||||
*/ |
|
||||||
@Data |
|
||||||
public class EurekaApplications { |
|
||||||
private List<EurekaApplication> application; |
|
||||||
} |
|
@ -1,11 +0,0 @@ |
|||||||
package com.gitee.sop.registryapi.bean; |
|
||||||
|
|
||||||
import lombok.Data; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author tanghc |
|
||||||
*/ |
|
||||||
@Data |
|
||||||
public class EurekaApps { |
|
||||||
private EurekaApplications applications; |
|
||||||
} |
|
@ -1,70 +0,0 @@ |
|||||||
package com.gitee.sop.registryapi.bean; |
|
||||||
|
|
||||||
import lombok.Data; |
|
||||||
import org.springframework.util.CollectionUtils; |
|
||||||
|
|
||||||
import java.util.Map; |
|
||||||
|
|
||||||
/** |
|
||||||
* { |
|
||||||
* "instance": { |
|
||||||
* "instanceId": "demo-order2:11101", |
|
||||||
* "app": "demo-order2", |
|
||||||
* "appGroutName": null, |
|
||||||
* "ipAddr": "127.0.0.1", |
|
||||||
* "sid": "na", |
|
||||||
* "homePageUrl": null, |
|
||||||
* "statusPageUrl": null, |
|
||||||
* "healthCheckUrl": null, |
|
||||||
* "secureHealthCheckUrl": null, |
|
||||||
* "vipAddress": "demo-order2", |
|
||||||
* "secureVipAddress": "demo-order2", |
|
||||||
* "countryId": 1, |
|
||||||
* "dataCenterInfo": { |
|
||||||
* "@class": "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo", |
|
||||||
* "name": "MyOwn" |
|
||||||
* }, |
|
||||||
* "hostName": "127.0.0.1", |
|
||||||
* "status": "UP", |
|
||||||
* "leaseInfo": null, |
|
||||||
* "isCoordinatingDiscoveryServer": false, |
|
||||||
* "lastUpdatedTimestamp": 1529391461000, |
|
||||||
* "lastDirtyTimestamp": 1529391461000, |
|
||||||
* "actionType": null, |
|
||||||
* "asgName": null, |
|
||||||
* "overridden_status": "UNKNOWN", |
|
||||||
* "port": { |
|
||||||
* "$": 11102, |
|
||||||
* "@enabled": "false" |
|
||||||
* }, |
|
||||||
* "securePort": { |
|
||||||
* "$": 7002, |
|
||||||
* "@enabled": "false" |
|
||||||
* }, |
|
||||||
* "metadata": { |
|
||||||
* "@class": "java.util.Collections$EmptyMap" |
|
||||||
* }* } |
|
||||||
* } |
|
||||||
* @author tanghc |
|
||||||
*/ |
|
||||||
@Data |
|
||||||
public class EurekaInstance { |
|
||||||
private String instanceId; |
|
||||||
private String ipAddr; |
|
||||||
private Map<String, Object> port; |
|
||||||
|
|
||||||
private String status; |
|
||||||
private String statusPageUrl; |
|
||||||
private String healthCheckUrl; |
|
||||||
private String lastUpdatedTimestamp; |
|
||||||
|
|
||||||
private Map<String, String> metadata; |
|
||||||
|
|
||||||
public String fetchPort() { |
|
||||||
if (CollectionUtils.isEmpty(port)) { |
|
||||||
return ""; |
|
||||||
} |
|
||||||
return String.valueOf(port.getOrDefault("$", "")); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -1,84 +0,0 @@ |
|||||||
package com.gitee.sop.registryapi.bean; |
|
||||||
|
|
||||||
import okhttp3.MediaType; |
|
||||||
import okhttp3.Request; |
|
||||||
import okhttp3.RequestBody; |
|
||||||
import okhttp3.internal.http.HttpMethod; |
|
||||||
|
|
||||||
/** |
|
||||||
* https://github.com/Netflix/eureka/wiki/Eureka-REST-operations
|
|
||||||
* |
|
||||||
* @author tanghc |
|
||||||
*/ |
|
||||||
public enum EurekaUri { |
|
||||||
|
|
||||||
/** |
|
||||||
* 查询所有实例 Query for all instances |
|
||||||
*/ |
|
||||||
QUERY_APPS("GET", "/apps"), |
|
||||||
/** |
|
||||||
* 查询一个实例 |
|
||||||
*/ |
|
||||||
QUERY_INSTANCES("GET", "/instances/%s"), |
|
||||||
/** |
|
||||||
* 下线 Take instance out of service |
|
||||||
*/ |
|
||||||
OFFLINE_SERVICE("PUT", "/apps/%s/%s/status?value=OUT_OF_SERVICE"), |
|
||||||
/** |
|
||||||
* 上线 Move instance back into service (remove override) |
|
||||||
*/ |
|
||||||
ONLINE_SERVICE("DELETE", "/apps/%s/%s/status?value=UP"), |
|
||||||
/** |
|
||||||
* 设置metadata信息 |
|
||||||
* |
|
||||||
* /apps/{appID}/{instanceID}/metadata?key=value |
|
||||||
*/ |
|
||||||
SET_METADATA("PUT", "/apps/%s/%s/metadata?%s=%s") |
|
||||||
; |
|
||||||
public static final String URL_PREFIX = "/"; |
|
||||||
|
|
||||||
String uri; |
|
||||||
String requestMethod; |
|
||||||
|
|
||||||
EurekaUri(String httpMethod, String uri) { |
|
||||||
if (!uri.startsWith(URL_PREFIX)) { |
|
||||||
uri = "/" + uri; |
|
||||||
} |
|
||||||
this.uri = uri; |
|
||||||
this.requestMethod = httpMethod; |
|
||||||
} |
|
||||||
|
|
||||||
public String getUri(String... args) { |
|
||||||
if (args == null || args.length == 0) { |
|
||||||
return uri; |
|
||||||
} |
|
||||||
Object[] param = new Object[args.length]; |
|
||||||
for (int i = 0; i < args.length; i++) { |
|
||||||
param[i] = args[i]; |
|
||||||
} |
|
||||||
return String.format(uri, param); |
|
||||||
} |
|
||||||
|
|
||||||
public Request getRequest(String url, String... args) { |
|
||||||
if (url.endsWith("/")) { |
|
||||||
url = url.substring(0, url.length() - 1); |
|
||||||
} |
|
||||||
String requestUrl = url + getUri(args); |
|
||||||
Request request = this.getBuilder() |
|
||||||
.url(requestUrl) |
|
||||||
.addHeader("Content-Type", "application/json") |
|
||||||
.addHeader("Accept", "application/json") |
|
||||||
.build(); |
|
||||||
return request; |
|
||||||
} |
|
||||||
|
|
||||||
public Request.Builder getBuilder() { |
|
||||||
String method = requestMethod; |
|
||||||
RequestBody requestBody = null; |
|
||||||
if (HttpMethod.requiresRequestBody(method)) { |
|
||||||
MediaType contentType = MediaType.parse("application/json"); |
|
||||||
requestBody = RequestBody.create(contentType, "{}"); |
|
||||||
} |
|
||||||
return new Request.Builder().method(requestMethod, requestBody); |
|
||||||
} |
|
||||||
} |
|
@ -1,36 +0,0 @@ |
|||||||
package com.gitee.sop.registryapi.config; |
|
||||||
|
|
||||||
import com.gitee.sop.registryapi.service.RegistryService; |
|
||||||
import com.gitee.sop.registryapi.service.impl.RegistryServiceEureka; |
|
||||||
import com.gitee.sop.registryapi.service.impl.RegistryServiceNacos; |
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
|
||||||
import org.springframework.context.annotation.Bean; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author tanghc |
|
||||||
*/ |
|
||||||
public class BaseRegistryConfig { |
|
||||||
|
|
||||||
/** |
|
||||||
* 当配置了registry.name=eureka生效 |
|
||||||
* |
|
||||||
* @return |
|
||||||
*/ |
|
||||||
@Bean |
|
||||||
@ConditionalOnProperty(prefix = "registry", name = "name", havingValue = "eureka") |
|
||||||
RegistryService registryServiceEureka() { |
|
||||||
return new RegistryServiceEureka(); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 当配置了registry.name=nacos生效 |
|
||||||
* |
|
||||||
* @return |
|
||||||
*/ |
|
||||||
@Bean |
|
||||||
@ConditionalOnProperty(prefix = "registry", name = "name", havingValue = "nacos") |
|
||||||
RegistryService registryServiceNacos() { |
|
||||||
return new RegistryServiceNacos(); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -1,100 +0,0 @@ |
|||||||
package com.gitee.sop.registryapi.service.impl; |
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSON; |
|
||||||
import com.gitee.sop.registryapi.bean.EurekaApplication; |
|
||||||
import com.gitee.sop.registryapi.bean.EurekaApps; |
|
||||||
import com.gitee.sop.registryapi.bean.EurekaInstance; |
|
||||||
import com.gitee.sop.registryapi.bean.EurekaUri; |
|
||||||
import com.gitee.sop.registryapi.bean.ServiceInfo; |
|
||||||
import com.gitee.sop.registryapi.bean.ServiceInstance; |
|
||||||
import com.gitee.sop.registryapi.service.RegistryService; |
|
||||||
import lombok.extern.slf4j.Slf4j; |
|
||||||
import okhttp3.OkHttpClient; |
|
||||||
import okhttp3.Request; |
|
||||||
import okhttp3.Response; |
|
||||||
import org.apache.commons.lang3.StringUtils; |
|
||||||
import org.apache.commons.lang3.time.DateFormatUtils; |
|
||||||
import org.springframework.beans.factory.annotation.Value; |
|
||||||
import org.springframework.util.CollectionUtils; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.util.ArrayList; |
|
||||||
import java.util.Collections; |
|
||||||
import java.util.Date; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
/** |
|
||||||
* eureka接口实现 |
|
||||||
* @author tanghc |
|
||||||
*/ |
|
||||||
@Slf4j |
|
||||||
public class RegistryServiceEureka implements RegistryService { |
|
||||||
|
|
||||||
private OkHttpClient client = new OkHttpClient(); |
|
||||||
|
|
||||||
@Value("${registry.eureka-server-addr:}") |
|
||||||
private String eurekaUrl; |
|
||||||
|
|
||||||
@Override |
|
||||||
public List<ServiceInfo> listAllService(int pageNo, int pageSize) throws Exception { |
|
||||||
if (StringUtils.isBlank(eurekaUrl)) { |
|
||||||
return Collections.emptyList(); |
|
||||||
} |
|
||||||
String json = this.requestEurekaServer(EurekaUri.QUERY_APPS); |
|
||||||
EurekaApps eurekaApps = JSON.parseObject(json, EurekaApps.class); |
|
||||||
|
|
||||||
List<ServiceInfo> serviceInfoList = new ArrayList<>(); |
|
||||||
List<EurekaApplication> applicationList = eurekaApps.getApplications().getApplication(); |
|
||||||
for (EurekaApplication eurekaApplication : applicationList) { |
|
||||||
ServiceInfo serviceInfo = new ServiceInfo(); |
|
||||||
serviceInfo.setServiceId(eurekaApplication.getName()); |
|
||||||
List<EurekaInstance> instanceList = eurekaApplication.getInstance(); |
|
||||||
if (!CollectionUtils.isEmpty(instanceList)) { |
|
||||||
serviceInfo.setInstances(new ArrayList<>(instanceList.size())); |
|
||||||
for (EurekaInstance eurekaInstance : instanceList) { |
|
||||||
ServiceInstance serviceInstance = new ServiceInstance(); |
|
||||||
serviceInstance.setInstanceId(eurekaInstance.getInstanceId()); |
|
||||||
serviceInstance.setServiceId(serviceInfo.getServiceId()); |
|
||||||
serviceInstance.setIp(eurekaInstance.getIpAddr()); |
|
||||||
serviceInstance.setPort(Integer.valueOf(eurekaInstance.fetchPort())); |
|
||||||
serviceInstance.setStatus(eurekaInstance.getStatus()); |
|
||||||
Date updateTime = new Date(Long.valueOf(eurekaInstance.getLastUpdatedTimestamp())); |
|
||||||
serviceInstance.setUpdateTime(DateFormatUtils.format(updateTime, TIMESTAMP_PATTERN)); |
|
||||||
serviceInstance.setMetadata(eurekaInstance.getMetadata()); |
|
||||||
serviceInfo.getInstances().add(serviceInstance); |
|
||||||
} |
|
||||||
} |
|
||||||
serviceInfoList.add(serviceInfo); |
|
||||||
} |
|
||||||
return serviceInfoList; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public void onlineInstance(ServiceInstance serviceInstance) throws Exception { |
|
||||||
this.requestEurekaServer(EurekaUri.ONLINE_SERVICE, serviceInstance.getServiceId(), serviceInstance.getInstanceId()); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void offlineInstance(ServiceInstance serviceInstance) throws Exception { |
|
||||||
this.requestEurekaServer(EurekaUri.OFFLINE_SERVICE, serviceInstance.getServiceId(), serviceInstance.getInstanceId()); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void setMetadata(ServiceInstance serviceInstance, String key, String value) throws Exception { |
|
||||||
this.requestEurekaServer(EurekaUri.SET_METADATA, serviceInstance.getServiceId(), serviceInstance.getInstanceId(), key, value); |
|
||||||
} |
|
||||||
|
|
||||||
private String requestEurekaServer(EurekaUri eurekaUri, String... args) throws IOException { |
|
||||||
Request request = eurekaUri.getRequest(this.eurekaUrl, args); |
|
||||||
Response response = client.newCall(request).execute(); |
|
||||||
if (response.isSuccessful()) { |
|
||||||
return response.body().string(); |
|
||||||
} else { |
|
||||||
log.error("操作失败,url:{}, msg:{}, code:{}", eurekaUri.getUri(args), response.message(), response.code()); |
|
||||||
throw new RuntimeException("操作失败"); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
Loading…
Reference in new issue