Eureka协议使用命名空间

最近更新时间:2023-04-20 15:59:57

我的收藏

介绍

北极星对 Eureka 的 API 进行了全兼容,由于 Eureka 默认不支持命名空间,北极星拓展了一个请求头x-namespace来支持命名空间的隔离。当有客户端的请求到达服务端,服务端将检查这个 header:
如果 header 存在,则使用这个 header 标识的命名空间进行服务注册发现的隔离。
如果 header 不存在或者值为空,则使用默认的命名空间default

示例

下面通过 eureka 协议的api进行说明。向命名空间ns1下注册服务EUREKA-DEMO-PROVIDER的一个实例,实例端口为18081。
curl -X 'POST' 'http://127.0.0.1:8761/eureka/apps/EUREKA-DEMO-PROVIDER' \\
-H "Content-type: application/json" \\
-H "Accept: application/json" \\
-H "x-namespace: ns1" \\
-d '{
"instance": {
"instanceId": "10.91.80.100:eureka-demo-provider:18081",
"hostName": "10.91.80.100",
"app": "EUREKA-DEMO-PROVIDER",
"ipAddr": "10.91.80.100",
"status": "UP",
"overriddenStatus": "UNKNOWN",
"port": {
"$": 18081,
"@enabled": "true"
},
"securePort": {
"$": 443,
"@enabled": "false"
},
"countryId": 1,
"dataCenterInfo": {
"@class": "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo",
"name": "MyOwn"
},
"leaseInfo": {
"renewalIntervalInSecs": 30,
"durationInSecs": 90,
"registrationTimestamp": 0,
"lastRenewalTimestamp": 0,
"evictionTimestamp": 0,
"serviceUpTimestamp": 0
},
"metadata": {
"management.port": "18081"
},
"homePageUrl": "http://10.91.80.100:18081/",
"statusPageUrl": "http://10.91.80.100:18081/actuator/info",
"healthCheckUrl": "http://10.91.80.100:18081/actuator/health",
"vipAddress": "EUREKA-DEMO-PROVIDER",
"secureVipAddress": "EUREKA-DEMO-PROVIDER",
"isCoordinatingDiscoveryServer": "false",
"lastUpdatedTimestamp": "1681266990026",
"lastDirtyTimestamp": "1681266990889"
}
}' \\
-v
向命名空间ns2下注册服务EUREKA-DEMO-PROVIDER的一个实例,实例端口为18082。
curl -X 'POST' 'http://127.0.0.1:8761/eureka/apps/EUREKA-DEMO-PROVIDER' \\
-H "Content-type: application/json" \\
-H "Accept: application/json" \\
-H "x-namespace: ns2" \\
-d '{
"instance": {
"instanceId": "10.91.80.100:eureka-demo-provider:18082",
"hostName": "10.91.80.100",
"app": "EUREKA-DEMO-PROVIDER",
"ipAddr": "10.91.80.100",
"status": "UP",
"overriddenStatus": "UNKNOWN",
"port": {
"$": 18082,
"@enabled": "true"
},
"securePort": {
"$": 443,
"@enabled": "false"
},
"countryId": 1,
"dataCenterInfo": {
"@class": "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo",
"name": "MyOwn"
},
"leaseInfo": {
"renewalIntervalInSecs": 30,
"durationInSecs": 90,
"registrationTimestamp": 0,
"lastRenewalTimestamp": 0,
"evictionTimestamp": 0,
"serviceUpTimestamp": 0
},
"metadata": {
"management.port": "18082"
},
"homePageUrl": "http://10.91.80.100:18082/",
"statusPageUrl": "http://10.91.80.100:18082/actuator/info",
"healthCheckUrl": "http://10.91.80.100:18082/actuator/health",
"vipAddress": "EUREKA-DEMO-PROVIDER",
"secureVipAddress": "EUREKA-DEMO-PROVIDER",
"isCoordinatingDiscoveryServer": "false",
"lastUpdatedTimestamp": "1681266990026",
"lastDirtyTimestamp": "1681266990889"
}
}' \\
-v
查询ns1EUREKA-DEMO-PROVIDER的实例。
curl -X 'GET' 'http://127.0.0.1:8761/eureka/apps/EUREKA-DEMO-PROVIDER' \\
-H "Accept: application/json" \\
-H "x-namespace: ns1" \\
-v
## 返回18081端口实例
查询ns2EUREKA-DEMO-PROVIDER的实例。
curl -X 'GET' 'http://127.0.0.1:8761/eureka/apps/EUREKA-DEMO-PROVIDER' \\
-H "Accept: application/json" \\
-H "x-namespace: ns2" \\
-v
## 返回18082端口实例
如上所见,向不同命名空间下相同的服务名进行服务注册发现,已经通过命名空间进行隔离。

