第三代微服务架构:基于 Go 的博客微服务实战案例,支持分布式事务
这是一个可一键部署在 Kubernetes-Istio 集群中的,基于 Golang 的博客微服务 Demo,支持分布式事务。
项目地址:https://github.com/jxlwqq/blog-microservices ,欢迎 Star 和 PR。
架构

Kiali Console

目录结构
主要遵循 Standard Go Project Layout 推荐的目录分层。
使用的依赖:
- gRPC 通信协议
- GORM 数据库 ORM
- DTM 分布式事务管理器
- Jaeger 分布式追踪
- Prometheus 监控系统
- Grafana 数据可视化
- Kiali 可观察性工具
- Kubernetes 容器编排
- Istio 服务网格
Makefile 简介
| 命令 | 说明 |
|---|---|
make init |
安装各类 protoc-gen-* 、 wire 以及 migrate |
make protoc |
基于 *.proto 文件,生成各类 *_pb.go |
make wire |
基于 wire.go 文件,生成 wire_gen.go |
make test |
测试 |
make migrate-up |
迁移数据库 |
make migrate-down |
回滚数据库 |
make blog-server |
启动 blog 服务(本地开发环境) |
make user-server |
启动 user 服务(本地开发环境) |
make post-server |
启动 post 服务(本地开发环境) |
make comment-server |
启动 comment 服务(本地开发环境) |
make auth-server |
启动 auth 服务(本地开发环境) |
make dtm-server |
DTM 为外部依赖,启动本地服务,请浏览 官方文档 |
make docker-build |
构建 Docker 镜像 |
make kube-deploy |
在集群中部署 blog、user、post、comment、auth 以及 dtm 服务 |
make kube-delete |
在集群中删除上述服务 |
make kube-redeploy |
在集群中重新部署服务(️ 数据库服务不会重新部署) |
本地环境搭建
- docker-desktop >= 4.3.2
- kubernetes >= 1.22.4
- go >= 1.17
- istioctl >= 1.12.1
- protobuf >= 3.19.1
下载安装 Docker Desktop ,并启动内置的 Kubernetes 集群。
# 安装 Go
brew install go
# 安装 Protobuf
brew install protobuf
# 安装 Istio
brew install istioctl
kubectl config use-context docker-desktop
istioctl install -y
kubectl label namespace default istio-injection=enabled
ARM64 架构的用户安装 Istio,请查看 这里 以获取更多信息。
一键部署到本地集群
数据库初始化,项目相关的配置已经在 deployments 目录中的 yaml 文件中设置好,直接一键部署即可。
部署的资源比较多,请尽可能地将 Docker Desktop 的 CPU、Memory 拉高,避免 Pod 无法完成调度,详见 这里。
make docker-build
make kube-deploy
查看 Pod 资源:
kubectl get pods -A
返回:
NAMESPACE NAME READY STATUS RESTARTS AGE
default auth-server-678f9d4b4-lhkf8 2/2 Running 0 101s
default blog-server-6475d7bdd5-6t9jk 2/2 Running 0 101s
default comment-db-59665d87f8-plswq 2/2 Running 0 101s
default comment-server-857445775b-qkpm5 2/2 Running 3 (74s ago) 100s
default dtm-db-cb8c45698-qms8q 2/2 Running 0 102s
default dtm-server-c548d67cc-xcv2z 2/2 Running 0 102s
default post-db-867f5f85db-zz64g 2/2 Running 0 101s
default post-server-5448dc5b67-mdhcc 2/2 Running 4 (54s ago) 101s
default user-db-fcfd47bf8-dh9kp 2/2 Running 0 101s
default user-server-78688485b8-zf5tc 2/2 Running 3 (76s ago) 101s
istio-system grafana-6ccd56f4b6-tp84j 1/1 Running 0 100s
istio-system istio-egressgateway-67dc4b96cd-2gm6s 1/1 Running 5 13d
istio-system istio-ingressgateway-68d897fbcd-thvt9 1/1 Running 5 13d
istio-system istiod-66dc55cd96-r6cnv 1/1 Running 5 13d
istio-system jaeger-9dd685668-wdzsz 1/1 Running 0 100s
istio-system kiali-79b86ff5bc-jh6v8 1/1 Running 0 100s
istio-system prometheus-64fd8ccd65-4c5nc 2/2 Running 0 99s
kube-system coredns-558bd4d5db-5nlbz 1/1 Running 5 13d
kube-system coredns-558bd4d5db-m46lb 1/1 Running 5 13d
kube-system etcd-docker-desktop 1/1 Running 13 13d
kube-system kube-apiserver-docker-desktop 1/1 Running 13 13d
kube-system kube-controller-manager-docker-desktop 1/1 Running 13 13d
kube-system kube-proxy-mj6x8 1/1 Running 5 13d
kube-system kube-scheduler-docker-desktop 1/1 Running 13 13d
kube-system storage-provisioner 1/1 Running 11 13d
kube-system vpnkit-controller 1/1 Running 177 (2m56s ago) 13d
查看 Service 资源:
kubectl get services -A
返回:
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default auth-server ClusterIP 10.99.64.145 <none> 50054/TCP,8054/TCP,9054/TCP 15m
default blog-server ClusterIP 10.96.207.114 <none> 50050/TCP,8050/TCP,9050/TCP 15m
default comment-db ClusterIP 10.99.195.67 <none> 3306/TCP 15m
default comment-server ClusterIP 10.96.179.191 <none> 50053/TCP,9053/TCP 15m
default dtm-db ClusterIP 10.106.31.52 <none> 3306/TCP 15m
default dtm-server ClusterIP 10.99.170.244 <none> 36790/TCP,36789/TCP 15m
default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13d
default post-db ClusterIP 10.103.103.106 <none> 3306/TCP 15m
default post-server ClusterIP 10.96.232.141 <none> 50052/TCP,9052/TCP 15m
default user-db ClusterIP 10.99.144.168 <none> 3306/TCP 15m
default user-server ClusterIP 10.100.66.36 <none> 50051/TCP,9051/TCP 15m
istio-system grafana ClusterIP 10.105.48.42 <none> 3000/TCP 15m
istio-system istio-egressgateway ClusterIP 10.99.128.200 <none> 80/TCP,443/TCP 13d
istio-system istio-ingressgateway LoadBalancer 10.101.116.168 localhost 15021:30898/TCP,80:32417/TCP,443:32343/TCP,31400:32210/TCP,15443:31544/TCP 13d
istio-system istiod ClusterIP 10.108.250.181 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 13d
istio-system jaeger-collector ClusterIP 10.103.107.169 <none> 14268/TCP,14250/TCP,9411/TCP 15m
istio-system kiali ClusterIP 10.111.157.82 <none> 20001/TCP,9090/TCP 15m
istio-system prometheus ClusterIP 10.100.104.250 <none> 9090/TCP 15m
istio-system tracing ClusterIP 10.108.139.227 <none> 80/TCP,16685/TCP 15m
istio-system zipkin ClusterIP 10.101.235.179 <none> 9411/TCP 15m
kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 13d
访问服务
推荐使用 BloomRPC 或者 Insomnia ,导入 api/protobuf/blog.proto 文件后, 服务地址填写 localhost:80 端口即可访问,如下图所示:
注册:

创建文章:

第三代微服务架构:基于 Go 的博客微服务实战案例,支持分布式事务的更多相关文章
- 庐山真面目之十二微服务架构基于Docker搭建Consul集群、Ocelot网关集群和IdentityServer版本实现
庐山真面目之十二微服务架构基于Docker搭建Consul集群.Ocelot网关集群和IdentityServer版本实现 一.简介 在第七篇文章<庐山真面目之七微服务架构Consul ...
- [转帖]微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务
微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务 http://skaka.me/blog/2016/04/21/springcloud1/ APR 21ST, ...
- .net core 跨平台开发 微服务架构 基于Nginx反向代理 服务集群负载均衡
1.概述 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客 ...
- 微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务
http://skaka.me/blog/2016/04/21/springcloud1/ 不同于单一架构应用(Monolith), 分布式环境下, 进行事务操作将变得困难, 因为分布式环境通常会有多 ...
- 微服务架构 - 基于Harbor构建本地镜像仓库
之前写过<搭建docker本地镜像仓库并提供权限校验及UI界面>文章,然后有同仁评论道这样做太复杂了,如果Harbor来搭建会更简单同时功能也更强大.于是抽时间研究了基于Harbor构建本 ...
- 软件架构的演进,了解单体架构,垂直架构,SOA架构和微服务架构的变化历程
软件架构演进 软件架构的发展经历了从单体结构.垂直架构.SOA架构到微服务架构的过程,博客里写到了这四种架它们的特点以及优缺点分析,个人学习之用,仅供参考! 1.1.1 单体架构 特点: 1 ...
- 微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程 ...
- 微服务实践(七):从单体式架构迁移到微服务架构 - DockOne.io
原文:微服务实践(七):从单体式架构迁移到微服务架构 - DockOne.io [编者的话]这是用微服务开发应用系列博客的第七篇也是最后一篇.第一篇中介绍了微服务架构模式,并且讨论了微服架构的优缺点: ...
- 【.net core】电商平台升级之微服务架构应用实战
一.前言 这篇文章本来是继续分享IdentityServer4 的相关文章,由于之前有博友问我关于微服务相关的问题,我就先跳过IdentityServer4的分享,进行微服务相关的技术学习和分享.微服 ...
随机推荐
- CountDownLatch原理
正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中,countdownlatch的概念是一 ...
- Druid数据库连接池工具类
package cn.itcast.utils;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSo ...
- 如何基于 Docker 快速搭建 Springboot + Mysql + Redis 项目
目录 前言 项目目录 搭建项目 1. docker安装启动mysql以及redis 1.1 安装mysql 1.2 安装redis 2. 初始化数据库 3.创建项目 4.初始化代码 4.1 全局配置文 ...
- CF729A Interview with Oleg 题解
Content 给出一个长度为 \(n\) 字符串 \(s\),请将开头为 \(\texttt{ogo}\),后面带若干个 \(\texttt{go}\) 的子串替换成 \(\texttt{***}\ ...
- CF706A Beru-taxi 题解
Content 有一个人在点 \((a,b)\) 等出租车.已知他周围共有 \(n\) 辆出租车,其中第 \(i\) 辆车在点 \((x_i,y_i)\) 上,速度为 \(v_i\).这个人想打能让他 ...
- CF513B1 Permutations 题解
Content 给定两个整数 \(n,m\).定义 \(f(p)=\sum\limits_{l=1}^n\sum\limits_{r=l}^n\min\limits_{i=l}^rp_i\),其中 \ ...
- java 多线程:Thread类;Runnable接口
1,进程和线程的基本概念: 1.什么是进程: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机 ...
- Github访问加速(解决md图片显示问题)
参考自知乎:https://zhuanlan.zhihu.com/p/107691233 基本步骤 查找域名对应IP https://www.ipaddress.com http://tool.chi ...
- c++设计模式概述之中介
代码写的不够规范,目的是为了缩短篇幅,实际中请不要这样做. 1.概述 A.中介模式,主要对象有两类: 中介和用户,类比生活中的房产中介公司,中介手中掌握着用户的资料,当然,用户手中也有中介的联系方式. ...
- 【LeetCode】1150. Check If a Number Is Majority Element in a Sorted Array 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典 二分查找 日期 题目地址:https://lee ...