Go微服务架构实战 中篇:2. 基于k8s部署服务和注册中心,验证服务注册和发现

Spring Cloud 使用 Kubernetes 作为注册中心 Spring Cloud 使用 Kubernetes 作为注册中心 Spring Cloud 可以使用 Kubernetes 作为注册中心,实现服务注册和发现 创建两个应用,Consumer 和 Provider,Provider 提供一个 REST 接口供 Consumer 调用 Provider 添加依赖 build.gradle dependencies { compile ... 阅读详情

Go微服务架构实战-【公粽号:堆栈future】

本系列文章主要是针对云原生领域微服务架构的实战,包括网关,k8s,etcd以及grpc等相关技术的应用,同时也会把服务发现与注册,熔断,降级,限流以及分布式锁等加入到系列当中作为补充,课程的最后也会安排分布式链路追踪框架的学习,监控平台的搭建以及灰度发布等技术服务,所以总体来讲,课程范围涉及技术领域较广,知识面比较宽,大家下来各取所需尽量做到熟悉和应用,之后有时间了在研究下源码,乐哉!

上篇已经完成,大家可以看下,我这里贴出来了,中篇从这周开始陆续为大家产出,因为太耗费精力,所以还望大家多多支持!

Go微服务架构实战目录

1. 微服务架构上篇

1. grpc技术介绍

2. grpc+protobuf+网关实战

3. etcd技术介绍

4. 基于etcd的服务发现与注册

5. 基于etcd的分布式锁实战

2. 微服务架构中篇

1. k8s架构介绍

2. 基于pod和deployment的容器化部署

对于k8s来说,所有资源对象都有yaml文件来创建,k8s提供一个工具kubectl来和API server交互,从而创建相应的资源对象。

我们的项目有一个服务端,有一个客户端,还有一个服务发现和注册中心etcd。

我们原来就是裸机用supervisor去托管各个服务进程,比较简单直接,现在用k8s尝试去部署一下。

1. 创建server pod的步骤

  1. 首先为了让server进行容器化部署,得现有Dockerfile,我们来看看server的(Dockerfile):
FROM golang AS build-env //从Docker镜像仓库找golang镜像 
ADD . /go/src/app
WORKDIR /go/src/app
RUN GOOS=linux GOARCH=386 go build -mod vendor cmd/svr/svr.go //构建镜像

FROM alpine //构建二进制镜像

COPY --from=build-env /go/src/app/svr /usr/local/bin/svr //从golang尽享copy到二进制镜像内

CMD [ "svr", "-port", "50009"] //运行服务 指定参数是端口

  1. 用docker build构建镜像docker build -t k8s-grpc-demo -f ./Dockerfile .

  2. 用刚才的镜像创建server的yaml(server.yaml):

apiVersion: apps/v1
kind: Deployment //Deployment就是管理Pod资源的对象
metadata:
  name: k8sdemo-deploy //Pod名称
  labels:
    app: k8sdemo //Pod标签 为service提供负载均衡使用
spec:
  replicas: 1 //副本为1
  selector:
    matchLabels:
      app: k8sdemo
  template:
    metadata:
      labels:
        app: k8sdemo
    spec:
      containers:
      - name: k8sdemo //容器名称
        image: k8s-grpc-demo:latest //用刚才生成的本地镜像
        imagePullPolicy: Never //从本地构建
        ports:
        - containerPort: 50007 //容器端口


  1. 用kubectl创建podkubectl apply -f server.yaml没有指定namespace,默认是在default空间。

  2. 创建之后看下pod是否起来kubectl get pod查看图片发现server的pod已经running了。

为了多测试几个服务,我们复制创建相同的Dockerfile和server.yaml,比如Dockerfile1 Dockerfile2 以及server1.yaml和server2.yaml,这里就不把配置粘贴出来,可以从github地址查看哈。

2. 创建client的pod的步骤

  1. 创建Dockerfile(Dockerfile3)
FROM golang AS build-env
ADD . /go/src/app
WORKDIR /go/src/app
RUN GOOS=linux GOARCH=386 go build -mod vendor cmd/cli/cli.go

FROM alpine

COPY --from=build-env /go/src/app/cli /usr/local/bin/cli

CMD [ "cli"]

  1. 构建Dockerfiledocker build -t k8s-grpc-demo3 -f ./Dockerfile3 .

  2. 用刚才的镜像创建client的yaml(client.yaml):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8sdemo-cli-deploy //客户端pod名称
  labels:
    app: k8sdemo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: k8sdemo
  template:
    metadata:
      labels:
        app: k8sdemo
    spec:
      containers:
      - name: k8sdemocli
        image: k8s-grpc-demo3:latest //用刚才构建的镜像
        imagePullPolicy: Never
        ports:
        - containerPort: 50010


  1. 用kubectl创建podkubectl apply -f client.yaml没有指定namespace,默认是在default空间。

  2. 创建之后看下pod是否起来kubectl get pod查看图片发现client的pod已经running了。

3. 创建etcd的pod的步骤

因为etcd镜像我们用Docker官网里面的,所以不用自己构建了,这里直接把创建etcd的pod的yaml贴出来。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: etcd3 //etcd名称
  labels:
    name: etcd3
spec:
  replicas: 1
  selector:
    matchLabels:
      app: etcd3
  template:
    metadata:
      labels:
        app: etcd3
    spec:
      containers:
        - name: etcd3 //容器名称
          image: quay.io/coreos/etcd:latest //etcd镜像
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - mountPath: /data //数据存储挂载路径
              name: etcd-data
          env:
            - name: host_ip
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
          command: ["/bin/sh","-c"]
          args: //启动etcd
            - /usr/local/bin/etcd //etcd的可执行文件
              --name etcd3 //etcd集群的名称
              --initial-advertise-peer-urls http://0.0.0.0:2380
              --listen-peer-urls http://0.0.0.0:2380
              --listen-client-urls http://0.0.0.0:2379
              --advertise-client-urls http://0.0.0.0:2379
              --initial-cluster-token etcd-cluster-1
              --initial-cluster etcd3=http://0.0.0.0:2380
              --initial-cluster-state new
              --data-dir=/data


      volumes:
        - name: etcd-data
          emptyDir: {} //当前容器作为存储路径


然后用kubectl命令直接创建pod

kubectl apply -f etc.yaml

用kubectl get pod查看图片发现etcd的pod是running了。

但是有pod不一定有对内提供服注册和发现能力,得需要service对内pod提供服务,因此创建etcd的service如下:

apiVersion: v1
kind: Service
metadata:
  name: etcd3 //service的名称 服务注册和发现的时候使用 很重要
spec:
  ports:
    - name: client
      port: 2379 //service对内pod的client访问端口
      targetPort: 2379
    - name: etcd3
      port: 2380 //service对内pod的server访问端口
      targetPort: 2380
  selector:
    app: etcd3 //找到需要关联的etcd pod 即上面创建的etcd pod


我们看下是否创建成功:图片bingo。至此服务,客户端以及以及etcd的服务注册和发现中心部署好了。

接下来做点小改动,就可以实现服务注册和发现了。

3. 服务注册

因为我们的pod也是有ip的,所以服务注册之前得先获取pod的ip。代码如下:

//获取本地eth0 IP 大家下来在源码中可以看到实现哈
func GetLocalIP() string

然后有两个地方需要修改:

  1. 注册中心的地址(etcd address) 从原来的localhost改为http://etcd3:2379,至于为什么,我可以做个简单介绍,因为不同pod之间localhost是不通的,localhost只能在同一个Pod中的容器之间相互通信,不同pod是没有办法通信的。所以需要通信的pod必须通过etcd的svc名称去访问,k8s集群内提供了相关dns自动会解析到svc ip的,所以pod就可以访问etcd注册中心。

  2. 把原来服务默认监听的localhost改为从本地获取ip

1,2修改代码如下:图片

4. 客户端发现

客户端也需要修改注册中心地址:图片

5. 验证

等以上修改完成之后,我们还需要经历上述的重新构建步骤和部署步骤,因为代码改动了哦。

我们重新部署完成之后,在最后启动客户端的时候发现日志中有了多个服务端的请求,而且是RR轮循返回的响应,我们可以看下客户端和服务的pod列表:图片

客户端日志如下:图片

至此我们基于k8s的服务部署和服务注册中心就搭建起来了,后续为大家带来故障转移,滚动更新以及扩缩容等内容,欢迎大家关注,分享和点赞。

github地址:

https://github.com/guojiangli/k8s-grpc-demo

【公粽号:堆栈future】

使很多处于迷茫阶段的coder能从这里找到光明,堆栈创世,功在当代,利在千秋

Seata-Server在Kubernetes环境部署注册中心IP地址问题的解决策略 使用 Docker 部署 Seata Server自定义配置文件需要通过挂载文件的方式实现,将宿主机上的挂载到容器中相应的目录首先启动一个用户将resources目录文件拷出的临时容器拷出后可以,可以选择修改application.yml再cp进容器,或者rm临时容器,如下重新创建,并做好映射路径设置指定 application.yml其中-e用于配置环境变量,-v。 阅读详情

相关推荐

从单体架构到微服务:架构演进之路

文章探讨了软件开发架构从单体架构向微服务架构的演进过程。单体架构虽然简单,但随着业务复杂度的增加,其高度耦合、部署复杂、扩展性差等问题逐渐显现,导致系统维护和升级困难。微服务架构通过将系统拆分为独立部署的服务单元,实现了技术自由、精准扩缩容和故障隔离,显著提升了系统的灵活性和稳定性。文章还提出了四阶段的架构演进路径,包括模块化单体、绞杀者模式、数据去中心化和云原生升级,并对比了不同转型方案的成本和风险。最后,文章强调架构选择应根据业务需求和团队能力进行权衡,没有最好的架构,只有最合适的架构。

sg_knight的专栏 1833

Spring Cloud 使用 k8s 作为注册中心 开发环境 和 生产环境

spring cloud k8s 注册中心 开发环境 和 部署环境

qq_32948623的博客 6365

Discovery:k8s微服务注册中心

Discovery 该服务为微服务注册中心 group为default name为discovery 监听端口为10000 web监听端口为8000 /infos 获取所有的注册服务信息 /info/{group}/{name} 获取{group}下的{name}的注册信息 环境变量 SERVER_VERIFY_DATA 连接注册中心时需要用的验证数据 RUN_ENV 运行环境,如:test,pre,prod DEPLOY_ENV 部署环境,如:host,k8s

spring cloud -> k8s(使用自身注册中心)

找到几篇不错的文章,相信大家看完后会对如何在k8s中部署spring cloud项目(使用k8s自身的注册中心)有比较清楚认知: Spring Cloud Kubernetes服务注册与发现的实现原理与源码分析​ cloud.tencent.com/developer/article/1658681 Spring Cloud Ribbon源码分析(Spring Cloud Kubernetes)​ cloud.tencent.com/developer/article/1658682 ...

qingdao666666的博客 5929

虚幻UE 增强输入-触发器

输入触发器(UInputTrigger): 使用经过修饰器修改的输入值,或者使用其他输入动作的输出值,来确定是否激活输入动作。

UE成长之路,欢迎大家的关注! 5464

高速窄脉冲峰值保持设计

一、目的 在激光探测领域,探测器发出的高速窄脉冲,单片机AD进行采样,很难捕捉到窄脉冲的幅值,即使使用高速AD进行采样,也存在一定的难度。因此,本方案设计了一种高速窄脉冲峰值保持电路,有助于单片机AD采样能很好的捕捉到脉冲幅值。 二、方案分析与比较 峰值保持器一般分为两种:电压型和跨导型。 方案一:电压型峰值保持器,由电压型运放、二极管、保持电容、缓冲器组成,优点是元件成本低,缺点是峰值保持存在过...

weixin_43184208的博客 9289

Go微服务入门到容器化实战

微服务首先他是一种架构模式微服务相比较单体架构,微服务架构更独立,能够单独更新和发布微服务里面的服务仅仅用于某一个特定的业务功能特点逻辑清晰快速迭代多语言灵活组合2-2 微服务必备技能Docker入门介绍2-3 go-micro基础之 grpc proto2-4 go-micro 组件架构及通讯原理2-5 go-micro 入门案例编写2-6 go-micro 入门案例验证第3章 微服务模块开发3-1 micro new 和项目目录创建。

niwoxiangyu的博客 1011

探索gtwr of mgtwr in python

代码】探索gtwr of GWmodel in python。

m0_46268055的博客 3388

微服务架构详解

尽管引入分布式复杂性(如事务管理、链路追踪),但结合容器化(Docker/K8s)和 DevOps 实践,微服务已成为云原生时代的核心架构模式。近年来微服务很火,有多家大型企业都开始采用微服务分布式系统架构,所以就打算跟大家做一期关于微服务的分享,不过微服务和涉及的分布式计算非常的复杂,绝非是一篇文章就可以讲清楚的,本文只是从最简单的概念的基本使用带你入门,如果后续还有兴趣的话,可以查阅相关的文献和技术书籍去深入学习。:Eureka(AP模型)、Consul(CP模型)、Nacos(AP/CP可切换)。

网络风云的博客 2万+

EMD (经验模态分解) 在 C++ 中的实现指南

EMD 是由 Norden E. Huang 等人在1998年提出的一种适用于非线性和非平稳信号的分析方法。对称性:IMF 的上下包络对称。零交叉点:IMF 的零交叉点数量与极值点数量相同或相差一个。本文详细介绍了如何在C++中实现EMD,包括理论背景、算法步骤、代码实现和优化等内容。通过丰富的代码示例和详细的解释,希望能够帮助读者掌握EMD的基本原理,并能够在实际项目中灵活应用。未来,随着信号处理技术的不断发展,EMD及其变种(如EEMD、CEEMDAN等)将继续在各个领域发挥重要作用。

qq_38334677的博客 1749

浏览器解析HTML的过程及编程实现

需要注意的是,上述示例代码只是简化的演示,并未涵盖浏览器解析HTML的所有细节和复杂性。实际上,浏览器的HTML解析引擎还会处理一系列的特殊情况、错误容错和性能优化等方面的内容,以确保能够正确解析各种类型的HTML代码。HTML(超文本标记语言)是构建网页的基础语言,浏览器负责将HTML代码解析并渲染成可视化的网页。本文将详细介绍浏览器解析HTML的过程,并提供相应的编程示例代码。希望以上内容能帮助您理解浏览器解析HTML的过程,并通过提供的示例代码更好地了解如何在编程中实现这一过程。

ByteJolt的博客 321

如何快速部署MCP Registry:开源注册中心的完整配置指南

MCP Registry是一个社区驱动的Model Context Protocol(MCP)服务器注册中心,它为AI助手和开发者提供了统一的服务器发现和发布平台。作为MCP生态系统的核心组件,这个开源注册中心让你能够轻松管理、发布和发现各种MCP服务器,就像应用商店一样方便。 ## 🚀 项目概述:为什么选择MCP Registry? MCP Registry不仅仅是一个简单的服务器列表,它

gitblog_00664的博客 960

TC3XX - MCAL知识点(三):MCU EB-tresos配置说明及代码浅析

AURIX 2G Tc3xx的配置相较AURIX 1G Tc2xx来讲简化了许多,但是依赖于数据手册的理解来讲整个MCU功能做了较大增强,此处先简单的介绍一下,本文前期先补充介绍一下英飞凌手册的阅读规则,因为后面的文章会基于此文的一些缩写进行截图寄存器之类的。MCU在AUTOSAR架构里面的图示如下MCU驱动程序负责配置SCU、GTM、CCU6、GPT12和STM外设。驱动程序提供由AUTOSAR指定的运行时服务。

梦想技术家 2873

java全家桶之12:spring选择什么注册中心比较好

普适性首选Nacos(功能全面,灵活切换AP/CP)。云原生推荐(容器化环境)或Nacos(混合架构)。强一致性场景Consul(多语言支持)或Zookeeper(已有生态)。最终选型需结合团队技术栈和运维能力。例如,若团队熟悉K8s且追求云原生,可直接使用其Service机制;若需兼顾配置管理,Nacos的集成优势显著。

leijmdas的专栏 1223

大模型测试人员完整学习体系(分层成长路线 + 知识框架 + 落地实操)

本文系统构建了大模型测试工程师的4级能力成长体系:L1(测试执行)-L2(专项测试)-L3(质量体系)-L4(行业标准),详细拆解了每个阶段的核心技能图谱。重点包括:入门层需掌握传统测试基础和大模型产品逻辑;进阶层需精通Prompt用例设计、RAG测试、安全对齐、自动化评测等专项能力;高级层聚焦评测平台搭建与质量体系建设;专家层深入算法对齐与行业标准制定。文章配套提供了分阶段技术工具栈、3-12个月学习路径及5类实战项目建议,形成了一套完整的大模型测试人才能力培养框架。

SmallBull的博客 455

华为od 面试手撕代码题【完成任务最少小时】

华为od 面试手撕代码题【完成任务最少小时】

MISAYAONE的博客 1579

MCP生态的“应用商店“:如何快速搭建自己的服务注册中心

当AI助手需要扩展能力时,开发者面临一个现实问题:去哪里寻找可靠、安全的MCP服务器?就像手机需要应用商店来管理应用一样,AI系统也需要一个中心化的服务发现机制。这就是MCP注册表(Registry)诞生的背景——一个专为Model Context Protocol设计的"应用商店"。 ## 🔍 核心概念:元注册表的独特定位 与传统的npm、PyPI不同,MCP注册表是一个**元注册表**。

gitblog_00606的博客 798

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

k8s部署eureka集群

在K8S上部署eureka-server 本文参考地址:https://kuboard.cn/learning/k8s-practice/ocp/eureka-server.html#%E7%90%86%E8%A7%A3eureka-server 一、资源准备 代码参考eureka-server的代码仓库 在 Kubernetes 中部署多个 eureka-server 的实例组成集群时,主要有如下考虑因素: 每个 eureka-server 需要被赋予一个唯一的 id,通过字段 eureka.insta

han949417140的博客 2514

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

python微服务方案

python不像java那样拥有成熟的微服务方案,那么我们就该如何“微服务”呢?但是别忘了:我们的目的是有效地拆分应用,实现敏捷开发和部署,微服务只是结果

hey_girl_的专栏 9291

5分钟装完:ExplorerPatcher 把 Windows 11 任务栏改回 Windows 10 样式

每天在屏幕底部找三遍被"居中"的应用图标,点开始菜单还得先挪鼠标——Windows 11 这套新布局对老用户并不友好。ExplorerPatcher 把 Windows 11 的界面改回 Windows 10 样式:任务栏、开始菜单、Alt+Tab 窗口切换器都能换,安装后资源管理器重启一次,约 30 秒内生效,不需要重装系统。 ## 🪟 它替你改掉了什么 ExplorerPatcher 以

gitblog_00224的博客 652

Istio服务发现:多注册中心集成与服务同步

在现代云原生架构中,服务网格(Service Mesh)已成为微服务治理的核心基础设施。Istio作为业界领先的服务网格解决方案,其强大的服务发现能力是支撑整个网格稳定运行的关键。随着企业业务规模的不断扩大,单一Kubernetes集群往往无法满足需求,多集群、混合云架构成为常态。在这种复杂环境下,如何实现跨多个服务注册中心的服务发现与同步,成为了Istio面临的重要挑战。 本文将深入探讨Ist...

gitblog_00081的博客 419

高效部署MCP注册中心:5分钟快速配置实战指南

MCP注册中心(MCP Registry)是一个社区驱动的模型上下文协议(Model Context Protocol)服务器注册服务,为MCP客户端提供服务器发现功能。本文将提供完整的MCP注册中心部署指南,帮助开发者和系统管理员快速搭建自己的注册中心实例。 ## 项目快速概览与核心价值 MCP注册中心是MCP生态系统的核心组件,它充当MCP服务器的"应用商店",让开发者能够发布自己的MCP

gitblog_00320的博客 828

微服务通信基石:服务发现、负载均衡与API网关选型指南 (技术实战篇 4)

本文是微服务通信核心机制深度解析,涵盖分布式系统三大核心支柱:服务发现、负载均衡与API网关。下篇将深入gRPC与REST协议选型。

✨ 欢迎来唠嗑、切磋、一起成长!👋 766

服务注册与发现(下)

前言 本篇我们介绍一下 服务注册与发现的最后两种实现方式 ,Etcd & Nacos Etcd etcd 诞生于 CoreOS 公司,它最初是用于解决集群管理系统中 OS 升级的分布式并发控制以及配置文件的存储与分发等问题。基于此,etcd 被设计为提供高可用、强一致的小型 keyvalue 数据存储服务。 etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现。 Etcd 应用场景...

大痴小乙的博客 2748

Lark微服务架构详解:如何通过水平扩展满足高并发业务需求

Lark是一个基于Golang开发的高性能即时通讯服务端项目,采用先进的微服务架构设计,支持集群部署和水平扩展,能够轻松应对高并发业务场景,实现万人群消息秒级到达。🚀 ## 📊 为什么选择微服务架构? 在当今互联网应用中,即时通讯系统面临着巨大的挑战:用户量激增、消息并发量高、系统稳定性要求严格。传统的单体架构难以满足这些需求,而**Lark微服务架构**通过将系统拆分为多个独立的服务,实

gitblog_00635的博客 1009

Unity 游戏搬上微信小游戏:这套适配方案 5 步跑通、内存怎么压

你手里有一个 Unity 工程,想搬上微信小游戏平台?这篇讲清「微信小游戏 Unity 适配方案」适合谁、怎么起步、内存和资源要怎么控、上线前该盯哪些指标。读完能直接对照自己的项目排期。 > **minigame-unity-webgl-transform**:基于 WebGL + WebAssembly 的 Unity/团结引擎 → 微信小游戏转换方案与文档集,附 SDK 接入、性能优化、调试

gitblog_00775的博客 196
上一篇: Go微服务架构实战-中篇 1. k8s架构介绍
下一篇: Go微服务架构实战 中篇:3. 扩缩容、自愈和故障转移、滚动更新以及回退能力
stackfuture
博客等级 码龄5年 23粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值