def test_consul_service_empty_list(self, mock_consul_service):
     """
     测试未设置环境变量
     """
     from django.conf import settings
     os.environ["PERMISSION_REGISTER_NAME_HOST"] = ""
     settings.CONSUL_CLIENT_ADDR = {
         "HOST": "127.0.0.1",
         "PORT": 8500
     }
     settings.SERVICE_CONF = SERVICE_CONF
     try:
         consul_service(SERVICE_CONF)
     except ImproperlyConfigured as ex:
         self.assertEqual(type(ex), ImproperlyConfigured)
示例#2
0
def send_task(exchange, routing_key, message_code, *args, **kwargs):
    """
    发送实时任务
        参数:
            exchange/routing_key/message_code, 创建消息服务时返回的配置信息
            *args
            **kwargs
        settings配置:

        MESSAGE_SENDER_CONF = {
            "SERVICE_CONF": {
                "ENV_NAME": "DLJFLS_LSDK_LDKEND",
                "VALUE": "xxxxx-svc",
            },
            "API_PATH": "/api/sparrow_task/producer/send/",
        }

    """

    message_conf = get_settings_value("MESSAGE_SENDER_CONF")
    service_addr = consul_service(message_conf['SERVICE_CONF'])
    message_backend = "http://{}{}".format(service_addr,
                                           message_conf['API_PATH'])

    task_sender = TaskSender(message_backend)
    try:
        task_resutl = task_sender.send_task(exchange=exchange,
                                            routing_key=routing_key,
                                            message_code=message_code,
                                            *args,
                                            **kwargs)
        return task_resutl
    except Exception as ex:
        raise HTTPException(ex)
示例#3
0
def _build_url(service_conf, api_path):
    """
    :param service_conf:
    :param api_path:
    :return:
    """
    servicer_addr = consul_service(service_conf)
    return "http://{}{}".format(servicer_addr, api_path)
示例#4
0
 def test_consul_parameter_no_variable(self, mock_consul_service):
     """
     测试设置环境变量:
     os.environ["SPARROW_SERVICE_REGISTER_NAME_HOST"] = "127.0.0.1:8001"
     """
     from django.conf import settings
     os.environ["PERMISSION_REGISTER_NAME_HOST"] = "127.0.0.1:8001"
     settings.CONSUL_CLIENT_ADDR = {"HOST": "127.0.0.1", "PORT": 8500}
     settings.SERVICE_CONF = SERVICE_CONF
     addr = consul_service(SERVICE_CONF)
     self.assertEqual(addr, '127.0.0.1:8001')
示例#5
0
 def test_consul_parameter_variable(self, mock_consul_service):
     """
     测试未设置环境变量
     """
     from django.conf import settings
     os.environ["PERMISSION_REGISTER_NAME_HOST"] = ""
     settings.CONSUL_CLIENT_ADDR = {"HOST": "127.0.0.1", "PORT": 8500}
     settings.SERVICE_CONF = SERVICE_CONF
     addr = consul_service(SERVICE_CONF)
     expect_result_list = [
         '{}:{}'.format(ii["ServiceAddress"], ii['ServicePort'])
         for ii in CONSUL_RETURN_DATA[1]
     ]
     self.assertEqual(addr in expect_result_list, True)
示例#6
0
def send_task(exchange,
              routing_key,
              message_code,
              retry_times=3,
              *args,
              **kwargs):
    """
    发送实时任务
        参数:
            exchange/routing_key/message_code, 创建消息服务时返回的配置信息
            *args
            **kwargs
        settings配置:

        MESSAGE_SENDER_CONF = {
            "SERVICE_CONF": {
                "ENV_NAME": "DLJFLS_LSDK_LDKEND",
                "VALUE": "xxxxx-svc",
            },
            "API_PATH": "/api/sparrow_task/producer/send/",
        }

    """
    message_conf = get_settings_value("MESSAGE_SENDER_CONF")
    service_addr = consul_service(message_conf['SERVICE_CONF'])
    message_backend = "http://{}{}".format(service_addr,
                                           message_conf['API_PATH'])
    task_sender = TaskSender(message_backend)
    # 发送任务出现异常时的初始重试时间间隔
    interval_time = 1
    error_message = None
    for _ in range(retry_times):
        try:
            task_result = task_sender.send_task(exchange=exchange,
                                                routing_key=routing_key,
                                                message_code=message_code,
                                                *args,
                                                **kwargs)
            return task_result
        except Exception as ex:
            time.sleep(interval_time)
            error_message = ex.__str__()
    raise Exception("消息发送失败,失败原因{},重试次数{},消息内容message_code={},消息参数{}{}".format(
        error_message, retry_times, message_code, args, kwargs))
