云原生时代 PHP/Golang 项目如何实现微服务

原文:https://wenda.swoole.com/detail/108785

前言

在传统架构下,我们需要使用服务发现、服务注册等技术实现微服务架构。通常我们需要将服务提供方(Service Provider)的节点(IP:PORT)保存在 ZooKeeperETCDConsulNacos 等服务管理组件,服务调用方(Service Customer)可以读取到节点列表,发起 RPC 调用,建立连接并发送请求、接收响应。

通常我们需要依赖特定框架的实现,比如 Spring CloudDubbleHyperf 等框架。在云原生时代实现微服务不再需要这样,我们可以直接使用 K8s 提供的 Service 来实现微服务架构,将服务注册发现下沉到系统底层。可靠性更高,稳定性更好,而且是天然跨语言的,Java、PHP、Golang 都可以使用,开发框架也会变得更简单,不需要做任何事情,只需要实现服务的逻辑,监听本机端口即可。

K8s Service 介绍

Service 是 K8s 提供的发现后端 Pod 的一种机制,为一组具有属于同一个 Deployment 的所有 Pod 提供了统一的入口地址,将请求进行负载分发到各个 Pod 。

在 K8s 中 Pod 就相当于是 Linux 系统的进程,是执行应用程序的容器组。如何访问 Pod 中的服务呢?直接去连接 Pod 的 IP:Port 肯定是不行的,因为它是不稳定的,随时可能会发生调度而重启,Pod 的生命周期是非常短暂的。而 Pod 重启之后 IP 端口会发生变化。一个服务或应用通常会有 1-N 个 Pod,请求 Service 的 IP:PORT 时会自动负载均衡并转发到其中一个 Pod,Service 一般是使用 kube-proxy 和 Linux 内核提供的 IPVS 技术实现。也可以理解为 Service 其实就是一个4层代理,后端是应用的 Pod,在 Service 之前我们可以设置 Ingress 接入网关,允许从集群外部访问,一般对外服务的 HTTP 接口就是这个方式。也可以直接使用,只允许内部访问,这就是微服务模式。

在 Code-Galaxy 平台上使用 Service

K8s 为每个Service分配了一个 Name,这个 Name 已经注册到了 CoreDNS 中,可直接使用 gethostbyname 或其他 DNS 解析方法,将 Server Name 解析成 Service 的 IP 地址。 一个 Service 需要设置对外端口,也就是访问此 Service 对外暴露的端口,另外一个是内部端口,也就是 Pod 的端口。Pod 相关的信息会被保存在 K8s 的 ETCD 分布式存储中。

例如使用 Hyperf 框架,默认会监听 9501 端口,对外希望服务调用方直接通过 80 端口访问,那 Service 的内:外分别就是 9501:80 。这时就在其他服务中就可以使用 HTTP 客户端访问 http://ServiceName:80/ 来请求此服务了。

不同的命名空间互相访问时,需要在Server Name之后追加.{$namespace}

参考:

  1. https://blog.csdn.net/huahua1999/article/details/124237065
  2. https://blog.51cto.com/u_15049785/4174726
avatar
韩天峰
Swoole 开源项目创始人

Swoole 开源项目创始人

7.7k 声望
11.1k 粉丝
0 条评论
推荐阅读
Think-Swoole: 全面协程化你的 ThinkPHP 应用
ThinkPHP 是一款经典的国产开源 PHP 开发框架。ThinkPHP 诞生于 2006 年,距今已经有 17 年历史。ThinkPHP 在国内的应用非常广泛,很多知名企业使用了 ThinkPHP 来构建 Web 项目。

韩天峰阅读 350

一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。
前言秒杀和高并发是面试的高频考点,也是我们做电商项目必知必会的场景。欢迎大家参与我们的开源项目,提交PR,提高竞争力。早日上岸,升职加薪。知识点详解秒杀系统架构图秒杀流程图秒杀系统设计这篇文章一万多...

王中阳Go33阅读 2.4k评论 1

封面图
前端如何入门 Go 语言
类比法是一种学习方法,它是通过将新知识与已知知识进行比较,从而加深对新知识的理解。在学习 Go 语言的过程中,我发现,通过类比已有的前端知识,可以更好地理解 Go 语言的特性。

robin23阅读 3.2k评论 6

封面图
Golang 中 []byte 与 string 转换
string 类型和 []byte 类型是我们编程时最常使用到的数据结构。本文将探讨两者之间的转换方式,通过分析它们之间的内在联系来拨开迷雾。

机器铃砍菜刀24阅读 57.9k评论 2

年度最佳【golang】map详解
这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。

去去100216阅读 11.5k评论 2

年度最佳【golang】GMP调度详解
Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析...

去去100215阅读 11.9k评论 4

万字详解,吃透 MongoDB!
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常...

JavaGuide8阅读 1.6k

封面图
avatar
韩天峰
Swoole 开源项目创始人

Swoole 开源项目创始人

7.7k 声望
11.1k 粉丝
宣传栏