API 支持列表

注册服务实例

请求方法:PUT
路由:/eureka/apps/{appId}
示例:
curl -X 'POST' 'http://127.0.0.1:8761/eureka/apps/EUREKA-DEMO-PROVIDER' \\
-H "Content-type: application/json" \\
-H "Accept: application/json" \\
-H "x-namespace: ns1" \\
-d '{
"instance": {
"instanceId": "10.91.80.100:eureka-demo-provider:18081",
"hostName": "10.91.80.100",
"app": "EUREKA-DEMO-PROVIDER",
"ipAddr": "10.91.80.100",
"status": "UP",
"overriddenStatus": "UNKNOWN",
"port": {
"$": 18081,
"@enabled": "true"
},
"securePort": {
"$": 443,
"@enabled": "false"
},
"countryId": 1,
"dataCenterInfo": {
"@class": "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo",
"name": "MyOwn"
},
"leaseInfo": {
"renewalIntervalInSecs": 30,
"durationInSecs": 90,
"registrationTimestamp": 0,
"lastRenewalTimestamp": 0,
"evictionTimestamp": 0,
"serviceUpTimestamp": 0
},
"metadata": {
"management.port": "18081"
},
"homePageUrl": "http://10.91.80.100:18081/",
"statusPageUrl": "http://10.91.80.100:18081/actuator/info",
"healthCheckUrl": "http://10.91.80.100:18081/actuator/health",
"vipAddress": "EUREKA-DEMO-PROVIDER",
"secureVipAddress": "EUREKA-DEMO-PROVIDER",
"isCoordinatingDiscoveryServer": "false",
"lastUpdatedTimestamp": "1681266990026",
"lastDirtyTimestamp": "1681266990889"
}
}' \\
-v

健康检查

请求方法:PUT
路由:/eureka/apps/{appId}/{instanceId}
示例:
curl -X 'PUT' 'http://127.0.0.1:8761/eureka/apps/EUREKA-DEMO-PROVIDER/10.91.80.100:eureka-demo-provider:18081' \\
-H "x-namespace: ns1" \\
-v

取消注册

请求方法:DELETE
路由:/eureka/apps/{appId}/{instanceId}
示例:
curl -X 'DELETE' 'http://127.0.0.1:8761/eureka/apps/EUREKA-DEMO-PROVIDER/10.91.80.100:eureka-demo-provider:18081' \\
-H "x-namespace: ns1" \\
-v

查询所有实例

请求方法:GET
路由:/eureka/apps
示例:
curl -X 'GET' 'http://127.0.0.1:8761/eureka/apps' \\
-H "Accept: application/json" \\
-H "x-namespace: ns1" \\
-v

查询 delta 实例

请求方法:GET
路由:/eureka/apps/delta
示例:
curl -X 'GET' 'http://127.0.0.1:8761/eureka/apps/delta' \\
-H "Accept: application/json" \\
-v

查询某个服务下所有实例

请求方法:GET
路由:/eureka/apps/{appId}
示例:
curl -X 'GET' 'http://127.0.0.1:8761/eureka/apps/EUREKA-DEMO-PROVIDER' \\
-H "Accept: application/json" \\
-H "x-namespace: ns1" \\
-v

查询某个服务下某个实例

请求方法:GET
路由:/eureka/apps/{appId}/{instanceId}
示例:
curl -X 'GET' 'http://127.0.0.1:8761/eureka/apps/EUREKA-DEMO-PROVIDER/10.91.80.100:eureka-demo-provider:18081' \\
-H "Accept: application/json" \\
-H "x-namespace: ns1" \\
-v

