孤弋 2025-10-10 08:31 浙江
这是2025年的第112篇文章
( 本文阅读时间:15分钟 )
nacos 的 nacos-serving-python 项目。本文将介绍一种全新的Python微服务解决方案,让Python应用能够以真正Pythonic的方式迈向微服务架构。01

💡 Pythonic微服务理念:文章强调在微服务架构中,Pythonic不仅指代码风格,更代表着代码的可读性、简洁性和明确性。nacos-serving-python致力于实现无侵入性、低门槛和高灵活性的微服务解决方案,让Python开发者能以更自然的方式构建微服务,避免了对现有代码结构的破坏和陡峭的学习曲线。
🚀 低侵入式服务发现:该项目为Python开发者提供了在不修改核心业务逻辑的情况下,实现服务发现的便捷方式。通过适配requests、httpx、aiohttp和urllib等流行HTTP客户端,仅需改变导入语句,即可让HTTP请求自动解析服务名并进行负载均衡,大幅简化了服务间通信的配置和管理。
🔌 三种自动化服务注册方式:为了覆盖不同场景,nacos-serving-python提供了三种不同侵入级别的注册方式。CLI启动器适用于改造现有应用,实现零代码侵入;Import触发器通过简单的import语句即可启用注册,对新项目非常友好;而WSGI/ASGI中间件则为需要精细控制的应用提供了最大的灵活性,允许开发者在任意阶段注入Nacos中间件。
🌐 微服务治理的未来展望:nacos-serving-python不仅解决了服务注册与发现的问题,还计划集成更多微服务治理能力,如优雅上下线、同可用区路由、金丝雀发布等。这表明项目致力于构建一个更全面、更强大的Python微服务生态系统,并欢迎开发者社区的参与和贡献。
孤弋 2025-10-10 08:31 浙江
这是2025年的第112篇文章
( 本文阅读时间:15分钟 )
nacos 的 nacos-serving-python 项目。本文将介绍一种全新的Python微服务解决方案,让Python应用能够以真正Pythonic的方式迈向微服务架构。01
1.1 什么是Pythonic?
1.2 微服务时代的Python困境
1.3 Java世界的无侵入体验
// 服务注册与发现publicclassApplication {publicstaticvoidmain(String[ ] args){SpringApplication.run(Application.class, args);}}// 配置自动更新publicclassConfigController {("${useLocalCache:false}")private boolean useLocalCache;}
这种无侵入的设计理念正是我们希望在Python世界中所希望获得的。02
低侵入的服务发现策略
2.1 开发者使用示例
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 requestsdef get_user_info_new(user_id):# 直接使用服务名,自动服务发现和负载均衡response = requests.get(f"http://user-service/api/users/{user_id}")return response.json()
目前支持的 Python HTTP 客户端:from nacos.auto.discovery.ext import requestshttpx: from nacos.auto.discovery.ext.httpx import AsyncClientaiohttp: from nacos.auto.discovery.ext.aiohttp import get_sessionurllib: from nacos.auto.discovery.ext.urllib import urlopen2.2 技术原理阐述
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 directlyifnot service_name:return urltry:# Get service instance (黑名单过滤在服务发现类的_select_instance方法中处理)instance = self.service_discovery.get_instance_sync(service_name, strategy=strategy)# Replace host and portreturn self._replace_host_port(parsed_url, instance.ip, instance.port)except NoAvailableInstanceError as e:# Raise exception if no available instancelogger.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.yamlnacos:server: "127.0.0.1:8848"namespace: "public"discovery:# 是否启用空地址保护 (如果没有实例则不更新本地服务地址列表,默认 True)empty_protection: true
03
三种低侵入的自动注册方式
nacos-serving-python 提供了三种侵入性由浅入深的服务注册方式,覆盖从存量应用改造到新应用开发的全场景。3.1 注册方式一: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,伪代码如下:def run():# 1. 探测 Web 框架app = detect_framework_app() # 目前支持 Flask / FastAPI / Django 三种流行的框架# 2. 注入 Middleware,在 Middleware 中,完成 Nacos 的微服务注册inject_middleware(app)# 3. 等待并监听loop_forever()# __main__.pyif __name__ == '__main__':run()
3.2 注册方式二:Import触发器(极低侵入)
原理阐述Import 触发器利用 Python 的 import 机制和框架探测技术,先将 内置的 import 函数进行替换,替换之后在判断导入的模块是否为# 在Flask应用入口文件顶部添加一行importimport nacos.auto.registration.enabledfrom flask import Flaskapp = Flask(__name__)def get_users():return {"users": ["Alice", "Bob", "Charlie"]}if __name__ == '__main__':app.run(host='0.0.0.0', port=8080)
flast/fastapi/django,如果是则注入上面章节描述的 Middleware:# nacos/auto/registration/enabled.py 模块导入时执行def enable(self):"""Enable import hook"""# Save original __import__ functionself.original_import = __builtins__['__import__']# Replace __import__ function__builtins__['__import__'] = self._hooked_importlogger.info("Import hook enabled for Nacos auto-registration")def _hooked_import(self, name, **kwargs):"""Hooked import function"""# Call original import functionmodule = self.original_import(name, **kwargs)# Check if it's a web framework moduleif self._should_hook_module(name, module):self._inject_into_module(name, module)returnmodule
3.3 注册方式三: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_middlewareapp = inject_wsgi_middleware(app)# 再启动应用程序app.run(host='0.0.0.0', port=8081)
原理阐述WSGI中间件的核心原理比较简单,可以由开发者随意定制注入的位置,是三种方式中最为灵活的方式。3.4 三种注册方式对比
04
nacos-serving-python 的出现,则可以 让 MCP 与存量的微服务应用的通信更为原生,参考下图:站在微服务的角度,我们接下来将提供更多的服务治理能力,当前的版本中我们集成了空地址保护能力,在微服务应用托管平台EDAS中,微服务治理还包括 优雅上下线、同可用区路由、金丝雀发布 等等,这些我们都会在接下来的版本中实现,如对这些功能有诉求,请加入钉群(群号: 21958624)与我们的开发者沟通。 欢迎访问GitHub仓库参与贡献和讨论:https://github.com/nacos-group/nacos-serving-python/欢迎留言一起参与讨论~
AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。
鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