Flask微服务注册到Nacos

news2025/8/7 14:46:39

目录

  • 一、前言
  • 二、手写实现Flask注册到Nacos
    • 1. 服务注册
    • 2. 心跳检测
  • 三、使用nacos-sdk-python完成注册
  • 四、SpringBoot远程调用
    • 1. 添加 Python 端业务逻辑
    • 2. SpringBoot 的远程调用
  • 五、SpringGateway网关转发

一、前言

最近有一个使用 SpringCloud 的微服务项目,需要使用到 Flask 提供一些深度学习的模型接口。Java那边使用的 Nacos 作为注册中心,所以也需要把 Flask 的服务注册上去。

本文会谈到手写实现Flask服务注册到Nacos与基于nacos-sdk-python注册,以及SpringBoot调用Flask以及SpringGateway网关请求转发调用Flask。


二、手写实现Flask注册到Nacos

1. 服务注册

Nacos官方文档给出了服务注册的请求地址。
在这里插入图片描述

  • 请求地址:
    http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=服务名&ip=服务ip地址&port=服务端口
  • 请求方式:POST

逻辑很简单,直接给出实现

import requests
from flask import Flask

app = Flask(__name__)

# 服务注册
def service_register():
	url = "http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=pythonservice&ip=127.0.0.1&port=5000"
	res = requests.post(url)
	print("完成注册")

if __name__ == '__main__':
	service_register()
	app.run()

登录到Nacos的控制页面,可以看到确实已经注册上去了。

在这里插入图片描述
但当我们再隔一段时间后(准确来说是15秒),发现已经没有了健康实例。

在这里插入图片描述
再隔一段时间后(准确来说是30秒),发现已经没有了服务。

在这里插入图片描述
这得从Nacos对服务实例的健康检查说起。我们刚才注册上去的服务是临时实例

  • 对于临时实例
    Nacos服务端在15秒内如果没收到客户端的心跳请求,会将该实例设置为不健康,在30秒内没收到心跳,会将这个临时实例摘除。

  • 对于非临时实例
    Nacos会主动询问,也就是不再需要客户端主动完成心跳检测。

为了保证我们的服务注册上去以后,保持健康状态,即让Nacos服务端知道我们的服务并没有问题。因此需要定期(一般是5秒)向Nacos服务端发起心跳检测的请求。

2. 心跳检测

  • 请求地址:
    http://127.0.0.1:8848/nacos/v1/ns/instance/beat?serviceName=服务名&ip=服务ip地址&port=服务端口
  • 请求方式:PUT
import requests
from flask import Flask

import time
# 用于异步处理心跳检测
import threading

app = Flask(__name__)

# 服务注册
def service_register():
	url = "http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=pythonservice&ip=127.0.0.1&port=5000"
	res = requests.post(url)
	print("完成注册")

# 心跳检测
def service_beat():
	while True:
		url = "http://127.0.0.1:8848/nacos/v1/ns/instance/beat?serviceName=pythonservice&ip=127.0.0.1&port=5000"
		res = requests.put(url)
		print(f"心跳检测中... 响应状态码: {res.status_code}")
		time.sleep(5)

if __name__ == '__main__':
	service_register()
	# 5 秒后执行心跳检测
	threading.Timer(5, service_beat()).start()
	app.run()

三、使用nacos-sdk-python完成注册

Nacos官方文档

  • 安装 nacos-sdk-python 模块
pip install nacos-sdk-python
  • 服务注册
import nacos
import threading
from flask import Flask

app = Flask(__name__)

# nacos 服务地址
SERVER_ADDRESSES = "http://127.0.0.1:8848"

# 官方文档中更加详细的描述了此方法的形参,包括命名空间、sk、ak等
# 在此处,我只需要传 服务地址 即可
client = nacos.NacosClient(SERVER_ADDRESSES)

def service_register():
	"""
	 ephemeral参数:是否是临时服务,应为false; 
	 刚才上面也提到了,如果是 非临时实例,客户端就无需主动完成心跳检测。
	 因此此处将服务注册为 非临时实例
	"""
	client.add_naming_instance("pythonservice", "127.0.0.1", "5000", ephemeral=False)

if __name__ == '__main__':
	threading.Timer(5, service_register).start()
	app.run()