def rabbitmq_consumer(queue):
    """
    SparrowRabbitmpConsumer

        参数:
            queue # settings里面queue_conf 配置

        settings配置

        SPARROW_RABBITMQ_CONSUMER_CONF = {

            "MESSAGE_BROKER_CONF": {
                "USER_NAME": "hg_test",
                "PASSWORD": "******",
                "BROKER_SERVICE_CONF": {
                    "ENV_NAME": "SPARROW_BROKER_HOST",
                    "VALUE": "sparrow-demo",
                },
            },
            "MESSAGE_BACKEND_CONF": {
                "BACKEND_SERVICE_CONF": {
                        "ENV_NAME": "SPARROW_BACKEND_HOST",
                        "VALUE": "sparrow-demo",
                },
                "API_PATH": "/api/sparrow_task/task/update/"
            }
        }

        QUEUE_CONF_1 = {
            "QUEUE": "ORDER_PAY_SUC_ALL",
            "TARGET_FUNC_MAP": {
                "ORDER_PAY_SUC_ONLINE": "message_service.task.task1"
            }
        }


        ps:
                SPARROW_RABBITMQ_CONSUMER_CONF  # consumer的配置
                    MESSAGE_BROKER_CONF  # rabbitmq配置
                        USER_NAME # 用户名
                        PASSWORD # 密码
                        BROKER_SERVICE_CONF  # 依赖consul服务的配置
                    MESSAGE_BACKEND_CONF
                        BACKEND_SERVICE_CONF # 依赖consul服务的配置
                        API_PATH # api 路径
                QUEUE_CONF_1  # 队列的配置
                    QUEUE  # 队列名称
                    TARGET_FUNC_MAP  # 队列消费的任务(字典中的键为message code,
                                        对应的值为执行该消息的任务函数路径字符串)


    """
    consumer_conf = get_settings_value('SPARROW_RABBITMQ_CONSUMER_CONF')
    queue_conf = get_settings_value(queue)
    message_backend_path = consumer_conf['MESSAGE_BACKEND_CONF'].get(
        'API_PATH', None)
    backend_service_conf = consumer_conf['MESSAGE_BACKEND_CONF'].get(
        'BACKEND_SERVICE_CONF', None)
    broker_service_conf = consumer_conf['MESSAGE_BROKER_CONF'].get(
        'BROKER_SERVICE_CONF', None)
    broker_service_username = consumer_conf['MESSAGE_BROKER_CONF'].get(
        'USER_NAME', None)
    broker_service_password = consumer_conf['MESSAGE_BROKER_CONF'].get(
        'PASSWORD', None)
    virtual_host = consumer_conf['MESSAGE_BROKER_CONF'].get(
        'VIRTUAL_HOST', None)
    broker_service_addr = consul_service(broker_service_conf)

    broker_conf = 'amqp' + "://" + broker_service_username + ":" + broker_service_password + '@' + broker_service_addr + "/" + virtual_host
    if message_backend_path:
        backend_service_addr = consul_service(backend_service_conf)
        consumer = RabbitMQConsumer(queue=queue_conf.get('QUEUE', None),
                                    message_broker=broker_conf,
                                    message_backend="http://{}{}".format(
                                        backend_service_addr,
                                        message_backend_path))
    else:
        consumer = RabbitMQConsumer(queue=queue_conf.get('QUEUE', None),
                                    message_broker=broker_conf,
                                    message_backend=message_backend_path)
    consumer.target_func_map = queue_conf.get('TARGET_FUNC_MAP', None)
    consumer.consume()
def _build_url(service_conf, api_path):
    servicer_addr = consul_service(service_conf)
    return "http://{}{}".format(servicer_addr, api_path)
