超链接到网站怎么做视频文件下载,html网页框架代码,青岛网上房地产,个人博客网站需要备案吗shigen坚持更新文章的博客写手#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长#xff0c;分享认知#xff0c;留住感动。 个人IP#xff1a;shigen 背景
一直以来的想法比较多#xff0c;然后就用Python编写各种代码脚本。很多… shigen坚持更新文章的博客写手擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长分享认知留住感动。 个人IPshigen 背景
一直以来的想法比较多然后就用Python编写各种代码脚本。很多的脚本都是通过Python的Flask框架实现如[file-server]然后部署到云服务器。但是这样只提供一个端口就可以通过http访问无异于在互联网上裸奔。而且这样的服务有很多个一直在想如何实现一个统一认证然后就可以访问这么多的服务。在Java领域最常见的设计就是使用微服务架构把每个服务拆分出来然后通过网关统一拦截、验证、分发流量。蹭了一张架构图发现飞书的模板已经很好了 那我的Python服务为什么不能设计成微服务架构呢当然还没听说过谁家的Python服务是微服务架构的姑且一试。
代码实现 考虑到大家的技术栈就是Java以下的python代码将省略部分细节。 有了之前python flask如何注册到nacos踩坑的经验这次明显顺利的多了。现在本地搭建nacos环境并支持http访问推荐docker-compose的方式搭建shigen/spring-cloud-platform
因为我的Nacos版本是2.0的官方的nacos-sdk-python是这样描述的 Supported Python version Python 2.7 Python 3.6 Python 3.7 Supported Nacos version Nacos 0.8.0 ~ 1.3.2 于是就使用的是官方的APIOpen API 指南
我的服务模块是这样细分的
microservices-demo/
├── nacos/
├── api-gateway/
│ └── app.py
├── user-service/
│ └── app.py
├── auth-service/
│ └── app.py
└── document-service/└── app.py也就是分成了四个模块网关、用户中心、鉴权中心、文档中心。接下来就是服务的注册和调用。我们以最简单的auth-service为例
NACOS_URL os.getenv(NACOS_URL, http://localhost:8848/nacos/v1/ns/instance)
SERVICE_NAME auth-service
SERVICE_IP socket.gethostbyname(socket.gethostname())
SERVICE_PORT 5002
NAMESPACE python# 发送到Nacos服务注册接口
def register_service():payload {serviceName: SERVICE_NAME,ip: SERVICE_IP,port: SERVICE_PORT,namespaceId: NAMESPACE,}response requests.post(f{NACOS_URL}, paramspayload)# 每5秒发送一次心跳
def send_heartbeat():while True:payload {serviceName: SERVICE_NAME,ip: SERVICE_IP,port: SERVICE_PORT,namespaceId: NAMESPACE,}response requests.put(f{NACOS_URL}/beat, paramspayload)time.sleep(5)# 密码验证获得token
app.route(/auth, methods[POST])
def authenticate():pass# 验证token
app.route(/verify, methods[POST])
def verify_token():pass# 服务启动类
if __name__ __main__:register_service()heartbeat_thread threading.Thread(targetsend_heartbeat)heartbeat_thread.daemon Trueheartbeat_thread.start()app.run(portSERVICE_PORT)不用尝试读懂代码很简单在服务启动的时候注册到nacos完了就是定时的向nacos发送心跳。app.route(‘/auth’, methods[‘POST’])表示提供一个POST请求方式的/auth接口然后启动服务 服务启动成功之后可以看到控制台打印的日志信息。同时提供http访问接口。测试的方式如下
curl --location http://127.0.0.1:5002/auth \
--header Content-Type: application/json \
--data {username: user,password: pass
}其他的几个服务也如法炮制。最终Nacos服务注册表如下 在网关这一块可能稍微有一点区别复习前面提到的网关的作用流量的拦截和转发、认证拦截、负载均衡…这里我的网关服务设计如下
NACOS_URL os.getenv(NACOS_URL, http://localhost:8848/nacos/v1/ns/instance)
NAMESPACE pythondef get_service_url(service_name):try:response requests.get(f{NACOS_URL}/list?serviceName{service_name}namespaceId{NAMESPACE})data response.json()if data and data[hosts]:service data[hosts][0]# return fhttp://{service[ip]}:{service[port]}# 这里是本机调用测试return fhttp://localhost:{service[port]}except Exception as e:print(fError getting service URL: {e})return Noneapp.route(/service_name/path:path, methods[GET, POST, PUT, DELETE])
def proxy(service_name, path):service_url get_service_url(service_name)if not service_url:return jsonify({error: Service not found}), 404# 认证逻辑if service_name ! auth-service:token request.headers.get(Authorization)if not token:return jsonify({error: Missing token}), 401auth_url get_service_url(auth-service)if not auth_url:return jsonify({error: Auth service not found}), 500verify_response requests.post(f{auth_url}/verify, json{token: token})if verify_response.status_code ! 200:return jsonify({error: Invalid token}), 401url f{service_url}/{path}response requests.request(methodrequest.method,urlurl,headers{key: value for key,value in request.headers if key ! Host},datarequest.get_data(),cookiesrequest.cookies,allow_redirectsFalse)return (response.content, response.status_code, response.headers.items())if __name__ __main__:app.run(port8080)这里其实就是请求来了之后从nacos上拉取服务列表。这个服务列表就是服务名称和对应的服务所在机器的IPservice-name和对应的IP集合。然后选取对应服务所在的机器之一作为目标机器这里选用的是第一台机器从请求头中获得token进行验证和调用。token校验失败则打给认证服务重新进行登录验证。为此我还对比了一下Spring Cloud Nacos的设计 Nacos的API实现的是springframework.cloud.client.discovery的接口意味着统一的标准
package com.alibaba.cloud.nacos.discovery;public class NacosDiscoveryClient implements DiscoveryClient {private static final Logger log LoggerFactory.getLogger(NacosDiscoveryClient.class);/*** Nacos Discovery Client Description.*/public static final String DESCRIPTION Spring Cloud Nacos Discovery Client;private NacosServiceDiscovery serviceDiscovery;public NacosDiscoveryClient(NacosServiceDiscovery nacosServiceDiscovery) {this.serviceDiscovery nacosServiceDiscovery;}Overridepublic String description() {return DESCRIPTION;}Overridepublic ListServiceInstance getInstances(String serviceId) {try {return serviceDiscovery.getInstances(serviceId);}catch (Exception e) {throw new RuntimeException(Can not get hosts from nacos server. serviceId: serviceId, e);}}Overridepublic ListString getServices() {try {return serviceDiscovery.getServices();}catch (Exception e) {log.error(get service name from nacos server fail,, e);return Collections.emptyList();}}}其中的serviceName和serviceId其实是同一概念意味着我们可以通过服务名获得全部的部署服务的实例信息实现自定义的负载均衡调用。这里的原理和我直接从Nacos的API中获得服务列表默认选取第一台机器进行调用的设计如出一辙。
对于以上的Python代码段可能文字描述有不详细或者不当之处借助魔法进行进一步的完善 这段代码实现了一个反向代理服务器其主要功能是根据服务名称将请求转发到不同的服务并在转发前进行认证。具体功能如下 服务发现代码通过访问 NACOS一个服务发现和配置管理平台来获取目标服务的 URL。NACOS 提供了服务注册和发现的功能代码中通过 get_service_url(service_name) 函数实现这一功能。请求转发当接收到一个请求时根据 URL 中的 service_name 和 path代码会将请求转发到相应的目标服务。转发时保留了原始请求的 HTTP 方法、头信息、数据和 cookies。认证检查对于非 auth-service 的请求代码会检查请求头中是否包含 Authorization token。如果没有 token 或 token 无效则会返回错误响应。具体步骤如下 检查请求头中是否包含 Authorization token。如果没有 token返回 401 错误未授权。如果有 token向认证服务auth-service发送请求验证 token 的有效性。如果 token 无效返回 401 错误。 错误处理代码包含了基本的错误处理逻辑例如当服务 URL 无法获取或认证服务不可用时返回相应的错误响应。 通过这些功能该反向代理服务器能够在微服务架构中充当中间层路由请求并提供统一的认证机制。
这样下来我们调用服务只需要直接走网关了其它的服务端口也不用放行极大程度上保证了数据的安全。此时我们需要这样调用服务
登录
curl --location http://127.0.0.1:8080/auth-service/auth \
--header Content-Type: application/json \
--data {
username: user,
password: pass
}服务调用
curl --location http://127.0.0.1:8080/document-service/documents \
--header Authorization: xxx总结
之前微服务的开发中可能我们借助Spring Cloud部分组件、Nacos在项目中加上依赖配置稍微改一下配置文件服务就可以正常的调用了。其中依赖的SDK如何的工作可能只是停留在理论上缺少实操。这次的这个案例很好的展示PythonNacos如何实现微服务并从中细解微服务结构和服务之间的调用原理。是不是觉得Nacos其实也不过如此哈没什么牛掰、独特之处其实都是草台班子。
与shigen一起每天不一样