介绍
北极星对 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
查询
ns1
下EUREKA-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端口实例
查询
ns2
下EUREKA-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