原标题:服务化改造实践(二)| Dubbo + Kubernetes

摘要: “没有最好的技术,只有最合适的技术。”我想这句话也同样适用于微服务领域,没有最好的服务框架,只有最适合自己的服务改造。在Dubbo的未来规划中,除了保持自身技术上的领先性,关注性能,大流量,大规模集群领域的挑战外,围绕Dubbo核心来发展生态,将Dubbo打造成一个服务化改造的整体方案也是重点之一。

“没有最好的技术,只有最合适的技术。”我想这句话也同样适用于微服务领域,没有最好的服务框架,只有最适合自己的服务改造。在Dubbo的未来规划中,除了保持自身技术上的领先性,关注性能,大流量,大规模集群领域的挑战外,围绕Dubbo核心来发展生态,将Dubbo打造成一个服务化改造的整体方案也是重点之一。这是我们将推出“服务化改造”系列文章的第二篇,通过在一些外围系统和服务化基础组件上的开发实践,分享Dubbo生态下的服务化改造收获和总结。

第一篇回顾:Dubbo + ZooKeeper

大体目标

大体上:Dubbo的provider不在关心服务注册的事宜,只需要把其Dubbo服务端口打开,由kubernetes来进行服务的声明和发布;Dubbo的consumer在服务发现时直接发现kubernetes的对应服务endpoints,从而复用Dubbo已有的微服务通道能力。好处是无需依赖三方的软负载注册中心;同时无缝融入kubernetes的多租户安全体系。Demo的代码参照: http://gitlab.alibaba-inc.com/kongming.lrq/dubbo-kubernetes/tree/master

闲淡

Kubernates是建立在扩展性的具备二次开发的功能层次丰富的体系化系统

首先其最核心的功能是管理容器集群,能管理容器化的集群(包括存储,计算),当然这个是建立在对容器运行时(CRI),网络接口(CNI),存储服务接口(CSI/FV)的基础上;

其次是面向应用(包括无状态/有状态,批处理/服务型应用)的部署和路由能力,特别是基于微服务架构的应用管理,具备了其服务定义和服务发现,以及基于configmap的统一配置能力;

在基础资源(主要是抽象底层IaaS的资源)和应用层的抽象模型之上是治理层,包含弹性扩容,命名空间/租户,等。当然,基于其原子内核的基础能力,在Kubernetes的核心之上搭建统一的日志中心和全方位监控等服务是水到渠成的,CNCF更是有其认定推荐。

来张Kubernetes Architecture的一张图解释下上述描述。在2018年Kubernetes往事实的paas底座的标配迈出质的一步,有人说原因在于基于扩展的二次开发能力,有人说在于其声明式编程和背靠Google和Redhat的强大社区运作,我觉得回归本质是在于下图中的__Layered架构和其问题域的领域建模抽象__。

以微服务架构视角,Kubernetes在一定意义上是微服务框架(这时较叫微服务平台或toolkit集更合适),支持微服务的服务发现/注册的基本能力。借用如下图做一个简单描述。

话题再展开一下,微服务领域涉及众多问题,大概可以用下图说明。

kubernetes解决得只是少部分,而像动态路由,稳定性控制(断路器,隔水舱等),分布式服务追踪等是个空白,这也就是servicemesh要解决的,是在CNCF的Trail Map占有重要一席;当然Dubbo是基本具备完备的微服务,也就是使得其集成到k8s体系下具有相当的意义。Dubbo在serviemesh中基于sidecar的方案是解决跨语言诉求的通用servicemesh方案,需要新开一个话题来展开说;而引用serviemsh的原始定义:

A service mesh is a dedicated infrastructure layer for handling service-to-service communication. It’s responsible for the reliable delivery of requests through the complex topology of services that comprise a modern, cloud native application.

首先服务网格是一个云原生环境下基础设施层,功能在于处理服务间通信,职责是负责实现请求的可靠传递,被使得被监控跟踪,被治理,最终使得微服务架构被赋予高可控的稳定性和快速的问题定位排查能力。

可以得出现有Dubbo集成云原生基础设施kubernetes的基础能力而并解决微服务相关核心问题也算是一种狭义上的servicemesh方案,只是是Java领域的罢了;当玩笑理解也行,哈哈。

思路/方案

kubernetes是天然可作为微服务的地址注册中心,类似于zookeeper, 阿里巴巴内部用到的VIPserver,Configserver。 具体来说,kubernetes中的Pod是对于应用的运行实例,Pod的被调度部署/启停都会调用API-Server的服务来保持其状态到ETCD;kubernetes中的service是对应微服务的概念,定义如下

