Nacos-serving-python为Python应用带来Java般无侵入的微服务注册与发现体验,让Pythonic方式融入微服务架构,解决传统痛点。
原文标题:开源|Python 应用往微服务迈进的 1*3 种 Pythonic 步伐
原文作者:阿里云开发者
冷月清谈:
该方案遵循Pythonic哲学,强调代码无侵入性、低门槛和高灵活性。它首先通过低侵入的服务发现策略,允许开发者仅需修改HTTP客户端的导入语句(例如将`import requests`替换为`from nacos.auto.discovery.ext import requests`),即可自动获得服务发现和负载均衡能力,支持包括requests、httpx等主流客户端。其核心是智能URL拦截器,能在请求发出前解析服务名并替换为具体的实例地址。
其次,项目提供了**三种灵活的服务注册方式**以适应不同场景:
1. **CLI启动器(零侵入)**:适用于现有Flask、Django项目,通过命令行包装启动,自动探测框架并注入Nacos注册中间件,无需修改代码。
2. **Import触发器(极低侵入)**:适用于新项目,在入口文件顶部添加一行`import nacos.auto.registration.enabled`,利用Python的`import`机制自动完成框架探测和中间件注入。
3. **WSGI/ASGI中间件(精细控制)**:为需要进行复杂初始化后再注册的场景提供,开发者可手动选择注入Nacos中间件的时机,具有最高的灵活性。
这些机制的引入,让Python应用在Nacos生态中能够享受到类似Java Spring Cloud的便捷体验,显著降低了Python微服务化的门槛。未来,`nacos-serving-python`还将集成更多企业级服务治理能力,如优雅上下线、同可用区路由和金丝雀发布等,进一步完善Python微服务生态。
怜星夜思:
2、提到Java有Spring Cloud的成熟生态,那Python这边除了这个新出的Nacos集成方案,大家平时在搞微服务的时候,一般都会选择哪些技术栈或者框架呢?有没有其他比较流行的Python微服务实践方案可以分享下?
3、文章里提到将来会支持更多服务治理能力,比如优雅上下线、金丝雀发布啥的。这些功能对于一个Python微服务想在生产环境跑起来到底有多重要?大家觉得除了这些,还有哪些服务治理能力是 Python 微服务生态特别需要补齐的?或者说,大家在实际落地 Python 微服务时,最看重、最头疼的是哪些方面?
原文内容
在微服务架构占据信息系统应用架构主流的当下,Java语言体系凭借Spring Cloud等成熟生态占据主导地位,而Python开发者却常常面临一个尴尬局面:要么接受繁重的侵入式编码,要么放弃微服务的诸多优势。
作为一名Python开发者,Java生态中那种优雅的无侵入式服务注册与发现往往令人生羡,只需几个注解,Spring Cloud便能轻松完成服务注册、配置刷新和服务发现。为了将这样的体验带到Python的世界,我们开发并开源了基于 nacos 的 nacos-serving-python 项目。
本文将介绍一种全新的Python微服务解决方案,让Python应用能够以真正Pythonic的方式迈向微服务架构。
一、Pythonic哲学与微服务架构的融合
什么是Pythonic?
Pythonic 不仅仅意味着遵循PEP8规范,更代表着 Readability counts 、Simple is better than complex 、Explicit is better than implicit 等核心理念。在微服务语境下,Pythonic 则意味着:
-
无侵入性:不破坏现有代码结构
-
低门槛:快速上手,学习曲线平缓
-
灵活性:适应不同框架和场景需求
微服务时代的Python困境
Python在Web开发、数据分析、AI等领域占据重要地位,但在微服务架构中却面临诸多挑战:
1. 服务注册通常需要手动处理,缺乏自动机制;
2. 服务发现往往依赖硬编码或外部负载均衡器;
3. 配置管理难以动态更新,需要重启应用;
Java世界的无侵入体验
在国内的 Java 生态中,借助 Spring Cloud Alibaba,开发者只需简单注解即可实现完整的微服务功能:
// 服务注册与发现 @EnableDiscoveryClient @SpringBootApplication publicclassApplication {publicstaticvoidmain(String args){
SpringApplication.run(Application.class, args);
}
}// 配置自动更新
@RestController
@RefreshScope
publicclassConfigController {
@Value(“${useLocalCache:false}”)
private boolean useLocalCache;
}
这种无侵入的设计理念正是我们希望在Python世界中所希望获得的。
二、低侵入的服务发现策略
开发者使用示例
nacos-serving-python为流行的HTTP客户端提供了低成本的服务发现功能,让开发者只需要修改导入的包即可享受服务发现的好处。
# 传统方式(硬编码IP和端口) import requestsdef get_user_info_old(user_id):
response = requests.get(f"http://192.168.1.100:8080/api/users/{user_id}")
return response.json()服务发现方式(只需改变import语句)
from nacos.auto.discovery.ext import requests
def get_user_info_new(user_id):
# 直接使用服务名,自动服务发现和负载均衡
response = requests.get(f"http://user-service/api/users/{user_id}")
return response.json()
目前支持的 Python HTTP 客户端:
-
requests:
from nacos.auto.discovery.ext import requests -
httpx:
from nacos.auto.discovery.ext.httpx import AsyncClient -
aiohttp:
from nacos.auto.discovery.ext.aiohttp import get_session -
urllib:
from nacos.auto.discovery.ext.urllib import urlopen
技术原理阐述
URL 拦截与路由转换
服务发现功能的核心是一个智能拦截器,它在HTTP请求发出前进行拦截和转换:
def resolve_url(self, url: str,
strategy: LoadBalanceStrategy = LoadBalanceStrategy.ROUND_ROBIN) -> str:
service_name, parsed_url = self._parse_url(url)
# If not a service URL, return directly
ifnot service_name:
return url
try:
# Get service instance (黑名单过滤在服务发现类的_select_instance方法中处理)
instance = self.service_discovery.get_instance_sync(service_name, strategy=strategy)
# Replace host and port
return self._replace_host_port(parsed_url, instance.ip, instance.port)
except NoAvailableInstanceError as e:
# Raise exception if no available instance
logger.error(f"No available instance for service '{service_name}': {e}")
raise
HTTP 客户端适配
客户端的适配比较简单,主要是在 nacos.auto.discovery.ext 的包下,做了各个客户端的适配,将原有的客户端替换成了带服务发现能力的客户端,以 requests 包举例如下:
def request(method, url, **kwargs): with _create_service_discovery_client() as client: return client.request(method, url, **kwargs)def get(url, **kwargs):
“”“GET request with service discovery”“”
returnrequest(‘GET’, url, **kwargs)
all = [“get”, “request”, …]
配置驱动的服务发现
在工程目录下放置 nacos.yaml,通过配置文件即可启用服务发现功能,无需代码修改:
# nacos.yaml
nacos:
server: "127.0.0.1:8848"
namespace: "public"
discovery:
# 是否启用空地址保护 (如果没有实例则不更新本地服务地址列表,默认 True)
empty_protection: true
三、三种低侵入的自动注册方式
nacos-serving-python 提供了三种侵入性由浅入深的服务注册方式,覆盖从存量应用改造到新应用开发的全场景。
注册方式一:CLI启动器(零侵入)
开发者举例
对于已经在线上稳定运行的Flask或Django项目,CLI启动器提供了零代码侵入的改造方案:
# 原来的启动命令 python app.py使用nacos CLI包装启动
python -m nacos.auto.registration
--nacos-server 127.0.0.1:8848
--service-name user-service
--service-port 8000
app.py
原理阐述
CLI启动器的核心是"嗅探"所运行的 Web 框架,然后再注入 WSGI/ASGI Middleware,伪代码如下:
注册方式二:Import触发器(极低侵入)
开发者举例
对于新开发的微服务项目,Import触发器提供了一种极其Pythonic的"显式声明"方式:
# 在Flask应用入口文件顶部添加一行import import nacos.auto.registration.enabledfrom flask import Flask
app = Flask(name)
@app.route(‘/api/users’)
def get_users():
return {“users”: [“Alice”, “Bob”, “Charlie”]}
if name == ‘main’:
app.run(host=‘0.0.0.0’, port=8080)
原理阐述
Import 触发器利用 Python 的 import 机制和框架探测技术,先将 内置的 import 函数进行替换,替换之后在判断导入的模块是否为 flast/fastapi/django,如果是则注入上面章节描述的 Middleware:
# nacos/auto/registration/enabled.py 模块导入时执行
def enable(self):
“”“Enable import hook”“”
# Save original import function
self.original_import = builtins[‘import’]
# Replace import function
builtins[‘import’] = self._hooked_import
logger.info(“Import hook enabled for Nacos auto-registration”)
def _hooked_import(self, name, **kwargs):
“”“Hooked import function”“”
# Call original import function
module = self.original_import(name, **kwargs)
# Check if it’s a web framework module
if self._should_hook_module(name, module):
self._inject_into_module(name, module)
returnmodule
注册方式三:WSGI/ASGI中间件(精细控制)
开发者举例
对于需要精细控制服务注册时机的高级场景:
from flask import Flaskapp = Flask(name)
执行复杂的初始化操作
initialize_database_pool()
initialize_redis_connection()
warm_up_cache()在一切准备就绪后,注入Nacos中间件
from nacos.auto.middleware.wsgi import inject_wsgi_middleware
app = inject_wsgi_middleware(app)再启动应用程序
app.run(host=‘0.0.0.0’, port=8081)
原理阐述
WSGI中间件的核心原理比较简单,可以由开发者随意定制注入的位置,是三种方式中最为灵活的方式。
三种注册方式对比
总结:Python微服务的未来之路
当前的 Python 语言主要以 AI 场景的开发为主,年初 MCP 的出现,为如何将 AI 能力与存量的微服务集群以数据管道的方式拉通,提供了更为标准的方式,nacos-serving-python 的出现,则可以 让 MCP 与存量的微服务应用的通信更为原生,参考下图:
站在微服务的角度,我们接下来将提供更多的服务治理能力,当前的版本中我们集成了空地址保护能力,在微服务应用托管平台EDAS中,微服务治理还包括 优雅上下线、同可用区路由、金丝雀发布 等等,这些我们都会在接下来的版本中实现,如对这些功能有诉求,请加入钉群(群号: 21958624)与我们的开发者沟通。
欢迎访问GitHub仓库参与贡献和讨论:https://github.com/nacos-group/nacos-serving-python/
企业级分布式应用服务 EDAS
企业级分布式应用服务EDAS(Enterprise Distributed Application Service)是一个应用PaaS平台,一站式集成微服务、可观测、任务调度等技术;以专业易用的应用全生命周期管理、流量及容量治理等功能,配合业务视角的验收、资源管控与成本优化能力,助力企业应用架构云原生化升级。
点击阅读原文查看详情。