def rabbitmq_consumer(queue):
    """
    SparrowRabbitmpConsumer

        参数:
            queue # settings里面queue_conf 配置

        settings配置

        SPARROW_RABBITMQ_CONSUMER_CONF = {

            "MESSAGE_BROKER_CONF": {
                "USER_NAME": "",
                "PASSWORD": "",
                "VIRTUAL_HOST": "",
                "BROKER_SERVICE_CONF": {
                    "ENV_NAME": "",
                    "VALUE": "",
                },
            },
            "ALIYUN_RABBITMQ_BROKER": {
                "HOST": "",
                "PORT": "",
                "VIRTUAL_HOST": '',
                "ACCESS_KEY": "",
                "ACCESS_SECRET": "",
                "RESOURCEOWNERID": ,
                "SECURITY_TOKEN": "",
            }, 
            "RABBITMQ_SELECTION": "MESSAGE_BROKER_CONF",
            "MESSAGE_BACKEND_CONF": {
                "BACKEND_SERVICE_CONF": {
                        "ENV_NAME": "",
                        "VALUE": "",
                },
                "API_PATH": ""
            },
            "RETRY_TIMES": 3,
            "INTERVAL_TIME": 3,
            "HEARTBEAT": 600,
        }

        QUEUE_CONF_1 = {
            "QUEUE": "ORDER_PAY_SUC_ALL",
            "TARGET_FUNC_MAP": {
                "ORDER_PAY_SUC_ONLINE": ""
            }
        }


        ps:
                SPARROW_RABBITMQ_CONSUMER_CONF  # consumer的配置
                    MESSAGE_BROKER_CONF  # rabbitmq配置
                        USER_NAME # 用户名
                        PASSWORD # 密码
                        BROKER_SERVICE_CONF  # 依赖consul服务的配置
                    MESSAGE_BACKEND_CONF
                        BACKEND_SERVICE_CONF # 依赖consul服务的配置
                        API_PATH # api 路径
                    RETRY_TIMES # 错误重试次数,默认3次
                    INTERVAL_TIME   # 错误重试间隔,默认3秒
                    HEARTBEAT   # 消费者与rabbitmq心跳检测间隔,默认600秒
                QUEUE_CONF_1  # 队列的配置
                    QUEUE  # 队列名称
                    TARGET_FUNC_MAP  # 队列消费的任务(字典中的键为message code,
                                        对应的值为执行该消息的任务函数路径字符串)


    """
    consumer_conf = get_settings_value('SPARROW_RABBITMQ_CONSUMER_CONF')
    queue_conf = get_settings_value(queue)
    rabbitmq_selection = consumer_conf.get('RABBITMQ_SELECTION',
                                           "MESSAGE_BROKER_CONF")
    retry_times = consumer_conf.get('RETRY_TIMES', 3)
    interval_time = consumer_conf.get('INTERVAL_TIME', 3)
    consumer_heartbeat = consumer_conf.get('HEARTBEAT', 60)
    backend_service_conf = consumer_conf['MESSAGE_BACKEND_CONF']
    # broker_service_conf = consumer_conf['MESSAGE_BROKER_CONF'].get('BROKER_SERVICE_CONF', None)
    # broker_service_username = consumer_conf['MESSAGE_BROKER_CONF'].get('USER_NAME', None)
    # broker_service_password = consumer_conf['MESSAGE_BROKER_CONF'].get('PASSWORD', None)
    # virtual_host = consumer_conf['MESSAGE_BROKER_CONF'].get('VIRTUAL_HOST', None)

    while True:
        try:
            rabbitmq_conf = consumer_conf[rabbitmq_selection]
            virtual_host = rabbitmq_conf.get('VIRTUAL_HOST', None)
            if rabbitmq_selection == "ALIYUN_RABBITMQ_BROKER":
                # 连接aliyun amqp
                host = rabbitmq_conf["HOST"]
                port = rabbitmq_conf["PORT"]
                accessKey = rabbitmq_conf["ACCESS_KEY"]
                accessSecret = rabbitmq_conf["ACCESS_SECRET"]
                resourceOwnerId = rabbitmq_conf["RESOURCEOWNERID"]
                # security_token = rabbitmq_conf["SECURITY_TOKEN"]
                provider = aliyun_provider.AliyunCredentialsProvider(
                    accessKey, accessSecret, resourceOwnerId)
                username = provider.get_username()
                password = provider.get_password()
            else:
                broker_service_conf = rabbitmq_conf.get(
                    'BROKER_SERVICE_CONF', None)
                username = rabbitmq_conf.get('USER_NAME', None)
                password = rabbitmq_conf.get('PASSWORD', None)
                broker_service_addr = consul_service(broker_service_conf)
                host = broker_service_addr.split(':')[0]
                port = broker_service_addr.split(':')[1]

            message_broker_conf = {
                "host": host,
                "port": port,
                "username": username,
                "password": password,
                "virtual_host": virtual_host,
            }
            if backend_service_conf:
                consumer = RabbitMQConsumer(
                    queue=queue_conf.get('QUEUE', None),
                    message_broker_conf=message_broker_conf,
                    message_backend_conf=backend_service_conf,
                    retry_times=retry_times,
                    interval_time=interval_time,
                    heartbeat=consumer_heartbeat)
            else:
                consumer = RabbitMQConsumer(
                    queue=queue_conf.get('QUEUE', None),
                    message_broker_conf=message_broker_conf,
                    retry_times=retry_times,
                    interval_time=interval_time,
                    heartbeat=consumer_heartbeat)
            consumer.target_func_map = queue_conf.get('TARGET_FUNC_MAP', None)
            consumer.consume()
        except KeyboardInterrupt:
            break
        except:
            # 如果遇到exception不退出,过几秒重试一下
            time.sleep(interval_time)
