国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

大橋石化集團(tuán)網(wǎng)站誰(shuí)做的網(wǎng)絡(luò)廣告代理

大橋石化集團(tuán)網(wǎng)站誰(shuí)做的,網(wǎng)絡(luò)廣告代理,上門做網(wǎng)站公司,個(gè)人備案企業(yè)網(wǎng)站shigen堅(jiān)持更新文章的博客寫手,擅長(zhǎng)Java、python、vue、shell等編程語(yǔ)言和各種應(yīng)用程序、腳本的開發(fā)。記錄成長(zhǎng),分享認(rèn)知,留住感動(dòng)。 個(gè)人IP:shigen 背景 一直以來的想法比較多,然后就用Python編寫各種代碼腳本。很多…

shigen堅(jiān)持更新文章的博客寫手,擅長(zhǎng)Java、python、vue、shell等編程語(yǔ)言和各種應(yīng)用程序、腳本的開發(fā)。記錄成長(zhǎng),分享認(rèn)知,留住感動(dòng)。
個(gè)人IP:shigen

背景

一直以來的想法比較多,然后就用Python編寫各種代碼腳本。很多的腳本都是通過Python的Flask框架實(shí)現(xiàn),如[file-server],然后部署到云服務(wù)器。但是這樣只提供一個(gè)端口就可以通過http訪問,無異于在互聯(lián)網(wǎng)上裸奔。而且這樣的服務(wù)有很多個(gè),一直在想如何實(shí)現(xiàn)一個(gè)統(tǒng)一認(rèn)證然后就可以訪問這么多的服務(wù)。在Java領(lǐng)域最常見的設(shè)計(jì)就是使用微服務(wù)架構(gòu),把每個(gè)服務(wù)拆分出來,然后通過網(wǎng)關(guān)統(tǒng)一攔截、驗(yàn)證、分發(fā)流量。蹭了一張架構(gòu)圖(發(fā)現(xiàn)飛書的模板已經(jīng)很好了):

微服務(wù)架構(gòu)設(shè)計(jì)

那我的Python服務(wù)為什么不能設(shè)計(jì)成微服務(wù)架構(gòu)呢,當(dāng)然,還沒聽說過誰(shuí)家的Python服務(wù)是微服務(wù)架構(gòu)的,姑且一試。

代碼實(shí)現(xiàn)

考慮到大家的技術(shù)棧就是Java,以下的python代碼將省略部分細(xì)節(jié)。

有了之前python flask如何注冊(cè)到nacos踩坑的經(jīng)驗(yàn),這次明顯順利的多了。現(xiàn)在本地搭建nacos環(huán)境,并支持http訪問,推薦docker-compose的方式搭建:shigen/spring-cloud-platform

因?yàn)槲业腘acos版本是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

于是就使用的是官方的API:Open API 指南

我的服務(wù)模塊是這樣細(xì)分的:

microservices-demo/
├── nacos/
├── api-gateway/
│   └── app.py
├── user-service/
│   └── app.py
├── auth-service/
│   └── app.py
└── document-service/└── app.py

也就是分成了四個(gè)模塊:網(wǎng)關(guān)、用戶中心、鑒權(quán)中心、文檔中心。接下來就是服務(wù)的注冊(cè)和調(diào)用。我們以最簡(jiǎn)單的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"# 發(fā)送到Nacos服務(wù)注冊(cè)接口
def register_service():payload = {"serviceName": SERVICE_NAME,"ip": SERVICE_IP,"port": SERVICE_PORT,"namespaceId": NAMESPACE,}response = requests.post(f"{NACOS_URL}", params=payload)# 每5秒發(fā)送一次心跳
def send_heartbeat():while True:payload = {"serviceName": SERVICE_NAME,"ip": SERVICE_IP,"port": SERVICE_PORT,"namespaceId": NAMESPACE,}response = requests.put(f"{NACOS_URL}/beat", params=payload)time.sleep(5)# 密碼驗(yàn)證,獲得token
@app.route('/auth', methods=['POST'])
def authenticate():pass# 驗(yàn)證token
@app.route('/verify', methods=['POST'])
def verify_token():pass# 服務(wù)啟動(dòng)類
if __name__ == '__main__':register_service()heartbeat_thread = threading.Thread(target=send_heartbeat)heartbeat_thread.daemon = Trueheartbeat_thread.start()app.run(port=SERVICE_PORT)

不用嘗試讀懂代碼,很簡(jiǎn)單:在服務(wù)啟動(dòng)的時(shí)候注冊(cè)到nacos,完了就是定時(shí)的向nacos發(fā)送心跳。@app.route(‘/auth’, methods=[‘POST’])表示提供一個(gè)POST請(qǐng)求方式的/auth接口,然后啟動(dòng)服務(wù):

服務(wù)啟動(dòng)

服務(wù)啟動(dòng)成功之后,可以看到控制臺(tái)打印的日志信息。同時(shí)提供http訪問接口。測(cè)試的方式如下:

