python 注册nacos 进行接口规范定义

python,nacos · 浏览次数 : 5

小编点评

本文介绍了一种将Python服务作为Java下游算法服务或数据处理服务的场景,并提出了一种通过Nacos进行微服务调用的方法。文章首先描述了在Java中定义Feign API接口的方法,然后介绍了Python端如何处理来自Java端的请求。最后,文章提供了一个简单的Python Flask应用程序,该程序通过Nacos注册并接收来自Java端的服务调用。 1. **Java端接口定义**: - 在Java端定义了一个名为`PythonInfoAnalysisApi`的Feign客户端接口。 - 接口使用`@FeignClient`注解进行标记,并指定了服务名称和命名空间。 - 接口中定义了一个名为`getArticleSimilarRelationRef`的方法,该方法返回一个`CommonResult`对象,其中包含一个列表。 2. **Python端处理请求**: - Python端定义了一个名为`CommonResult`的类,用于封装返回数据、错误码和错误提示等信息。 - `CommonResult`类使用了`@dataclass`注解进行数据类定义,以便于序列化和反序列化。 - Python端还定义了一个名为`error`的静态方法,用于创建包含错误信息的`CommonResult`对象。 3. **Python端接口实现**: - Python端实现了一个名为`build_media_topological_graph`的Flask路由,该路由接收JSON格式的数据作为请求体。 - 数据被传递给`social_relation_service`模块的`build_media_topological_graph`方法进行处理。 - 处理完成后,使用`CommonResult`成功返回处理结果。 4. **Nacos注册与心跳检查**: - 文章提供了一个Python Flask应用程序,该应用程序启动时自动向Nacos服务器注册服务。 - 为了确保服务的高可用性,实现了一个定时器任务,每隔5秒进行一次心跳检查。 - 心跳检查通过`NacosClient`实例完成,该实例负责与Nacos服务器进行通信。 总的来说,本文展示了一种如何在微服务架构中使用Python和Java进行异步通信,并通过Nacos实现服务的动态发现和注册。这种方法提高了系统之间的解耦,使得服务的维护和扩展更加灵活。

正文

背景:

一般场景 python服务经常作为java下游的 算法服务或者 数据处理服务

但是使用http 去调用比较不灵活,通过注册到nacos上进行微服务调用才是比较爽的

1.定义feginapi的接口定义

java端

定义接口请求和响应 主要关注

CommonResult 结构 和 python要一直 ,不然序列号是有问题的

CommonResult<List<SocialRelationRefDTO>> 和python的 接口的结构要一致
@FeignClient(name = ApiConstants.PYTHON_WEB_SERVER)
@Tag(name = "RPC 服务 - 调用py信息分析接口")
public interface PythonInfoAnalysisApi {

    String PREFIX = "analysis";

@PostMapping(PREFIX + "/get_article_similar_relation_ref")
CommonResult<List<SocialRelationRefDTO>> getArticleSimilarRelationRef(@RequestBody List<SocialRelationRefDTO> dto);
}
CommonResult 结构

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import org.springframework.util.Assert;

import java.io.Serializable;
import java.util.Objects;

/**
 * 通用返回
 *
 * @param <T> 数据泛型
 */
@Data
public class CommonResult<T> implements Serializable {

    /**
     * 错误码
     *
     * @see ErrorCode#getCode()
     */
    private Integer code;
    /**
     * 返回数据
     */
    private T data;
    /**
     * 错误提示,用户可阅读
     *
     * @see ErrorCode#getMsg() ()
     */
    private String msg;

    /**
     * 将传入的 result 对象,转换成另外一个泛型结果的对象
     *
     * 因为 A 方法返回的 CommonResult 对象,不满足调用其的 B 方法的返回,所以需要进行转换。
     *
     * @param result 传入的 result 对象
     * @param <T>    返回的泛型
     * @return 新的 CommonResult 对象
     */
    public static <T> CommonResult<T> error(CommonResult<?> result) {
        return error(result.getCode(), result.getMsg());
    }

