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 ,这时,可以用" " ...
随机推荐
- 在 Visual Studio 中规范化文件编辑
1 配置文件存放 生成了对应的 .editorconfig 文件,存放在仓储的根目录.即对整个仓储所有的用 VS 作为 IDE 编辑的项目生效. 同时支持子目录有自己的 .editorconfig 文 ...
- 第8讲 browse命令的使用技巧
第8讲 browse命令的使用技巧 1.浏览所有parts,使用技巧 选中工程文件*.dsn/Edit/Browse/Parts.列出工程中用到的所有元件,方便在画完原理图后,查看哪些元件没有编号或数 ...
- MindSpore强化学习:使用PPO配合环境HalfCheetah-v2进行训练
本文分享自华为云社区<MindSpore强化学习:使用PPO配合环境HalfCheetah-v2进行训练>,作者: irrational. 半猎豹(Half Cheetah)是一个基于Mu ...
- elementui 时间戳和后台配合
保存时间 思路: 前端传时间戳, 后台表里的时间类型为timestamp, model结构体tag设置为 *time.Time json:"activationTime" gorm ...
- Python基础知识——缩进、标识符、保留字
标识符 标识符就是程序中,使用的各种名称,例如:变量名.常量名.类名等等. 在 Python 中,对标识符格式的要求与 C/C++.Java 等差不多: 第一个字符必须是字母表中的字母或下划线 _ ; ...
- ansible系列(35)--ansible实战之部署WEB集群架构(5)
目录 1. 整体测试 1.1 运行playbook 1.2 出口路由器防火墙规则设置 1.3 访问测试 1. 整体测试 1.1 运行playbook playbook的整体运行过程如下(因为之前都运行 ...
- Splashtop和 TiFlux 宣布建立合作伙伴关系
2020年9月21日,远程访问解决方案的全球领导者 Splashtop Inc. 和面向 IT 服务提供商的 IT 解决方案公司 TiFlux 宣布建立合作伙伴关系,以整合 Splashtop 远程访 ...
- 已经调试成功的Protues工程用了一段时间后不能用的问题
已经调试成功的Protues工程,经过一段时间后不能用的问题 主要现象:(1)可以打开,运行时没有效果:(2)可以打开,运行时闪退 解决办法:(1)删除原ARM芯片:(2)重新找到ARM芯片,重新加载 ...
- sqlerver 报错5120 无法为该请求检索数据 系统找不到指定路径
背景: 数据库mdf文件所在盘符F盘被删除了,也就是文件不存在了,sqlserver管理器打开就报错5120,并且正常路径的数据库也不显示出来. 要让正常的数据库显示出来,就需要删除掉已经没有的数据库 ...
- Windows系统命令行的最佳实践
更多博文请关注:https://blog.bigcoder.cn 每次看到Mac生态中炫酷的命令行工具,我就一脸羡慕,但是奈何财力不足,整不起动辄上万的电脑,搬砖人就只能折腾折腾手里的这台window ...