Eureka元数据
获取元数据信息#
从Eureka Server获取#
元数据举例
<application> <name>SERVICE-SMS</name> <instance> <instanceId>30.136.133.11:service-sms:8002</instanceId> <hostName>30.136.133.11</hostName> <app>SERVICE-SMS</app> <ipAddr>30.136.133.11</ipAddr> <status>UP</status> <overriddenstatus>UNKNOWN</overriddenstatus> <port enabled="true">8002</port> <securePort enabled="false">443</securePort> <countryId>1</countryId> <dataCenterInfo class="com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo"> <name>MyOwn</name> </dataCenterInfo> <leaseInfo> <renewalIntervalInSecs>1</renewalIntervalInSecs> <durationInSecs>1</durationInSecs> <registrationTimestamp>1579673388471</registrationTimestamp> <lastRenewalTimestamp>1579673470319</lastRenewalTimestamp> <evictionTimestamp>0</evictionTimestamp> <serviceUpTimestamp>1579673387755</serviceUpTimestamp> </leaseInfo> <metadata> <user.password>root</user.password> <management.port>8002</management.port> <jmx.port>62449</jmx.port> <user.name>root</user.name> </metadata> <homePageUrl>http://30.136.133.11:8002/</homePageUrl> <statusPageUrl>http://30.136.133.11:8002/actuator/info</statusPageUrl> <healthCheckUrl>http://30.136.133.11:8002/actuator/health</healthCheckUrl> <vipAddress>service-sms</vipAddress> <secureVipAddress>service-sms</secureVipAddress> <isCoordinatingDiscoveryServer>false</isCoordinatingDiscoveryServer> <lastUpdatedTimestamp>1579673388471</lastUpdatedTimestamp> <lastDirtyTimestamp>1579673387301</lastDirtyTimestamp> <actionType>ADDED</actionType> </instance> </application>
手写获取元数据#
在一个eureka client(api-listen-order)中,写一个controller
import org.springframework.cloud.client.discovery.DiscoveryClient; @RestController @RequestMapping("/service-instance") public class ServiceInstanceController { @Autowired private DiscoveryClient discoveryClient; @GetMapping("/query-by-application-name/{applicationName}") public List<ServiceInstance> getInstance(@PathVariable String applicationName){ return discoveryClient.getInstances(applicationName); } }
- 启动eureka(7900)单节点
- 启动api-listen-order
自己开发
- http://localhost:8084/service-instance/query-by-application-name/api-listen-order
- http://localhost:8084/service-instance/query-by-application-name/service-sms
- 结果看到一堆json信息
- 表示api-listen-order在eureka server中的实例信息
标准元数据和自定义元数据#
标准元数据:主机名,ip,端口,健康检查等信息
会被发布到注册表中,用于服务间调用
自定义元数据#
eureka.instance.metadata-map
自定义key:自定义value,可以直接在application.properites文件中配置
远程客户端访问。自定义属性。
api-listen-order中ServiceInstanceController,读取instance信息
启动eureka,api-listen-order,
http://localhost:8084/service-instance/query-by-application-name/api-listen-order
{
"host": "127.0.0.1",
"port": 8084,
"metadata": {
"yueyi": "2019",
"user.password": "root",
"management.port": "8084",
"jmx.port": "61378",
"user.name": "root"
},
"secure": false,
"uri": "http://127.0.0.1:8084",
"instanceId": "api-listen-order:30.136.133.11:port",
"serviceId": "API-LISTEN-ORDER",
"instanceInfo": {
"instanceId": "api-listen-order:30.136.133.11:port",
"app": "API-LISTEN-ORDER",
"appGroupName": null,
"ipAddr": "127.0.0.1",
"sid": "na",
"homePageUrl": "http://127.0.0.1:8084/",
"statusPageUrl": "http://127.0.0.1:8084/actuator/info",
"healthCheckUrl": "http://127.0.0.1:8084/actuator/health",
"secureHealthCheckUrl": null,
"vipAddress": "api-listen-order",
"secureVipAddress": "api-listen-order",
"countryId": 1,
"dataCenterInfo": {
"@class": "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo",
"name": "MyOwn"
},
"hostName": "127.0.0.1",
"status": "UP",
"overriddenStatus": "UNKNOWN",
"leaseInfo": {
"renewalIntervalInSecs": 1,
"durationInSecs": 1,
"registrationTimestamp": 1579489514655,
"lastRenewalTimestamp": 1579489524146,
"evictionTimestamp": 0,
"serviceUpTimestamp": 1579489514147
},
"isCoordinatingDiscoveryServer": false,
"metadata": {
"yueyi": "2019",
"user.password": "root",
"management.port": "8084",
"jmx.port": "61378",
"user.name": "root"
},
"lastUpdatedTimestamp": 1579489514655,
"lastDirtyTimestamp": 1579489514111,
"actionType": "ADDED",
"asgName": null
},
"scheme": null
}
自定义元数据,可以结合ribbon 分发规则使用
网关做分发规则选择服务时,可以作为依据
灰度发布,有用,例子
client端:
eureka:
instance:
metadataMap:
tag: pre-prd
调用方 #
List<ServiceInstance> instances = discoveryClient.getInstances(applicationName); for (ServiceInstance serviceInstance : instances) { Map<String, String> metadata = serviceInstance.getMetadata(); String metaValue = metadata.get("yueyi"); log.info("元数据:"+metaValue); }
获取到元数据#
- 分发的时候,根据app客户端传过来的参数:比如加tag=pre,只分发到pre-prd的eureka client。
- 在新发布的app版本带tag参数,就可以实现灰度测试
作者:BigBender
出处:https://www.cnblogs.com/BigBender/p/14484022.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2020-03-06 施密特正交化