四、SpringBoot远程调用

我先给出Java部分的代码结构,在此处,我们只会使用到 java-demo 模块,在下面一节,就会使用到 gateway 模块。
在这里插入图片描述

1. 添加 Python 端业务逻辑

在此处,我们简单的套上了一个 Flask 接口。

@app.route("/py", methods=['get'])
def py1():
	print("hello py")
	return "hello, python service"

2. SpringBoot 的远程调用

  • java-demo 模块的配置如下
server:
  port: 8081
spring:
  application:
    name: javaservice
  cloud:
    nacos:
      server-addr: localhost:8848
  • 业务逻辑如下
@SpringBootApplication
@RestController
@RequestMapping("/java")
public class JavaDemoApplication {

    @Autowired
    private RestTemplate restTemplate;

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }


    public static void main(String[] args) {
        SpringApplication.run(JavaDemoApplication.class, args);
    }

    @GetMapping
    public String javaService(){
        System.out.println("java service start...");
        String url = "http://pythonservice/py";
        // 发送http请求,实现远程调用
        String ps = restTemplate.getForObject(url, String.class);
        System.out.println("Python service 返回内容: 【 " + ps + "】");
        return "Java远程调用Python: " + ps;
    }
}
  • 访问接口
    在这里插入图片描述

五、SpringGateway网关转发

回到我最开始的初衷,我们是想提供深度学习模型的接口,因此还是希望前端直接调用Flask的接口而不是先调Java,Java再调Flask。
而微服务中一般会使用SpringGateway来做请求转发,因此,我们就来做SpringGateway转发到我们的Flask接口。

  • gateway 模块的配置如下