A Kubernetes Service is an abstraction layer which defines a logical set of Pods and enables external traffic exposure, load balancing and service discovery for those Pods.

概括来说kubernetes service具有如下特点

每个Service都有一个唯一的名字,及对应IP。IP是kubernetes自动分配的,名字是开发者自己定义的。

Service的IP有几种表现形式,分别是ClusterIP,NodePort,LoadBalance,Ingress。 ClusterIP主要用于集群内通信;NodePort,Ingress,LoadBalance用于暴露服务给集群外的访问入口。

乍一看,kubernetes的service都是唯一的IP,在原有的Dubbo/HSF固定思维下:Dubbo/HSF的service是有整个服务集群的IP聚合而成,貌似是有本质区别的,细想下来差别不大,因为kubernetes下的唯一IP只是一个VIP,背后挂在了多个endpoint,那才是事实上的处理节点。

此处只讨论集群内的Dubbo服务在同一个kubernetes集群内访问;至于kubernetes外的consumer访问kubernetes内的provider,涉及到网络地址空间的问题,一般需要GateWay/loadbalance来做映射转换,不展开讨论。针对kubernetes内有两种方案可选:

DNS: 默认kubernetes的service是靠DNS插件(最新版推荐是coreDNS), Dubbo上有个proposal是关于这个的。我的理解是static resolution的机制是最简单最需要支持的一种service discovery机制,具体也可以参考Envoy在此的观点,由于HSF/Dubbo一直突出其软负载的地址发现能力,反而忽略Static的策略。同时蚂蚁的SOFA一直是支持此种策略,那一个SOFA工程的工程片段做一个解释。这样做有两个好处,1)当软负载中心crash不可用造成无法获取地址列表时,有一定的机制Failover到此策略来处理一定的请求。 2)在LDC/单元化下,蚂蚁的负载中心集群是机房/区域内收敛部署的,首先保证软负载中心的LDC化了进而稳定可控,当单元需要请求中心时,此VIP的地址发现就排上用场了。

API:DNS是依靠DNS插件进行的,相当于额外的运维开销,所以考虑直接通过kubernetes的client来获取endpoint。事实上,通过访问kubernetes的API server接口是可以直接获取某个servie背后的endpoint列表,同时可以监听其地址列表的变化。从而实现Dubbo/HSF所推荐的软负载发现策略。具体可以参考代码:

以上两种思路都需要考虑以下两点

kubernetes和Dubbo对于service的名字是映射一致的。Dubbo的服务是由serviename,group,version三个来确定其唯一性,而且servicename一般其服务接口的包名称,比较长。需要映射kubernetes的servie名与dubbo的服务名。要么是像SOFA那样增加一个属性来进行定义,这个是改造大点,但最合理;要么是通过固定规则来引用部署的环境变量,可用于快速验证。

端口问题。默认Pod与Pod的网络互通算是解决了。需要验证。

Demo验证

下面通过阿里云的容器镜像服务和EDAS中的kubernetes服务来做一次Demo部署。

访问阿里云-》容器镜像服务,创建镜像仓库并绑定github代码库。如下图

点击管理进行创建好的仓库,通过镜像服务下的构建功能,把demo构建成image,并发布到指定仓库。如下图。

切换到企业级分布式应用服务(EDAS)产品,在资源管理 - 》集群 下创建kubernetes集群并绑定ECS,如下图.

应用管理 -》创建应用,类型为kubernetes应用 并且指定在容器镜像服务中的镜像。如下图。

创建完成后,进行应用部署。如下图

补充

应用名不能有大写字母,是要小写,否则有部署失败的问题。

在创建应用时,选中镜像后,下一步的按钮无法点击,需要点击选择继续。

EDAS有两套独立的kubernetes服务,一套是基于阿里云的容器服务,一套是Lark自己搞的。本人体验的是后者。

Docker与IDE集成的开发联调,需要考虑集成IDEA的相关插件。

作者:中间件小哥

本文为云栖社区原创内容,未经允许不得转载。返回搜狐,查看更多

责任编辑:

