当前位置: 首页 > news >正文

通俗易懂 serverless 架构、微服务架构和云原生架构,并简单代码

文章目录

  • 1 serverless 架构、微服务架构和云原生架构区别
      • 1. Serverless 架构
        • 示例:AWS Lambda + API Gateway
      • 2. 微服务架构
        • 示例:Flask 微服务
      • 3. 云原生架构
        • 示例:Docker 和 Kubernetes
  • 2 Kubernetes 中管理多个副本和流量两个关键组件
      • 1. Deployment
      • 2. Service
      • 负载均衡
      • 流量管理

1 serverless 架构、微服务架构和云原生架构区别

别用代码示例展示 serverless 架构、微服务架构和云原生架构的基本实现。这些示例将展示如何在这三种架构下处理一个简单的 API 请求。

1. Serverless 架构

Serverless 架构允许你运行代码而无需管理服务器或基础设施,通常通过云服务平台(如 AWS Lambda、Azure Functions)来实现。

示例:AWS Lambda + API Gateway

假设我们要实现一个简单的 API,当用户访问该 API 时,Lambda 函数将返回一个 JSON 响应。

AWS Lambda 函数代码(Python)

import jsondef lambda_handler(event, context):# 解析请求体body = json.loads(event.get('body', '{}'))# 执行业务逻辑name = body.get('name', 'World')message = f"Hello, {name}!"# 返回响应return {'statusCode': 200,'body': json.dumps({'message': message}),'headers': {'Content-Type': 'application/json'}}

说明

  • 上述代码处理 HTTP 请求,并根据请求体中的 name 字段返回一个欢迎消息。
  • 通过 API Gateway 配置 Lambda 函数触发器来处理 HTTP 请求。

2. 微服务架构

微服务 架构将应用程序拆分为多个小的、独立的服务,每个服务独立部署并通过 API 进行通信。

示例:Flask 微服务

用户服务(Flask)

from flask import Flask, jsonify, requestapp = Flask(__name__)@app.route('/user/<user_id>', methods=['GET'])
def get_user(user_id):# 模拟获取用户数据user_data = {"user_id": user_id, "name": "John Doe"}return jsonify(user_data)if __name__ == '__main__':app.run(port=5000)

订单服务(Flask)

from flask import Flask, jsonify
import requestsapp = Flask(__name__)@app.route('/order/<order_id>', methods=['GET'])
def get_order(order_id):# 调用用户服务user_response = requests.get(f"http://localhost:5000/user/{order_id}")user_data = user_response.json()# 模拟订单数据order_data = {"order_id": order_id, "user": user_data, "total": 99.99}return jsonify(order_data)if __name__ == '__main__':app.run(port=5001)

说明

  • 用户服务 提供获取用户信息的 API。
  • 订单服务 通过调用 用户服务 的 API 获取用户信息,并返回订单数据。
  • 这两个服务分别运行在不同的端口上,并通过 HTTP 请求进行通信。

3. 云原生架构

云原生 架构通过容器化(如 Docker)、容器编排(如 Kubernetes)和微服务来实现高效的云计算。

示例:Docker 和 Kubernetes

Dockerfile

# 使用 Python 基础镜像
FROM python:3.9-slim# 设置工作目录
WORKDIR /app# 复制代码
COPY . /app# 安装依赖
RUN pip install flask requests# 运行服务
CMD ["python", "app.py"]

Kubernetes Deployment YAML