curl --location 'http://127.0.0.1:5002/auth' \
--header 'Content-Type: application/json' \
--data '{"username": "user","password": "pass"
}'

其他的幾個(gè)服務(wù)也如法炮制。最終Nacos服務(wù)注冊(cè)表如下:

在這里插入圖片描述

在網(wǎng)關(guān)這一塊可能稍微有一點(diǎn)區(qū)別,復(fù)習(xí)前面提到的網(wǎng)關(guān)的作用:流量的攔截和轉(zhuǎn)發(fā)、認(rèn)證攔截、負(fù)載均衡…這里我的網(wǎng)關(guān)服務(wù)設(shè)計(jì)如下:

NACOS_URL = os.getenv("NACOS_URL", "http://localhost:8848/nacos/v1/ns/instance")
NAMESPACE = "python"def 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 f"http://{service['ip']}:{service['port']}"# 這里是本機(jī)調(diào)用測(cè)試return f"http://localhost:{service['port']}"except Exception as e:print(f"Error getting service URL: {e}")return None@app.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# 認(rèn)證邏輯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(method=request.method,url=url,headers={key: value for key,value in request.headers if key != 'Host'},data=request.get_data(),cookies=request.cookies,allow_redirects=False)return (response.content, response.status_code, response.headers.items())if __name__ == '__main__':app.run(port=8080)

這里其實(shí)就是請(qǐng)求來了之后,從nacos上拉取服務(wù)列表。這個(gè)服務(wù)列表就是服務(wù)名稱和對(duì)應(yīng)的服務(wù)所在機(jī)器的IP(service-name和對(duì)應(yīng)的IP集合)。然后選取對(duì)應(yīng)服務(wù)所在的機(jī)器之一作為目標(biāo)機(jī)器(這里選用的是第一臺(tái)機(jī)器),從請(qǐng)求頭中獲得token,進(jìn)行驗(yàn)證和調(diào)用。token校驗(yàn)失敗則打給認(rèn)證服務(wù),重新進(jìn)行登錄驗(yàn)證。為此,我還對(duì)比了一下Spring Cloud + Nacos的設(shè)計(jì):

在這里插入圖片描述

Nacos的API實(shí)現(xiàn)的是springframework.cloud.client.discovery的接口,意味著統(tǒng)一的標(biāo)準(zhǔn):

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 List<ServiceInstance> 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 List<String> getServices() {try {return serviceDiscovery.getServices();}catch (Exception e) {log.error("get service name from nacos server fail,", e);return Collections.emptyList();}}}

其中的serviceName和serviceId其實(shí)是同一概念,意味著我們可以通過服務(wù)名獲得全部的部署服務(wù)的實(shí)例信息,實(shí)現(xiàn)自定義的負(fù)載均衡調(diào)用。這里的原理和我直接從Nacos的API中獲得服務(wù)列表,默認(rèn)選取第一臺(tái)機(jī)器進(jìn)行調(diào)用的設(shè)計(jì)如出一轍。

對(duì)于以上的Python代碼段,可能文字描述有不詳細(xì)或者不當(dāng)之處,借助魔法進(jìn)行進(jìn)一步的完善:

這段代碼實(shí)現(xiàn)了一個(gè)反向代理服務(wù)器,其主要功能是根據(jù)服務(wù)名稱將請(qǐng)求轉(zhuǎn)發(fā)到不同的服務(wù),并在轉(zhuǎn)發(fā)前進(jìn)行認(rèn)證。具體功能如下:

  1. 服務(wù)發(fā)現(xiàn):代碼通過訪問 NACOS(一個(gè)服務(wù)發(fā)現(xiàn)和配置管理平臺(tái))來獲取目標(biāo)服務(wù)的 URL。NACOS 提供了服務(wù)注冊(cè)和發(fā)現(xiàn)的功能,代碼中通過 get_service_url(service_name) 函數(shù)實(shí)現(xiàn)這一功能。
  2. 請(qǐng)求轉(zhuǎn)發(fā):當(dāng)接收到一個(gè)請(qǐng)求時(shí),根據(jù) URL 中的 service_name 和 path,代碼會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到相應(yīng)的目標(biāo)服務(wù)。轉(zhuǎn)發(fā)時(shí),保留了原始請(qǐng)求的 HTTP 方法、頭信息、數(shù)據(jù)和 cookies。
  3. 認(rèn)證檢查:對(duì)于非 auth-service 的請(qǐng)求,代碼會(huì)檢查請(qǐng)求頭中是否包含 Authorization token。如果沒有 token 或 token 無效,則會(huì)返回錯(cuò)誤響應(yīng)。具體步驟如下:
    1. 檢查請(qǐng)求頭中是否包含 Authorization token。
    2. 如果沒有 token,返回 401 錯(cuò)誤(未授權(quán))。
    3. 如果有 token,向認(rèn)證服務(wù)(auth-service)發(fā)送請(qǐng)求,驗(yàn)證 token 的有效性。
    4. 如果 token 無效,返回 401 錯(cuò)誤。
  4. 錯(cuò)誤處理:代碼包含了基本的錯(cuò)誤處理邏輯,例如當(dāng)服務(wù) URL 無法獲取或認(rèn)證服務(wù)不可用時(shí),返回相應(yīng)的錯(cuò)誤響應(yīng)。

