python 注册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函数基础学习(定义、函数参数、递归函数)
1.本程序是测试函数的基础.函数的参数.递归函数的测试. 函数的参数有: 必选参数.默认参数.可变参数.命名关键字参数和关键字参数 #!/usr/bin/python # -*- coding: ut ...
- 【Python基础学习二】定义变量、判断、循环、函数基本语法
先来一个愉快的Hello World吧,就是这么简单,不需要写标点符号,但是需要严格按照缩进关系,Python变量的作用域是靠tab来控制的. print("Hello World" ...
- Python之路 day3 函数定义 *args及**kwargs
#!/usr/bin/env python # -*- coding:utf-8 -*- #Author:ersa import time # def logger(): # time_format ...
- Python元类实践--自己定义一个和collections中一样的namedtuple
大家可能很熟悉在collections模块中有一个很好用的扩展数据类型-namedtuple. 如果你还不知道这个类型,那么请翻看标准手册. 我利用元类轻松定义一个namedtuple. 先把代码贴上 ...
- 2017寒假零基础学习Python系列之函数之 定义默认参数
在定义函数时,可以有默认参数例如Python自带的函数int(),其实就是两个参数,我们既可以传一个参数,又可以传两个参数 int(') >>>123 int(',8) 83 int ...
- python入门(14)定义函数和接收返回值
定义函数: 定义一个求绝对值的my_abs函数为例: def my_abs(x): if x >= 0: return x else: return -x 如果没有return语句,函数执行完毕 ...
- 解释器、环境变量、如何运行python程序、变量先定义后引用
python解释器的介绍.解释器的安装.环境变量的添加为什么加环境变量.如何调取不同的解释器版本实现多版本共存.python程序如何运行的.python的变量定义 一.python解释器: 用来翻译语 ...
- python注册到eureka
由于python提供的服务没有加入到注册中心,没有办法实现高可用现将python加入到注册中心实现高可用以下是基础样例,具体功能待完善 # coding:utf- import tornado.htt ...
- Python函数基础-函数调用,定义,参数,递归
Python内置了很多函数供调用,eg 求绝对值函数abs() >>>abs(-1) 1 >>>abs(1) 求和函数sum(),sum(iterable,star ...
- Python 入门(一)定义字符串+raw字符串与多行字符串
定义字符串 前面我们讲解了什么是字符串.字符串可以用''或者""括起来表示. 如果字符串本身包含'怎么办?比如我们要表示字符串 I'm OK ,这时,可以用" " ...
随机推荐
- dotnet C# 获取当前设备可移动磁盘
本文告诉大家如何获取当前设备的可移动磁盘 在我的 WPF 应用里面,期望获取到 U 盘的所在盘进行一些有趣的逻辑.可以通过 DriveInfo 类的 GetDrives 获取当前所有的驱动器磁盘 再通 ...
- VSCode和PhpStorm配置进行PHP断点调试
本文环境:php版本:5.4.45 (phpstudy),Xdebug 2.4.1(phpstudy文件夹中自带),phpstorm 2021.3 目录 PHP配置 关于Xdebug 浏览器配置(插件 ...
- async 与 promise 的区别
async函数会引式返回一个promise,而promise的resolve值就是函数return的值 使用async和await明显节约了不少代码,不需要.then,不需要写匿名函数处理promis ...
- Fast Walsh Transform 学习笔记 | FWT
本文中使用 \(\cap\) 表示按位与,用 \(\cup\) 表示按位或 Part 1. 与/或 卷积 First. 问题引入 给定长度为 \(2^n\) 的数列 \(A,B\),求 \(C_i = ...
- go-admin migrate 数据表迁移
目录 视频教程 应用场景 目录说明 数据迁移 迁移步骤 配置数据库 常用命令示例 新建模型实例 3.1 方式一:不编译运行(推荐) 3.2 方式二:编译并运行迁移 3.3 方式三:golangIDE ...
- rails byebug
Gemfile里添加 gem 'byebug' bundle install 在要打断点的地方写 byebug byebug -h #帮助 c 放行,入下走 n 单行调适 q 退出进行 启动异步任务推 ...
- ARM64: ARDP
1 指令语法 ardp <Xd>, <lable> 2 指令语义 1 获取程序计数器PC寄存器的值: 2 将PC寄存器值的低12位全部取0; 3 将lable的值乘以4096, ...
- IDEA+carbon.now.sh安装使用
安装 打开IDEA,选择setting-->plugins 搜索carbon.now.sh,点击安装,重启IDEA即可. 使用 选择需要生成的代码,Ctrl+A全选.然后再代码中点击右键,找到o ...
- 创建一个flutter项目
启动Android Studio,点击[Start a new Flutter project] 如果没有这项选项,请先安装Flutter插件 具体安装方法,可参考 flutter开发环境的搭建 ...
- Python 潮流周刊#52:Python 处理 Excel 的资源
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...