微服务架构原理与治理实践
微服务架构原理及特征
基本概念
- 服务:一组具有相同逻辑(运行同一个代码)的运行实体(实例)
- 实例:一个服务中,每个运行实体就是一个实例
- 实例与进程的关系:实例与进程之间没有必然的对应关系,可以一个实例包含多个进程(反之不常见)
- 集群:通常指服务内部的逻辑划分,包括多个实例
- 常见的实例承载形式:进程、VM、k8spod
- 有状态/无状态服务:服务的实例是否存储了可持久化的数据(例如磁盘文件)
- 服务间通信意味着网络传输
服务注册及发现
流量特征
核心服务治理功能
服务发布
服务发布是指让一个服务升级运行新代码的过程。 服务发布的难点有:服务不可用,服务抖动,服务回滚
蓝绿部署
有两个集群,交替升级,这种方案简单稳定,但是需要两倍资源,适合在流量低的时候完成
灰度发布(金丝雀发布)
先上线一部分,然后再上线所有。这个最大的挑战是需要不停地切换节点,并且回滚困难
流量治理
在微服务架构下,可以基于地区、集群、实例、请求等维度,对端到端流量的路由路径进行精细化控制
负载均衡
负责分配请求在每个下游实例上的分布,常见的策略:RoundRobin、Random、RingHash
稳定性治理
线上服务总是会出问题的,这与程序的正确性无关。比如网络攻击、流量突增、机房断电、光纤被挖、机器故障、网络故障、机房空调故障。微服务中典型的稳定性治理功能:限流、熔断、过载保护、降级。
python-flask 负载均衡
from flask import Flask, request
import requests
app = Flask(__name__)
# 服务器列表,这里假设有两台服务器
server_list = ['http://server1:5000', 'http://server2:5000']
current_server_index = 0
# Round Robin算法,轮询选择下一台服务器
def get_next_server():
global current_server_index
next_server = server_list[current_server_index]
current_server_index = (current_server_index + 1) % len(server_list)
return next_server
@app.route('/proxy', methods=['GET', 'POST'])
def proxy_request():
# 获取下一台服务器的地址
next_server = get_next_server()
# 将请求转发到下一台服务器
try:
response = requests.request(
method=request.method,
url=next_server + request.full_path,
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()
except Exception as e:
return str(e), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)