#!usr/bin/env python
# _*_ coding:utf-8 _*_
"""
@note: 自动注册服务
@author: jiashunx
@file: auto_register.py
@time: 2019/10/11
"""
import urllib2
from threading import Timer
class AutoRegister:
def __init__(self, req_model):
self.req_model = req_model
@staticmethod
def _get_request_models(apps):
req_models = []
for app in apps:
instance = app["instance"]
json_body = AutoRegister._get_request_json_body(instance=instance)
registers = app["registers"]
for register in registers:
req_models.append(RequestModel(
register_url=AutoRegister._format_register_url(register["url"]),
json_body=json_body,
instance=instance
))
return req_models
@staticmethod
def _format_register_url(url):
if url is not None and len(url) > 0:
if not url.endswith("/"):
url += "/"
if not url.endswith("eureka/"):
url += "eureka/"
return url
@staticmethod
def _get_request_json_body(instance):
ipAddr = instance["ipAddr"]
schema = "http://"
port = instance["port"]
if instance["securePortEnable"]:
schema = "https://"
port = instance["securePort"]
homePageUrl = schema + ipAddr + ":" + str(port) + "/"
statusPageUrl = homePageUrl + "Status"
healthCheckUrl = homePageUrl + "healthcheck"
return "<instance>" \
+ "<instanceId>" + instance["instanceId"] + "</instanceId>"\
+ "<hostName>" + instance["ipAddr"] + "</hostName>"\
+ "<app>" + instance["appId"] + "</app>"\
+ "<ipAddr>" + instance["ipAddr"] + "</ipAddr>"\
+ "<status>UP</status>"\
+ "<overriddenstatus>UNKNOWN</overriddenstatus>"\
+ "<port enable=\"" + str(instance["portEnable"]).lower() + "\">" + str(instance["port"]) + "</port>"\
+ "<securePort enabled=\"" + str(instance["securePortEnable"]).lower() + "\">" + str(instance["securePort"]) + "</securePort>"\
+ "<vipAddress>" + instance["vipAddress"] + "</vipAddress>"\
+ "<secureVipAddress>" + instance["secureVipAddress"] + "</secureVipAddress>"\
+ "<dataCenterInfo class=\"com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo\">"\
+ "<name>MyOwn</name>"\
+ "</dataCenterInfo>"\
+ "<metadata></metadata>"\
+ "<homePageUrl>" + homePageUrl + "</homePageUrl>"\
+ "<statusPageUrl>" + statusPageUrl + "</statusPageUrl>"\
+ "<healthCheckUrl>" + healthCheckUrl + "</healthCheckUrl>"\
+ "</instance>"
@staticmethod
def start(apps):
req_models = AutoRegister._get_request_models(apps)
for req_model in req_models:
AutoRegister(req_model=req_model)._auto_register()
def _auto_register(self):
self._register()
self._heartbeat()
def _register(self):
success = False
try:
request_url = self.req_model.register_url + "apps/" + self.req_model.appId
request = urllib2.Request(url=request_url, data=self.req_model.json_body, headers={
"Content-Type": "application/xml"
})
request.get_method = lambda: "POST"
response = urllib2.urlopen(request)
if response.code == 204:
success = True
print("service:%s register success, target register-center: %s" % (str(self.req_model), self.req_model.register_url))
except Exception, e:
print("service:%s register failed, target register-center: %s, error reason: %s" % (str(self.req_model), self.req_model.register_url, str(e)))
finally:
return success
def _heartbeat(self):
success = False
try:
request_url = self.req_model.register_url + "apps/" + self.req_model.appId + "/" + self.req_model.instanceId
request = urllib2.Request(url=request_url)
request.get_method = lambda: "PUT"
response = urllib2.urlopen(request)
if response.code == 200:
success = True
print("service:%s heartbeat success, target register-center: %s" % (str(self.req_model), self.req_model.register_url))
except Exception, e:
print("service:%s heartbeat failed, target register-center: %s, error reason: %s" % (str(self.req_model), self.req_model.register_url, str(e)))
if not success:
print("service: %s heartbeat to register-center: %s failed, retry to register" % (str(self.req_model), self.req_model.register_url))
self._register()
# 心跳间隔-30s
Timer(30, self._heartbeat).start()
class RequestModel:
def __init__(self, register_url, json_body, instance):
self.register_url = register_url
self.json_body = json_body
self.instance = instance
self.appId = instance["appId"]
self.instanceId = instance["instanceId"]
def __str__(self):
return "{appId=%s, vipAddrss=%s, instanceId=%s}" % (self.instance["appId"], self.instance["vipAddress"], self.instance["instanceId"])
if __name__ == "__main__":
AutoRegister.start([
{
"instance": {
"appId": "appId",
"instanceId": "instanceId",
"vipAddress": "vipAddress",
"secureVipAddress": "vipAddress",
"ipAddr": "127.0.0.1",
"portEnable": True,
"port": 8080,
"securePortEnable": False,
"securePort": 443
},
"registers": [
{"url": "http://127.0.0.1:9081/"},
{"url": "http://127.0.0.1:9082/"}
]
}
])
Python实现微服务实例注册与心跳至Eureka
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- Code Is Only Differentiator 源码:https://github.com/shuxing...
- zone®ion 上图是eureka高可用架构,也是Netflix推荐的用法。 上图的us-east-1c、...
- 1.创建eureka模块 2.添加pom依赖 并且加入父依赖管理。 同样在父类版本控制器里添加上这个模块的pom路...