server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:8848 
    gateway:
      routes:
        - id: javaservice 
          uri: lb://javaservice 
          predicates: 
            - Path=/java/**
        - id: pythonservice
          uri: lb://pythonservice
          predicates:
            - Path=/py/**

这里,我们将SpringBoot服务与Flask服务均做了请求转发配置

  • 访问接口

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/15563.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]java毕业设计面向服装集群企业的个性化定制服务系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

C++ 异常处理 重新throw变量时的事件

直接说结论:throw的表达式创建出来的变量会被拷贝下来【通过拷贝构造函数,后面会证实这一点,且是放在堆里的】,然后沿着调用路径去搜索最近匹配异常的catch语句,在沿途,传递给catch语句的是堆中的异常变量的…

2022年数维杯国际大学生数学建模挑战赛D题三重拉尼娜事件下极端气候灾害损失评估与应对策略研究解题过程

2022年数维杯国际大学生数学建模挑战赛 D题 三重拉尼娜事件下极端气候灾害损失评估与应对策略研究 原题再现: 2022年7月至8月,中国南方许多城市经历了多天的炎热天气,而北方部分地区也出现了大面积强降水。此外,许多欧洲国家也经…

GEE开发之Modis_NDVI数据分析获取大总结

GEE开发之Modis_NDVI数据分析获取大总结0. 之前的博客链接1. MYD13Q1(250米/16天)2. MOD09GA_006_NDVI(500米/1天)3. MOD13Q1(250米/16天)4. MOD13A1(500米/16天)5. MOD13A2(1000米/16天)6. 日数据下载(以MYD13Q1为例子)7. 月数据下载(以MYD13Q1为例子)7.1 代码一7.2 代码二&am…

博途1200PLC轴控功能块(脉冲轴)

1200选择晶体管输出的型号,本体支持脉冲发送,利用工艺对象可以组态脉冲轴。利用1200和1500PN总线可以进行总线伺服的控制,具体请参看下面的博客: 博途1200/1500PLC V90 PN通信控制 (FB284功能块)_RXXW_Dor的博客-CSDN博客_fb284功能块先简单说下如何获取FB284,一般有2种方…

redirs非关系型数据库使用

非关系型数据库是将不经常使用的数据保存到redis缓存中,当前端访问redis缓存数据,如果没有查到该数据,则从数据库中查询,并将数据缓存到redis里。 数据结构介绍: redis的存储主要是key,value的数据格式,其…

Node.js 是如何做 GC (垃圾回收)的?

大家好,我是前端西瓜哥。今天我们来研究一下 Node.js 是如何做 GC 的。 GC,Garbage Collection,垃圾回收。在编程中,一般指的是内存自动回收机制,会定时将不需要用到的数据进行清除。 Node.js 底层使用了 V8 引擎。V…

Android入门第31天-Android里的ViewFlipper翻转视图的使用

介绍 本篇给大家带了的是ViewFlipper,它是Android自带的一个多页面管理控件,且可以自动播放! 和ViewPager不同,ViewPager是一页页的,而ViewFlipper则是一层层的,和ViewPager一样,很多时候&…

Vivado在Linux下的安装与运行

一. Vivado安装步骤 下载解压安装包后,并进入安装包路径运行终端 cd Downloads/Xilinx_Vivado_SDK_2017.4运行 sudo apt install libncurses5 安装ncurses库 sudo apt install libncurses5 运行 sudo chmod x setup 添加可执行权限 sudo chmod x setup运行 sudo .…

PHP反序列化漏洞解析

序列化 所谓序列化就是将原数据对象转换为具有一定格式的数据 举一个最简单的例子,在C中,若要开发一个数据库,那么一定涉及到数据的存储,要将内存中的数据持久化的保存在磁盘中,这就要对数据的存储格式进行优化&…

[附源码]java毕业设计企业信息网站

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

网关及其分类

1. 介绍 大家都知道,从一个房间走到另一个房间,必然要经过一扇门。同样,从一个网络向另一个网络发送信息,也必须经过一道“关口”,这道关口就是网关。顾名思义,网关(Gateway)就是一个网络连接到另一个网络的…

深度探究多线程的效率以及多线程的使用建议

随着时代发展,电脑的核心数慢慢增多,在开发程序的过程中,是否选择使用多线程这是个比较大的问题,下面我通过一个程序去深入理解多线程对程序速度的影响到底有多大 计算亿级别个数的累加和: 单线程模型运行程序&#…

SNMP(二)

♥️作者:小刘在C站 ♥️每天分享云计算网络运维课堂笔记,一起努力,共赴美好人生! ♥️夕阳下,是最美的,绽放。 目录 一.SNMP是什么 二.SolarWinds 网管软件使用 步骤1 步骤2 步骤3 步骤4 三.SNMP命令…

使用go pprof进行golang程序内存分析

引言 日常项目,有时会出现oom的情况,这时候我们光依靠code review进行问题定位是很困难的。这里我们需要一个排查工具,来定位是哪里的代码导致内存溢出的,这个工具就是pprof前提 如果是非http(s)服务类的,需要在代码…

基于PHP+MySQL的宠物领养救助社交网站

当前很多的宠物被抛弃和虐杀,它们没有选择权,我们强制性的把狗带进人类的生活中,然后又无情的抛弃,让它们无家可归,变成流浪狗,它们做错了什么?流浪动物被主人遗弃之后居无定所,时刻面对着严寒、酷暑、生病、死亡,饥饿、等一系列威胁它们生命的存在为了能够让这些。…

BlenderGIS插件 城市建筑3D模型自动生成 教程

目录 一、下载Blender和BlenderGIS 二、解决 No imaging library...报错 三、生成城市3D模型 四、导出模型 本文所需文件可在如下链接下载,或者直接按照博文下载步骤下载 https://download.csdn.net/download/ChaoChao66666/87071901?spm1001.2014.3001.550…

Node的Web编程

一、node的事件处理 1、node采用的事件驱动模式来进行事件处理的:只有当事件被触发时才执行相关程序 2、node是单线程运行的:采用事件轮询方式,不断的查询事件队列中的消息,然后根据消息执行对应的回调函数 3、node事件机制中的…

ASEMI代理艾赛斯DSP25-12A,整流二极管DSP25-12A

编辑-Z 艾赛斯整流二极管DSP25-12A参数: 型号:DSP25-12A 最大重复反向阻断电压(VRRM):1200V 反向电流、漏极电流(IR):40uA 正向电压降(VF):1…

this用法总结

文章目录1.常规下this的指向1.1 全局环境中的this1.2 上下文对象调用中的this1.3 this指向绑定事件的元素1.4 箭头函数的this指向2. 改变this指向2.1 call - Function.prototype.call( )2.1.1 call的第一个参数2.1.2 call接受多个参数2.1.3 调用对象的原生方法2.2 apply - Func…