k8s 上 go 微服务实战: go 实现 istio bookinfo 微服务

简介: 在完成 `k8s 上快速部署 go 服务` 和 `k8s: istio 入门` 后, 继续 **膨胀**, 使用 go 来实现 istio 提供的 bookinfo 微服务 demo

在完成 `k8s 上快速部署 go 服务` 和 `k8s: istio 入门` 后, 继续 **膨胀**, 使用 go 来实现 istio 提供的 bookinfo 微服务 demo


快速回顾之前的 blog:


- [k8s 上 go 服务实战: 扩容 发版更新 回滚 平滑重启](https://zhuanlan.zhihu.com/p/248866126 "k8s 上 go 服务实战: 扩容 发版更新 回滚 平滑重启")

- [k8s 上 go 服务实战: 使用 helm 快速构建云原生应用](https://zhuanlan.zhihu.com/p/251261134 "k8s 上 go 服务实战: 使用 helm 快速构建云原生应用")

- [k8s: istio 入门实践](https://zhuanlan.zhihu.com/p/258104456 "k8s: istio 入门实践")


涉及到的问题:


- [istio bookinfo demo](https://istio.io/latest/zh/docs/examples/bookinfo/#start-the-application-services "istio bookinfo demo")

- [istio task](https://istio.io/latest/zh/docs/tasks/traffic-management/request-routing/ "istio task")


简单实践步骤:


- 使用 go 重写 bookinfo 微服务并部署到 k8s 中

- 基于 go 版 bookinfo 微服务, 验证 istio task


## 使用 go 重写 bookinfo 微服务并部署到 k8s 中


先回顾一下 bookinfo 微服务应用的端到端架构:


![image](https://upload-images.jianshu.io/upload_images/567399-f369d202d827fff3.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


包含 4 个微服务:


- rating: 书籍评分

- review: 书籍评价, 有 v1/v2/v3 三个版本, 其中 v2/v3 需要调用 `rating` 服务

- detail: 书籍详情

- productpage: 书籍产品页面, 需要调用 `review + detail` 服务


### 实现 rating 服务


可以参考 [k8s 上 go 服务实战: 使用 helm 快速构建云原生应用](https://zhuanlan.zhihu.com/p/251261134 "k8s 上 go 服务实战: 使用 helm 快速构建云原生应用") 快速部署 rating 服务


- go


```go

// rating/main.go

package main


import (

   "fmt"

   "net/http"

)


func main() {

   http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {

       fmt.Fprintf(writer, "rating")

   })

   http.ListenAndServe(":80", nil)

}

```


- dockerfile


```dockerfile

FROM golang:alpine as builder

WORKDIR /

COPY main.go .

RUN go build -o app main.go


FROM alpine

WORKDIR /

COPY --from=builder /app /app

ENTRYPOINT /app

EXPOSE 80

```


- 使用 alibaba cloudtookit 快速打包上传镜像


![image](https://upload-images.jianshu.io/upload_images/567399-ecc17cf26aebfda7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


- helm 快速部署


```sh

helm create rating


# 修改 values.yaml

repository: registry.cn-shanghai.aliyuncs.com/daydaygo/istio_bookinfo_rating

# 修改 chart.yml

appVersion: 0.1.1


helm lint --strict rating

helm install rating rating # 部署到 k8s 中

kubectl get pod # 查看 pod

kubectl port-forward $POD_NAME 8081:80 # 开启 port-forward 测试, 本地端口:pod端口

➜ curl localhost:8081

rating⏎

```


同理, 实现 `productpage` `detail` 服务


### 实现 review 服务并包含 3 个版本


- 实现三个版本的 review 应用


| 应用名称  | 镜像版本 |

| --------- | -------- |

| review-v1 | 0.1.0    |

| review-v2 | 0.2.0    |

| Review-v3 | 0.3.0    |


- 直接使用 yaml 文件部署( helm 单应用多版本下次继续折腾)


```yaml

##################################################################################################

# Reviews service

##################################################################################################

apiVersion: v1

kind: Service

metadata:

 name: review

 labels:

   app: review

   service: review

spec:

 ports:

   - port: 80

     name: http

 selector:

   app: review

---

apiVersion: v1

kind: ServiceAccount

metadata:

 name: bookinfo-review

 labels:

   account: review

---

apiVersion: apps/v1

kind: Deployment

metadata:

 name: review-v1

 labels:

   app: review

   version: v1

spec:

 replicas: 1

 selector:

   matchLabels:

     app: review

     version: v1

 template:

   metadata:

     labels:

       app: review

       version: v1

   spec:

     serviceAccountName: bookinfo-review

     containers:

       - name: review

         image: registry.cn-shanghai.aliyuncs.com/daydaygo/istio_bookinfo_review:0.1.0

         imagePullPolicy: IfNotPresent

         env:

           - name: LOG_DIR

             value: "/tmp/logs"

         ports:

           - containerPort: 80

         volumeMounts:

           - name: tmp

             mountPath: /tmp

           - name: wlp-output

             mountPath: /opt/ibm/wlp/output

     volumes:

       - name: wlp-output

         emptyDir: {}

       - name: tmp

         emptyDir: {}

---

apiVersion: apps/v1

kind: Deployment

metadata:

 name: review-v2

 labels:

   app: review

   version: v2

spec:

 replicas: 1

 selector:

   matchLabels:

     app: review

     version: v2

 template:

   metadata:

     labels:

       app: review

       version: v2

   spec:

     serviceAccountName: bookinfo-review

     containers:

       - name: review

         image: registry.cn-shanghai.aliyuncs.com/daydaygo/istio_bookinfo_review:0.2.0

         imagePullPolicy: IfNotPresent

         env:

           - name: LOG_DIR

             value: "/tmp/logs"

         ports:

           - containerPort: 80

         volumeMounts:

           - name: tmp

             mountPath: /tmp

           - name: wlp-output

             mountPath: /opt/ibm/wlp/output

     volumes:

       - name: wlp-output

         emptyDir: {}

       - name: tmp

         emptyDir: {}

---

apiVersion: apps/v1

kind: Deployment

metadata:

 name: review-v3

 labels:

   app: review

   version: v3

spec:

 replicas: 1

 selector:

   matchLabels:

     app: review

     version: v3

 template:

   metadata:

     labels:

       app: review

       version: v3

   spec:

     serviceAccountName: bookinfo-review

     containers:

       - name: review

         image: registry.cn-shanghai.aliyuncs.com/daydaygo/istio_bookinfo_review:0.3.0

         imagePullPolicy: IfNotPresent

         env:

           - name: LOG_DIR

             value: "/tmp/logs"

         ports:

           - containerPort: 80

         volumeMounts:

           - name: tmp

             mountPath: /tmp

           - name: wlp-output

             mountPath: /opt/ibm/wlp/output

     volumes:

       - name: wlp-output

         emptyDir: {}

       - name: tmp

         emptyDir: {}

---

```


- 部署到 k8s 中


```sh

kubectl apply -f review.yaml

kubectl get pod

# 重复验证各个 pod

kubectl port-forward $POD_NAME 8081:80 # 开启 port-forward 测试, 本地端口:pod端口

➜ curl localhost:8081

review-v1⏎

```


## 基于 go 版 bookinfo 微服务, 验证 istio task


- istio task 文档: https://github.com/istio/istio.io/content/en/docs/tasks

- task 都可以在 istio sample 找到例子: https://github.com/istio/istio/samples


```sh

# istio.io/content/en/docs/tasks

➜  tasks git:(master) tree -d

.

├── observability

│   ├── distributed-tracing

│   │   ├── configurability

│   │   ├── jaeger

│   │   ├── lightstep

│   │   ├── overview

│   │   └── zipkin

│   ├── gateways

│   ├── kiali

│   ├── logs

│   │   └── access-log

│   └── metrics

│       ├── classify-metrics

│       ├── customize-metrics

│       ├── querying-metrics

│       ├── tcp-metrics

│       └── using-istio-dashboard

├── security

│   ├── authentication

│   │   ├── authn-policy

│   │   └── mtls-migration

│   ├── authorization

│   │   ├── authz-deny

│   │   ├── authz-http

│   │   ├── authz-ingress

│   │   ├── authz-jwt

│   │   ├── authz-tcp

│   │   └── authz-td-migration

│   └── cert-management

│       ├── dns-cert

│       └── plugin-ca-cert

└── traffic-management

   ├── circuit-breaking

   ├── egress

   │   ├── egress-control

   │   ├── egress-gateway

   │   ├── egress-gateway-tls-origination

   │   ├── egress-gateway-tls-origination-sds

   │   ├── egress-kubernetes-services

   │   ├── egress-tls-origination

   │   ├── http-proxy

   │   └── wildcard-egress-hosts

   ├── fault-injection

   ├── ingress

   │   ├── ingress-control

   │   ├── ingress-sni-passthrough

   │   ├── kubernetes-ingress

   │   └── secure-ingress

   ├── mirroring

   ├── request-routing

   ├── request-timeouts

   ├── tcp-traffic-shifting

   └── traffic-shifting


53 directories

```


## 写在最后


istio 几乎涵盖了 服务治理/流量控制 的方方面面, 作为服务治理层的基础设施 **完全够用**, 问题开始从 **行不行**, 转向 **用哪些**, 让 业务层/devops工作流/k8s基础设施 用起来更爽


还需要解决的问题:

- helm 对单应用多版本的支持, 比如 review 应用是通一个 srv, 多个 deploy

- k8s/helm 发布对服务间依赖的支持, 比如 A 服务必须依赖 B 服务更新后才能更新

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
监控 算法 NoSQL
Go 微服务限流与熔断最佳实践:滑动窗口、令牌桶与自适应阈值
🌟蒋星熠Jaxonic:Go微服务限流熔断实践者。分享基于滑动窗口、令牌桶与自适应阈值的智能防护体系,助力高并发系统稳定运行。
1371 1
Go 微服务限流与熔断最佳实践:滑动窗口、令牌桶与自适应阈值
|
JavaScript Java Go
探索Go语言在微服务架构中的优势
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出。本文将深入探讨Go语言在构建微服务时的性能优势,包括其在内存管理、网络编程、并发模型以及工具链支持方面的特点。通过对比其他流行语言,我们将揭示Go语言如何成为微服务架构中的一股清流。
496 53
|
Shell Go 开发工具
【环境】Rocky8使用gvm配置Go多版本管理的微服务开发环境(go-zero)
通过本文的介绍,我们详细讲解了如何在Rocky8上使用gvm来管理多个Go版本,并配置go-zero框架的开发环境。通过gvm的灵活管理,开发者可以轻松切换不同的Go版本,以适应不同项目的需求。同时,go-zero框架的使用进一步提升了微服务开发的效率和质量。希望本文能帮助开发者构建高效的Go语言开发环境,提高项目开发的灵活性和稳定性。
627 63
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
1472 33
|
人工智能 Kubernetes 异构计算
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
1047 5
|
Kubernetes 持续交付 数据库
阿里云ACK+GitLab企业级部署实战教程
GitLab 是一个功能强大的基于 Web 的 DevOps 生命周期平台,整合了源代码管理、持续集成/持续部署(CI/CD)、项目管理等多种工具。其一体化设计使得开发团队能够在同一平台上进行代码协作、自动化构建与部署及全面的项目监控,极大提升了开发效率和项目透明度。 GitLab 的优势在于其作为一体化平台减少了工具切换,高度可定制以满足不同项目需求,并拥有活跃的开源社区和企业级功能,如高级权限管理和专业的技术支持。借助这些优势,GitLab 成为许多开发团队首选的 DevOps 工具,实现从代码编写到生产部署的全流程自动化和优化。
|
人工智能 Kubernetes 异构计算
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
本教程演示如何在ACK中多机分布式部署DeepSeek R1满血版。
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
Go 数据处理 API
Go语言在微服务架构中的应用与优势
本文摘要采用问答形式,以期提供更直接的信息获取方式。 Q1: 为什么选择Go语言进行微服务开发? A1: Go语言的并发模型、简洁的语法和高效的编译速度使其成为微服务架构的理想选择。 Q2: Go语言在微服务架构中有哪些优势? A2: 主要优势包括高性能、高并发处理能力、简洁的代码和强大的标准库。 Q3: 文章将如何展示Go语言在微服务中的应用? A3: 通过对比其他语言和展示Go语言在实际项目中的应用案例,来说明其在微服务架构中的优势。
|
Cloud Native Go API
Go语言在微服务架构中的创新应用与实践
本文深入探讨了Go语言在构建高效、可扩展的微服务架构中的应用。Go语言以其轻量级协程(goroutine)和强大的并发处理能力,成为微服务开发的首选语言之一。通过实际案例分析,本文展示了如何利用Go语言的特性优化微服务的设计与实现,提高系统的响应速度和稳定性。文章还讨论了Go语言在微服务生态中的角色,以及面临的挑战和未来发展趋势。

推荐镜像

更多