微服务架构原理与治理实践 | 青训营

112 阅读2分钟

微服务架构原理与治理实践

微服务架构原理及特征

基本概念

  • 服务:一组具有相同逻辑(运行同一个代码)的运行实体(实例)
  • 实例:一个服务中,每个运行实体就是一个实例
  • 实例与进程的关系:实例与进程之间没有必然的对应关系,可以一个实例包含多个进程(反之不常见)
  • 集群:通常指服务内部的逻辑划分,包括多个实例
  • 常见的实例承载形式:进程、VM、k8spod
  • 有状态/无状态服务:服务的实例是否存储了可持久化的数据(例如磁盘文件)
  • 服务间通信意味着网络传输

服务注册及发现

image.png

流量特征

image.png

核心服务治理功能

服务发布

服务发布是指让一个服务升级运行新代码的过程。 服务发布的难点有:服务不可用,服务抖动,服务回滚

蓝绿部署

有两个集群,交替升级,这种方案简单稳定,但是需要两倍资源,适合在流量低的时候完成

灰度发布(金丝雀发布)

先上线一部分,然后再上线所有。这个最大的挑战是需要不停地切换节点,并且回滚困难

流量治理

在微服务架构下,可以基于地区、集群、实例、请求等维度,对端到端流量的路由路径进行精细化控制

image.png

负载均衡

负责分配请求在每个下游实例上的分布,常见的策略:RoundRobin、Random、RingHash

稳定性治理

线上服务总是会出问题的,这与程序的正确性无关。比如网络攻击、流量突增、机房断电、光纤被挖、机器故障、网络故障、机房空调故障。微服务中典型的稳定性治理功能:限流、熔断、过载保护、降级。

image.png

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)