dubbo k8s 服务发现_服务化改造实践(二)| Dubbo + Kubernetes相关推荐

  1. dubbo k8s 服务发现_服务化改造实践(二)| Dubbo + Kubernetes-阿里云开发者社区

    "没有最好的技术,只有最合适的技术."我想这句话也同样适用于微服务领域,没有最好的服务框架,只有最适合自己的服务改造.在Dubbo的未来规划中,除了保持自身技术上的领先性,关注性能 ...

  2. dubbo k8s 服务发现_工商银行基于 Dubbo 构建金融微服务架构的实践-服务发现篇

    作者 | 张远征来源|阿里巴巴云原生公众号 导读:Dubbo 作为分布式微服务框架,众多公司在实践中基于 Dubbo 进行分布式系统架构.重启开源后,我们不仅看到 Dubbo 3.0 最新的 Road ...

  3. dubbo k8s 服务发现_将Dubbo微服务迁移到k8s集群环境中前的思考与落地

    将Dubbo微服务迁移到k8s中的思考与落地 说到容器化,不得不提kubernetes这个集群编排系统,它是一个开源系统,用于容器化应用的自动部署.扩缩和管理. Kubernetes 将构成应用的容器 ...

  4. 服务化改造实践 | 如何在 Dubbo 中支持 REST

    什么是 REST REST 是 Roy Thomas Fielding [[1]](#fn1) 在 2000 年他的博士论文 [[2]](#fn2) "架构风格以及基于网络的软件架构设计&q ...

  5. 服务化改造实践 | 如何在 Dubbo 中支持 REST 1

    什么是 REST REST 是 Roy Thomas Fielding [[1]](#fn1) 在 2000 年他的博士论文 [[2]](#fn2) "架构风格以及基于网络的软件架构设计&q ...

  6. Nacos2.0的K8s服务发现生态应用及规划

    简介:Nacos 是阿里巴巴于 2018 年开源的注册中心及配置中心产品,帮助用户的分布式微服务应用进行服务发现和配置管理功能.随着 Nacos2.0 版本的发布,在性能和扩展性上取得较大突破后,社区 ...

  7. Dubbo源码分析(三) -- Dubbo的服务发现源码深入解析4万字长文

    前言 前面两篇基本上已经对dubbo的SPI,服务发布,注册等功能进行了分析,那么在消费端是如何发现服务,并进行透明的远程调用的呢?带着这个疑问,走入今天的篇章,Dubbo的服务发现 服务发现的流程 ...

  8. Prometheus 基于k8s服务发现通过Cadvisor监控Kubernetes

    Prometheus服务发现 Prometheus添加被监控端支持两种方式: • 静态配置:手动配置 • 服务发现:动态发现需要监控的Target实例 支持服务发现的来源 • azure_sd_con ...

  9. k8s 服务发现 kubeDNS

    k8s 服务发现 kubeDNS 一.k8s 服务发现 kubeDNS 1.1 kubeDNS 1.2 服务发现类型 1.2.1 基于环境变量的服务发现 1.2.2 基于DNS的服务发现 一.k8s ...

最新文章

  1. android倒计时实现方法,Android实现倒计时方法汇总
  2. 从零开始学OpenDaylight(碳版本)之三:Hello示例
  3. java mina unix client
  4. .NET Core 2.0应用程序大小减少50%
  5. selenium之 chromedriver与chrome版本映射表_NLP实战篇之tf2训练与评估
  6. Best Friend Forever
  7. 利用SuppressMessage来阻止FxCop进行代码分析时报出的警告
  8. Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (15) - L1数据缓存/读写地址转换
  9. BZOJ 1568 Blue Mary开公司
  10. 奇安信代码安全实验室获授华为鲲鹏计算平台漏洞奖励计划合作伙伴
  11. 八段锦八个动作名称_【健康养生】道家养生八段锦详细动作演示——教学版
  12. let var const的区别
  13. Android Canvas.DrawLine绘制线段
  14. html+css个人简历/网页界面
  15. HTML:利用canvas画定位图标
  16. 如何进行网站流量分析?你需要知道这些指标
  17. 跟着廖雪峰学python 006
  18. FPGA原理和结构简介
  19. NLP入门开源实践总结
  20. 一个语法分析器的实现

热门文章

  1. C++ : KMP 字符串匹配算法
  2. python三种基本控制结构_Python学习手册之控制结构(一)
  3. php 升序 排序字符串,PHP asort():对数组排序(升序),并保持索引关系
  4. pstack 安装linux_pstack命令_Linux pstack 命令用法详解:显示每个进程的栈跟踪
  5. ESD静电二极管,在汽车电子中的应用
  6. 做一名真正的软件工程师
  7. 计算机网络与通信基础知识,计算机网络与通信基础/谢雨飞
  8. 双击背面截图_ios14怎么轻点双击背面截屏 敲击苹果手机背部截图设置教程
  9. 湖南计算机职业中专学校,()湖南职业中等专业学校介绍全日制中专学校2021招生计划...
  10. Centos与Ubuntu