def rabbitmq_consumer(queue):
    """
    SparrowRabbitmpConsumer

        参数:
            queue # settings里面queue_conf 配置

        settings配置

        SPARROW_RABBITMQ_CONSUMER_CONF = {

            "MESSAGE_BROKER_CONF": {
                "USER_NAME": "hg_test",
                "PASSWORD": "******",
                "BROKER_SERVICE_CONF": {
                    "ENV_NAME": "SPARROW_BROKER_HOST",
                    "VALUE": "sparrow-demo",
                },
            },
            "MESSAGE_BACKEND_CONF": {
                "BACKEND_SERVICE_CONF": {
                        "ENV_NAME": "SPARROW_BACKEND_HOST",
                        "VALUE": "sparrow-demo",
                },
                "API_PATH": "/api/sparrow_task/task/update/"
            },
            "RETRY_TIMES": 3,
            "INTERVAL_TIME": 3,
            "HEARTBEAT": 600,
        }

        QUEUE_CONF_1 = {
            "QUEUE": "ORDER_PAY_SUC_ALL",
            "TARGET_FUNC_MAP": {
                "ORDER_PAY_SUC_ONLINE": "message_service.task.task1"
            }
        }


        ps:
                SPARROW_RABBITMQ_CONSUMER_CONF  # consumer的配置
                    MESSAGE_BROKER_CONF  # rabbitmq配置
                        USER_NAME # 用户名
                        PASSWORD # 密码
                        BROKER_SERVICE_CONF  # 依赖consul服务的配置
                    MESSAGE_BACKEND_CONF
                        BACKEND_SERVICE_CONF # 依赖consul服务的配置
                        API_PATH # api 路径
                    RETRY_TIMES # 错误重试次数,默认3次
                    INTERVAL_TIME   # 错误重试间隔,默认3秒
                    HEARTBEAT   # 消费者与rabbitmq心跳检测间隔,默认600秒
                QUEUE_CONF_1  # 队列的配置
                    QUEUE  # 队列名称
                    TARGET_FUNC_MAP  # 队列消费的任务(字典中的键为message code,
                                        对应的值为执行该消息的任务函数路径字符串)


    """
    consumer_conf = get_settings_value('SPARROW_RABBITMQ_CONSUMER_CONF')
    queue_conf = get_settings_value(queue)
    retry_times = consumer_conf.get('RETRY_TIMES', 3)
    interval_time = consumer_conf.get('INTERVAL_TIME', 3)
    consumer_heartbeat = consumer_conf.get('HEARTBEAT', 600)
    message_backend_path = consumer_conf['MESSAGE_BACKEND_CONF'].get(
        'API_PATH', None)
    backend_service_conf = consumer_conf['MESSAGE_BACKEND_CONF'].get(
        'BACKEND_SERVICE_CONF', None)
    broker_service_conf = consumer_conf['MESSAGE_BROKER_CONF'].get(
        'BROKER_SERVICE_CONF', None)
    broker_service_username = consumer_conf['MESSAGE_BROKER_CONF'].get(
        'USER_NAME', None)
    broker_service_password = consumer_conf['MESSAGE_BROKER_CONF'].get(
        'PASSWORD', None)
    virtual_host = consumer_conf['MESSAGE_BROKER_CONF'].get(
        'VIRTUAL_HOST', None)

    while True:
        try:
            broker_service_addr = consul_service(broker_service_conf)
            broker_conf = "amqp://{}:{}@{}/{}".format(broker_service_username,
                                                      broker_service_password,
                                                      broker_service_addr,
                                                      virtual_host)
            if message_backend_path:
                backend_service_addr = consul_service(backend_service_conf)
                consumer = RabbitMQConsumer(
                    queue=queue_conf.get('QUEUE', None),
                    message_broker=broker_conf,
                    message_backend="http://{}{}".format(
                        backend_service_addr, message_backend_path),
                    retry_times=retry_times,
                    interval_time=interval_time,
                    heartbeat=consumer_heartbeat)
            else:
                consumer = RabbitMQConsumer(
                    queue=queue_conf.get('QUEUE', None),
                    message_broker=broker_conf,
                    message_backend=message_backend_path,
                    retry_times=retry_times,
                    interval_time=interval_time,
                    heartbeat=consumer_heartbeat)
            consumer.target_func_map = queue_conf.get('TARGET_FUNC_MAP', None)
            consumer.consume()
        except KeyboardInterrupt:
            break
        except:
            # 如果遇到exception不退出,过几秒重试一下
            time.sleep(interval_time)