用户服务部署(user-service-deployment.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:name: user-service
spec:replicas: 3selector:matchLabels:app: user-servicetemplate:metadata:labels:app: user-servicespec:containers:- name: user-serviceimage: myrepo/user-service:latestports:- containerPort: 5000

Kubernetes Service YAML

用户服务服务(user-service-service.yaml)

apiVersion: v1
kind: Service
metadata:name: user-service
spec:selector:app: user-serviceports:- protocol: TCPport: 80targetPort: 5000

说明

  • Dockerfile 用于创建用户服务的 Docker 镜像。
  • Kubernetes Deployment 文件定义了如何在 Kubernetes 集群中部署 用户服务 的多个副本,并管理其生命周期。
  • Kubernetes Service 文件定义了如何通过集群内部的 DNS 名称访问 用户服务

这些代码示例展示了在不同架构下如何实现相同的功能。Serverless 架构侧重于无服务器计算,微服务架构侧重于服务的独立性和可扩展性,云原生架构侧重于容器和编排的高效性。

2 Kubernetes 中管理多个副本和流量两个关键组件

在 Kubernetes 中,管理多个副本和流量通常涉及两个关键组件:

  1. Deployment:负责管理多个副本的部署。
  2. Service:负责将流量均匀地分发到这些副本上。

下面我将详细解释如何使用这两个组件来实现多个副本和流量管理。

1. Deployment

Deployment 是 Kubernetes 的一种控制器,用于管理应用程序的副本,确保它们按照指定的副本数运行。Deployment 可以自动处理副本的滚动更新、回滚等操作。

示例:创建一个 Deployment

apiVersion: apps/v1
kind: Deployment
metadata:name: my-app
spec:replicas: 3  # 这里设置了3个副本selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-app-containerimage: myrepo/my-app:latestports:- containerPort: 80

解释

  • replicas: 3 指定了要运行的副本数量。
  • selector 确定哪些 Pod 属于这个 Deployment。
  • template 定义了 Pod 的模板,包括容器的镜像和端口。

2. Service

Service 是 Kubernetes 中的一种资源,用于暴露应用程序的端口,并将流量负载均衡到相应的 Pod 副本上。Service 可以通过多种类型进行配置,如 ClusterIP、NodePort 和 LoadBalancer。

示例:创建一个 Service

apiVersion: v1
kind: Service
metadata:name: my-app-service
spec:selector:app: my-appports:- protocol: TCPport: 80          # Service 对外暴露的端口targetPort: 80    # 实际 Pod 中容器的端口type: ClusterIP  # 默认类型,仅在集群内部可访问

解释

  • selector 匹配 Deployment 中定义的标签,指向相关的 Pod。
  • ports 映射了 Service 的端口到 Pod 中容器的端口。
  • type: ClusterIP 是默认设置,表示 Service 仅在集群内部可访问。如果需要外部访问,可以使用 NodePortLoadBalancer 类型。

负载均衡

当多个副本部署并通过 Service 暴露时,Kubernetes 内部的负载均衡器会自动将请求均匀地分发到所有可用的副本上。这是通过 Kubernetes 的 Service 代理(kube-proxy)来实现的,它在每个节点上维护一个负载均衡表,将流量路由到对应的 Pod。

流量管理

如果你需要更高级的流量管理功能,如蓝绿部署、金丝雀发布等,可以使用以下技术:

  • Ingress:提供 HTTP 和 HTTPS 的路由功能,可以根据请求的 URL 路径或主机名将流量路由到不同的服务。它也支持基于流量的路由策略。

    示例:Ingress 配置

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:name: my-app-ingress
    spec:rules:- host: myapp.example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: my-app-serviceport:number: 80
    
  • IstioLinkerd:这些服务网格工具提供了更丰富的流量管理功能,如流量路由、故障恢复、监控和安全控制。

通过合理配置 Deployment 和 Service,以及结合使用 Ingress 和服务网格工具,你可以在 Kubernetes 集群中高效地管理应用程序的副本和流量。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • UltraISO制作Centos7.X系统U盘启动
  • 2024年入职/转行网络安全,该如何规划?_网络安全职业规划
  • Docker的介绍、保姆级安装和使用
  • 数据库学习(进阶)
  • LoginFormDTO
  • iOS18 Beta7 最终测试版推送:苹果的又一次技术飞跃
  • HTTP 之 HTTP/1.0、HTTP/1.1和HTTP2的缓存策略(六)
  • [数据集][目标检测]起子检测数据集VOC+YOLO格式1215张1类别
  • 在Excel中“直接引用”字符串地址
  • 【实战教程】用scikit-learn玩转KNN:鸢尾花数据集的分类之旅
  • leetcode371. 两整数之和,位运算
  • Git介绍及配置
  • 一、什么是 mvvm? MVC、MVP、MVVM三种模式的区别与详解
  • [数据集][目标检测]扳手检测数据集VOC+YOLO格式1042张1类别
  • 前同事2024年接私活已入百万,都是用这几个开源的SpringBoot项目
  • 【5+】跨webview多页面 触发事件(二)
  • 03Go 类型总结
  • Docker: 容器互访的三种方式
  • HTML-表单
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Javascript 原型链
  • js ES6 求数组的交集,并集,还有差集
  • 从零搭建Koa2 Server
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 近期前端发展计划
  • 开发基于以太坊智能合约的DApp
  • 前端知识点整理(待续)
  • 入门到放弃node系列之Hello Word篇
  • ionic入门之数据绑定显示-1
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • #{} 和 ${}区别
  • #includecmath
  • (~_~)
  • (poj1.2.1)1970(筛选法模拟)
  • (WSI分类)WSI分类文献小综述 2024
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (七)Java对象在Hibernate持久化层的状态
  • (强烈推荐)移动端音视频从零到上手(上)
  • (转)JAVA中的堆栈
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET 使用配置文件
  • .Net 应用中使用dot trace进行性能诊断
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET和.COM和.CN域名区别
  • .net开发时的诡异问题,button的onclick事件无效
  • .NET中的十进制浮点类型,徐汇区网站设计
  • .php文件都打不开,打不开php文件怎么办
  • // an array of int