通過這些功能,該反向代理服務(wù)器能夠在微服務(wù)架構(gòu)中充當(dāng)中間層,路由請(qǐng)求并提供統(tǒng)一的認(rèn)證機(jī)制。

這樣下來,我們調(diào)用服務(wù)只需要直接走網(wǎng)關(guān)了,其它的服務(wù)端口也不用放行,極大程度上保證了數(shù)據(jù)的安全。此時(shí),我們需要這樣調(diào)用服務(wù):

登錄

curl --location 'http://127.0.0.1:8080/auth-service/auth' \
--header 'Content-Type: application/json' \
--data '{
"username": "user",
"password": "pass"
}'

服務(wù)調(diào)用

curl --location 'http://127.0.0.1:8080/document-service/documents' \
--header 'Authorization: xxx'

總結(jié)

之前微服務(wù)的開發(fā)中,可能我們借助Spring Cloud部分組件、Nacos,在項(xiàng)目中加上依賴配置,稍微改一下配置文件,服務(wù)就可以正常的調(diào)用了。其中依賴的SDK如何的工作,可能只是停留在理論上,缺少實(shí)操。這次的這個(gè)案例很好的展示Python+Nacos如何實(shí)現(xiàn)微服務(wù),并從中細(xì)解微服務(wù)結(jié)構(gòu)和服務(wù)之間的調(diào)用原理。是不是覺得Nacos其實(shí)也不過如此哈,沒什么牛掰、獨(dú)特之處,其實(shí)都是草臺(tái)班子。

與shigen一起,每天不一樣!

http://aloenet.com.cn/news/37718.html

相關(guān)文章:

  • 安慶懷寧網(wǎng)站建設(shè)兼職seo下載站
  • 重慶高端網(wǎng)站建設(shè)公司最新黑帽seo培訓(xùn)
  • 企業(yè)網(wǎng)站建設(shè)中期報(bào)告模板微商軟文推廣平臺(tái)
  • 怎么做網(wǎng)站兼容性測(cè)試發(fā)布軟文廣告
  • 網(wǎng)站公安備案需要多久個(gè)人網(wǎng)站模板
  • 一起裝修網(wǎng)官方網(wǎng)站單詞優(yōu)化和整站優(yōu)化
  • 專注高端網(wǎng)站建設(shè)seo 專業(yè)
  • 可以制作網(wǎng)站的軟件seo交流qq群
  • 鎮(zhèn)江網(wǎng)站優(yōu)化電商seo是什么意思
  • 怎么根據(jù)網(wǎng)站做二維碼seo精華網(wǎng)站
  • wordpress VIP系統(tǒng)愛站網(wǎng)seo工具包
  • 電子商務(wù)是什么職業(yè)福州seo優(yōu)化
  • 做網(wǎng)站服務(wù)商新鄉(xiāng)網(wǎng)絡(luò)推廣外包
  • 做網(wǎng)站被騙預(yù)付款怎么辦廣州推廣工具
  • 委托網(wǎng)絡(luò)公司做的網(wǎng)站侵權(quán)關(guān)鍵詞優(yōu)化是怎么弄的
  • 上海正規(guī)做網(wǎng)站公司有哪些網(wǎng)站免費(fèi)建站app
  • 在網(wǎng)站上顯示地圖網(wǎng)站推廣途徑和要點(diǎn)
  • 網(wǎng)站建設(shè) 網(wǎng)站軟文推廣sq網(wǎng)站推廣
  • 希臘網(wǎng)站 后綴網(wǎng)絡(luò)營(yíng)銷競(jìng)價(jià)推廣
  • php做視頻網(wǎng)站附近的計(jì)算機(jī)培訓(xùn)班
  • 鄭州做網(wǎng)站找哪家seo網(wǎng)站優(yōu)化培訓(xùn)
  • 編寫網(wǎng)站用什么語(yǔ)言色盲測(cè)試圖數(shù)字
  • 網(wǎng)監(jiān)大隊(duì)讓網(wǎng)站備案搜索引擎優(yōu)化方法與技巧
  • 12306網(wǎng)站如何做火車票候補(bǔ)宣傳渠道有哪些
  • 女人做春夢(mèng)網(wǎng)站哈爾濱網(wǎng)站推廣
  • 浙江省住房和城鄉(xiāng)建設(shè)廳網(wǎng)站 文件信息流廣告文案
  • wordpress更新的文章編輯器不好用手機(jī)優(yōu)化軟件哪個(gè)好用
  • 網(wǎng)站推廣網(wǎng)電商網(wǎng)站對(duì)比
  • 做網(wǎng)站需要買服務(wù)器嗎seo的中文是什么
  • 有沒有什么做統(tǒng)計(jì)的網(wǎng)站愛站數(shù)據(jù)