    public static <T> CommonResult<T> error(Integer code, String message) {
        Assert.isTrue(!GlobalErrorCodeConstants.SUCCESS.getCode().equals(code), "code 必须是错误的!");
        CommonResult<T> result = new CommonResult<>();
        result.code = code;
        result.msg = message;
        return result;
    }

    public static <T> CommonResult<T> error(ErrorCode errorCode) {
        return error(errorCode.getCode(), errorCode.getMsg());
    }

    public static <T> CommonResult<T> success(T data) {
        CommonResult<T> result = new CommonResult<>();
        result.code = GlobalErrorCodeConstants.SUCCESS.getCode();
        result.data = data;
        result.msg = "success";
        return result;
    }

    public static boolean isSuccess(Integer code) {
        return Objects.equals(code, GlobalErrorCodeConstants.SUCCESS.getCode());
    }

    @JsonIgnore // 避免 jackson 序列化
    public boolean isSuccess() {
        return isSuccess(code);
    }

    @JsonIgnore // 避免 jackson 序列化
    public boolean isError() {
        return !isSuccess();
    }

    // ========= 和 Exception 异常体系集成 =========

    /**
     * 判断是否有异常。如果有,则抛出 {@link ServiceException} 异常
     */
    public void checkError() throws ServiceException {
        if (isSuccess()) {
            return;
        }
        // 业务异常
        throw new ServiceException(code, msg);
    }

    /**
     * 判断是否有异常。如果有,则抛出 {@link ServiceException} 异常
     * 如果没有,则返回 {@link #data} 数据
     */
    @JsonIgnore // 避免 jackson 序列化
    public T getCheckedData() {
        checkError();
        return data;
    }

    public static <T> CommonResult<T> error(ServiceException serviceException) {
        return error(serviceException.getCode(), serviceException.getMessage());
    }

}

python端

 CommonResult :结构

 1 import json
 2 from typing import TypeVar, Generic, Optional
 3 from dataclasses import dataclass
 4 
 5 from flask import jsonify
 6 
 7 T = TypeVar('T')
 8 
 9 
10 @dataclass
11 class CommonResult(Generic[T]):
12     code: Optional[int] = None
13     data: T = None
14     msg: str = None
15 
16     @staticmethod
17     def error(code: int, message: str) -> 'CommonResult':
18         assert code is not None, "code must be provided"
19         return CommonResult(code=code, msg=message)
20 
21     @staticmethod
22     def success(data: T):
23         result = CommonResult(code=0, data=data, msg="success")
24         return jsonify(result.to_dict())
25

 

36 
37     def get_checked_data(self) -> T:
38         self.check_error()
39         return self.data
40 
41     def to_dict(self):
42         return {
43             "code": self.code,
44             "data": self.data,
45             "msg": self.msg
46         }

接口端:

@analysis_controller_bp.route('/build_media_topological_graph', methods=['POST'])
def build_media_topological_graph():
    data = request.json
    result = social_relation_service.build_media_topological_graph(data)
    common_result = CommonResult.success(result)
    print(common_result)
    return common_result  # 将CommonResult转换为字典并返回JSON响应

python 启动 类加上 注册nacos和 心跳检查

 

import os
import socket
import threading
import time

import nacos
from flask import Flask
from route.route import register_route
from util.nacos_util import NacosInstance
import logging
from conf import NACOS_SERVER_ADDRESS, NACOS_SERVER_NAMESPACE

app = Flask(__name__)
app.config["JSON_AS_ASCII"] = False

client = nacos.NacosClient(NACOS_SERVER_ADDRESS, namespace=NACOS_SERVER_NAMESPACE)

hostname = socket.gethostname()
ip_address = socket.gethostbyname(hostname)
instance = NacosInstance(
    NACOS_SERVER_ADDRESS, namespace=NACOS_SERVER_NAMESPACE,
    service_name="python-web-server",
    instance_ip=ip_address,
    instance_port=5000,
    cluster='DEFAULT'
)


