Go微服务架构实战 中篇:4. 基于ingress的限流,路径匹配和重写实战

简介: Go微服务架构实战 中篇:4. 基于ingress的限流,路径匹配和重写实战

4. 基于k8s的ingress实战



到现在为止我们的服务都是跑在集群内部的,为了让集群外部也能访问,那么我们需要让服务外化,但是因为minikube在mac上是网络不通的,所以我们我们直接就在minikube环境中测试(minikube ssh进入即可)。


1. 创建Pod的service


创建pod的service,类型是NodePort,我们看下svc.yaml:


apiVersion: v1
kind: Service
metadata:
  name: k8sdemo-svc # service的服务名称
spec:
  ports:
    - name: k8sdemo-svc
      port: 8000 # service的端口
      targetPort: 60001 # 容器服务的端口
  selector:
    app: k8sdemo # 关联pod
  type: NodePort # 对外暴露

创建完成之后,我们可以kubectl get svc查看是否创建成功

640.png


通过上图可以知道service是创建成功的,接下来看下架构图:

640.png


随便拿一台机器的公网IP+NodePort就可以访问了,我们这里可以在minikube中验证下:http://$(minikube ip):NodePort


docker@minikube:~$ curl -X POST  http://192.168.49.2:30143/hello -d '{"name": "fromGW"}'
{"message":"Hello fromGW from 172.17.0.16:50009"}


可以看到是没有问题的。我们从图中可以看出service是pod的更高一层抽象,负责服务发现和负载均衡,当某个Pod挂掉的时候,service会发现这个问题然后把请求打到别的Pod上。同样当在创建一个带有相同标签的Pod的时候,它会自动加入到service中,然后service会把流量按照某种负载均衡算法分发到各个Pod中。


2. 创建ingress


先安装ingress-nginx,我们先把ingress-nginx下载到本地,然后把镜像地址替换下,防止下载速度慢。


wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/baremetal/deploy.yaml
sed -i 's@k8s.gcr.io/ingress-nginx/controller:v1.0.0\(.*\)@cnsre/ingress-nginx-controller:v1.0.0@' deploy.yaml
sed -i 's@k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0\(.*\)$@cnsre/ingress-nginx-kube-webhook-certgen:v1.0@' deploy.yaml

通过kubectl apply -f deploy.yaml安装。

可以看下是否安装成功:


640.png

目前来看是安装成功的。


接下来创建我们自己的ingress,这个ingress实现的功能就是路径匹配,重写以及限流,这个yam文件内容如下,ingress.yaml:


apiVersion: networking.k8s.io/v1
kind: Ingress # ingress对象
metadata:
  name: k8sdemo-ingress-prefix # 验证前缀匹配的
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
    - host: hi.k8sdemo.com # 域名
      http:
        paths:
          - path: "/hello" # 前缀匹配
            pathType: Prefix
            backend:
              service:
                name: k8sdemo-svc
                port:
                  number: 8000 # service的端口
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: k8sdemo-ingress-rewrite # 这个ingress是关于验证重写的
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /$2 # 重写注解
spec:
  rules:
    - host: hello.k8sdemo.com
      http:
        paths:
          - pathType: Prefix
            path: "/api(/|$)(.*)"  # 把请求会转给下面的服务,下面的服务一定要能处理这个路径,不能处理就是404
            backend:
              service:
                name: k8sdemo-svc  # 如果是/api/hello 去掉前缀api 用/hello访问服务 网关一般这么搞
                port:
                  number: 8000
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: k8sdemo-ingress-limit-rate
  annotations:
    nginx.ingress.kubernetes.io/limit-rps: "1" # rps:每秒多少请求 超过之后就报错 https status: 503
spec:
  ingressClassName: nginx
  rules:
    - host: hi.k8sdemo.com
      http:
        paths:
          - pathType: Exact # 精确匹配
            path: "/hello" # 针对这个路径限流
            backend:
              service:
                name: k8sdemo-svc
                port:
                  number: 8000

通过kubectl apply -f deploy.yaml创建。可以查看下是否创建成功:

640.png


可以看到这三个ingress绑定了两个host,接下来申请域名绑定ingress的ip地址,即上图中的192.168.49.2。但因为我们是minikube本地测试,所以绑定hosts就可以了。修改/etc/hosts:

192.168.49.2 hello.k8sdemo.com
192.168.49.2 hi.k8sdemo.com

保存之后我们就可以验证测试了。大致架构图就是:


640.png


3. 验证ingress