查询某个实例

请求方法:GET
路由:/eureka/instance/{instanceId}
示例:
curl -X 'GET' 'http://127.0.0.1:8761/eureka/instance/10.91.80.100:eureka-demo-provider:18081' \\
-H "Accept: application/json" \\
-H "x-namespace: ns1" \\
-v

查询 vip 下的所有实例

请求方法:GET
路由:/eureka/vips/{vip}
示例:
curl -X 'GET' 'http://127.0.0.1:8761/eureka/vips/EUREKA-DEMO-PROVIDER' \\
-H "Accept: application/json" \\
-H "x-namespace: ns1" \\
-v

查询 secure vip 下的所有实例

请求方法:GET
路由:/eureka/svips/{svip}
示例
curl -X 'GET' 'http://127.0.0.1:8761/eureka/svips/EUREKA-DEMO-PROVIDER' \\
-H "Accept: application/json" \\
-H "x-namespace: ns1" \\
-v

强制隔离实例

请求方法:PUT
路由:/eureka/apps/{appId}/{instanceId}/status
示例
curl -X 'PUT' 'http://127.0.0.1:8761/eureka/apps/EUREKA-DEMO-PROVIDER/10.91.80.100:eureka-demo-provider:18081/status' \\
-H "x-namespace: ns1" \\
-v

关闭强制隔离

请求方法:DELETE
路由:/eureka/apps/{appId}/{instanceId}/status
示例
curl -X 'DELETE' 'http://127.0.0.1:8761/eureka/apps/EUREKA-DEMO-PROVIDER/10.91.80.100:eureka-demo-provider:18081/status' \\
-H "x-namespace: ns1" \\
-v

更新元数据

请求方法:PUT
路由:/eureka/apps/{appId}/{instanceId}/metadata?{key}={value}
示例
curl -X 'PUT' 'http://127.0.0.1:8761/eureka/apps/EUREKA-DEMO-PROVIDER/10.91.80.100:eureka-demo-provider:18081/metadata?k=v' \\
-H "x-namespace: ns1" \\
-v

批量复制

请求方法:POST
路由:/eureka/peerreplication/batch
示例
curl -X 'POST' 'http://127.0.0.1:8761/eureka/peerreplication/batch' \\
-H "Content-type: application/json" \\
-H "Accept: application/json" \\
-H "x-namespace: ns1" \\
-d '{
"replicationList":[
{
"appName": "EUREKA-DEMO-PROVIDER",
"id": "10.91.80.100:eureka-demo-provider:18081",
"lastDirtyTimestamp": 1681266990889,
"overriddenStatus": "UNKNOWN",
"status": "UP",
"instanceInfo": {
"instanceId": "10.91.80.100:eureka-demo-provider:18081",
"hostName": "10.91.80.100",
"app": "EUREKA-DEMO-PROVIDER",
"ipAddr": "10.91.80.100",
"status": "UP",
"overriddenStatus": "UNKNOWN",
"port": {
"$": 18081,
"@enabled": "true"
},
"securePort": {
"$": 443,
"@enabled": "false"
},
"countryId": 1,
"dataCenterInfo": {
"@class": "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo",
"name": "MyOwn"
},
"leaseInfo": {
"renewalIntervalInSecs": 30,
"durationInSecs": 90,
"registrationTimestamp": 0,
"lastRenewalTimestamp": 0,
"evictionTimestamp": 0,
"serviceUpTimestamp": 0
},
"metadata": {
"management.port": "18081"
},
"homePageUrl": "http://10.91.80.100:18081/",
"statusPageUrl": "http://10.91.80.100:18081/actuator/info",
"healthCheckUrl": "http://10.91.80.100:18081/actuator/health",
"vipAddress": "EUREKA-DEMO-PROVIDER",
"secureVipAddress": "EUREKA-DEMO-PROVIDER",
"isCoordinatingDiscoveryServer": "false",
"lastUpdatedTimestamp": "1681266990026",
"lastDirtyTimestamp": "1681266990889"
},
"action": "Register"
}

]
}' \\
-v