def service_register():
    # 创建 Nacos 实
    # 注册服务
    # instance.register()
    instance.register()


def heartbeat_task():
    while True:
        instance.heartbeat()
        time.sleep(5)


heartbeat_thread = threading.Thread(target=heartbeat_task)
heartbeat_thread.start()

app = Flask(__name__)

register_route(app)

if __name__ == '__main__':
    service_register()
    app.run(debug=True, host='0.0.0.0', port=5000)
    # 当应用退出时,注销服务
    deregister = instance.deregister()
    print(deregister)

python注册nacos 核心方法

 

与python 注册nacos 进行接口规范定义相似的内容:

python 注册nacos 进行接口规范定义

背景: 一般场景 python服务经常作为java下游的 算法服务或者 数据处理服务 但是使用http 去调用比较不灵活,通过注册到nacos上进行微服务调用才是比较爽的 1.定义feginapi的接口定义 java端 定义接口请求和响应 主要关注 CommonResult 结构 和 python要

python独立脚本应用Django项目的环境

一、需求说明 一直用 Django 在开发一个网站项目,其中的注册用户和登录,都是使用Django自带的认证系统。主要是对密码的加密,在注册或者登录的时候,前端传递过来的密码,我会使用Django的set_password()方法再加密一次 经过加密后的数据库中的数据样子如下: 现在我有另外一个需求

用python用户注册和短信验证码逻辑实现案例

一.写代码前分析(逻辑分析OK了才可以顺利成章的敲代码): A、用户发送请求 1、注册账号(用户名不能重复)--按照需求进行判断 2、短信验证码(有效期5分钟)--对短信验证码进行保存 B、用户注册、短信验证用不同得函数封装实现 d_user={} #存放用户名和密码的数据字典 verificati

python flask 简单应用开发

转载请注明出处: Flask 是一个基于 Python 的微型 Web 框架,它提供了一组简洁而强大的工具和库,用于构建 Web 应用程序。Flask 的主要作用是帮助开发者快速搭建轻量级的、灵活的 Web 应用。 使用 Flask 可以按照以下步骤进行: 1.安装 Flask: 通过 pip 工具

python flask 提供web的get/post开发

转载请注明出处: 使用python flask框架编写web api中的get与post接口,代码编写与调试示例如下: from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/api/get', met

linux安装python

转载请注明出处: 1.查看当前系统上已安装的Python版本: 在终端中运行以下命令: python --version 或者使用以下命令查看全部已安装的Python版本: ls /usr/bin/python* 2.下载并安装python包 2.1 下载安装包 访问Python官方网站 https

Python学习之九_winrm执行远程机器的cmd命令

Python学习之九_winrm执行远程机器的cmd命令 winrm # 注意如下命令需要按照顺序执行. # 打开powershell的管理员模式进行如下的操作. set-executionpolicy remotesigned winrm quickconfig winrm set winrm/c

百度飞桨(PaddlePaddle)安装

注意:32位pip没有PaddlePaddle源 Python 3.7.4 => AIStudio NoteBook 环境中的版本,3.8 后期运行源码时会有问题 ![image](https://img2023.cnblogs.com/blog/80824/202305/80824-2023052

Python常见面试题017: Python中是否可以获取类的所有实例

017. Python中是否可以获取类的所有实例 转载请注明出处,https://www.cnblogs.com/wuxianfeng023 出处 https://docs.python.org/zh-cn/3.9/faq/programming.html#faq-multidimensional-

Python学习之四_部分battery的学习

Python学习之四_部分battery的学习 CentOS升级pip的方法 yum install python3 之后, 一般centos的版本都很低, 有时候很多module 是无法安装的. 一般可以通过他进行升级: pip3 install -U pip 注意如果无法升级, 可以先这样处理