我们再次看下ingress的svc对外暴露的端口是:

640.png

可以看到是31721,接下来我们通过域名+端口来访问后端服务。

  1. 首先验证通过正常路径匹配访问
docker@minikube:~$ curl -X POST  http://hi.k8sdemo.com:31721/hello -d '{"name": "fromGW"}'
{"message":"Hello fromGW from 172.17.0.16:50009"}


发现是成功的。

  1. 验证路径重写
docker@minikube:~$ curl -X POST  http://hello.k8sdemo.com:31721/api/hello -d '{"name": "fromGW"}'
{"message":"Hello fromGW from 172.17.0.16:50009"}

发现是成功的。


4. ingress限流


docker@minikube:~$ curl -X POST  http://hi.k8sdemo.com:31721/hello -d '{"name": "fromGW"}'
<html>
<head><title>503 Service Temporarily Unavailable</title></head>
<body>
<center><h1>503 Service Temporarily Unavailable</h1></center>
<hr><center>nginx</center>
</body>
</html>

当我们一秒请求的/hello次数大于1的时候报错,nginx返回503,这样就验证了我们的ingress的限流功能。


5. 总结


本小节算是重点,我们要了解ingress如何暴露服务,如何重写路径以及如何限流等。路径重写很重要,比如接口地址是:http://example.gateway.com/user-center/userinfohttp://example.gateway.com/user-center/userprofile,网关地址是http://example.gateway.com,路由到后端服务是userinfo,那么在网关层为了区分我们的服务,会统一加一层user-center,这样就可以区分不同业务了,但是user-center不是我们想要的,我们用它只是区分业务,所以需要在ingress层做下路径重写,这样到后端的服务就没有了user-center了。


还有基于ingress的限流功能也非常简单,大家可以尝试用起来。


参考:

https://kubernetes.github.io/ingress-nginx/

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
6月前
|
监控 算法 NoSQL
Go 微服务限流与熔断最佳实践:滑动窗口、令牌桶与自适应阈值
🌟蒋星熠Jaxonic:Go微服务限流熔断实践者。分享基于滑动窗口、令牌桶与自适应阈值的智能防护体系,助力高并发系统稳定运行。
Go 微服务限流与熔断最佳实践:滑动窗口、令牌桶与自适应阈值
|
8月前
|
人工智能 监控 前端开发
支付宝 AI 出行助手高效研发指南:4 人团队的架构迁移与提效实战
支付宝「AI 出行助手」是一款集成公交、地铁、火车票、机票、打车等多项功能的智能出行产品。
1253 21
支付宝 AI 出行助手高效研发指南:4 人团队的架构迁移与提效实战
|
6月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
6月前
|
监控 Cloud Native Java
Spring Boot 3.x 微服务架构实战指南
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Spring Boot 3.x与微服务架构,探索云原生、性能优化与高可用系统设计。以代码为笔,在二进制星河中谱写极客诗篇。关注我,共赴技术星辰大海!(238字)
1141 2
Spring Boot 3.x 微服务架构实战指南
|
7月前
|
消息中间件 数据采集 NoSQL
秒级行情推送系统实战:从触发、采集到入库的端到端架构
本文设计了一套秒级实时行情推送系统,涵盖触发、采集、缓冲、入库与推送五层架构,结合动态代理IP、Kafka/Redis缓冲及WebSocket推送,实现金融数据低延迟、高并发处理,适用于股票、数字货币等实时行情场景。
1040 3
秒级行情推送系统实战:从触发、采集到入库的端到端架构
|
7月前
|
设计模式 人工智能 API
AI智能体开发实战:17种核心架构模式详解与Python代码实现
本文系统解析17种智能体架构设计模式,涵盖多智能体协作、思维树、反思优化与工具调用等核心范式,结合LangChain与LangGraph实现代码工作流,并通过真实案例验证效果,助力构建高效AI系统。
847 7
|
8月前
|
负载均衡 监控 Java
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
在微服务架构中,高可用与稳定性至关重要。本文详解熔断、限流与负载均衡三大关键技术,结合API网关与Hystrix-Go实战,帮助构建健壮、弹性的微服务系统。
799 1
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
|
7月前
|
JSON 供应链 监控
1688商品详情API技术深度解析:从接口架构到数据融合实战
1688商品详情API(item_get接口)可通过商品ID获取标题、价格、库存、SKU等核心数据,适用于价格监控、供应链管理等场景。支持JSON格式返回,需企业认证。Python示例展示如何调用接口获取商品信息。