首页 > 编程语言 >python 注册nacos 进行接口规范定义

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

时间:2024-06-18 17:53:50浏览次数:15  
标签:code CommonResult python nacos 接口 return result import data

背景:

一般场景 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 核心方法

 

标签:code,CommonResult,python,nacos,接口,return,result,import,data
From: https://www.cnblogs.com/hejunhong/p/18254850

相关文章

  • Python编程基础:f-字符串格式
    本文探讨使用Pythonf-字符串格式,也称为“格式化字符串文字”。f-string是格式化字符串的一种很好且简单的方法,适用于Pythonv3.6+。如果你仍然使用.format()方法,必须了解f-字符串。使用字符串格式的优势之一是能够“插入”并格式化字符串数据中的变量。Python字符串format()方......
  • spring boot jpa 进行通用多条件动态查询和更新 接口
    原因:jpa没有类似于mybatis的那种拼接sql的方式想动态更新需要使用CriteriaUpdate的方式去一直拼接,其实大多数场景只要传入一个非空实体类,去动态拼接sql1.定义实体类继承一个统一的类型@Data@ToString@Entity@Table(name="sys_user")@DynamicInsert@JsonIgno......
  • sonarqube的API接口(持续补充)
    1.查看sonarqube的违规问题API{sonar_url}/api/issues/search?componentKeys={project_key}1-1如果要限制违规级别如下:{sonar_url}/api/issues/search?componentKeys={project_key}&severities=BLOCKER,CRITICAL1-2如果设置每页展示的数量和页码(只支持每页500条,20页的数据展示......
  • python调用智能合约代码,BadFunctionCallOutput 怎么解决
    目录桌面应用使用QT5开发的,可以看看我的QT5文章BadFunctionCallOutput 怎么解决我的原因是智能合约地址填写错误python智能合约基础应用如何使用remix编写solidity智能合约并部署上链在哪进行合约部署,合约部署步骤Remix怎么复制abi和address​编辑这个ABI对应最简......
  • 【python】pandas:DataFrame详解
    DataFrame是Pandas库中的一个核心数据结构,用于处理和分析表格型数据。以下是关于DataFrame的详细介绍:1.定义DataFrame是一个二维的表格型数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值等)。DataFrame可以被视为一个电子表格或SQL表,或是由多个Seri......
  • 【暑假Python上岸计划】最新20+Python实战案例,全程干货,30天看完即可接单就业!(基础+进阶
    前言今天给大家分享20+个基于python的实战案例,主要包含:数据分析、可视化、机器学习/深度学习、时序预测等,案例的主要特点:*提供源码:代码都是基于jupyternotebook,附带一定的注释,运行即可*数据齐全:大部分案例都有提供数据,部分案例使用内置数据集学习资料已打包,需要......
  • 【Python】python实现双向链表
    一、定义与结构双向链表(DoublyLinkedList)是一种链式数据结构,每个节点(Node)包含三个部分:一个数据域(data),一个指向前驱节点的指针(prev),以及一个指向后继节点的指针(next)。双向链表的每个节点都链接到前一个节点和后一个节点,从而允许在两个方向上进行遍历。双向链表的结构+---......
  • 自动化之python读取目录结构转换为element-plus tree结构
    defget_project_tree(start_path:str,original_path:str,tree_data:list):child_files=os.listdir(start_path)forchild_fileinchild_files:ifchild_filein['.gitignore','.idea','venv','__pycache__......
  • Python - Arrays and Numpy Arrays
    Mostprogramminglanguagesprovideadatastructurecalledarrays.InPython,arrayisapackageanditisdifferentfrom“core”pythonlists.    Thesyntaxforcreatinganarray. DifferencesbetweenNumpyArraysandArrays PythonPredefi......
  • 【闲鱼API】深入解析与应用指南——闲鱼商品详情API接口♠
    在二手交易市场中,阿里巴巴集团旗下的闲鱼平台以其社区氛围和交易模式,吸引了大量用户。为了进一步丰富用户体验和提升交易透明度,开放了一系列API接口,其中包括商品详情API闲鱼商品详情API接口概述闲鱼商品详情API接口允许用户和开发者获取商品的详细信息,包括商品描述、图片、价格......