随着云计算业务的快速发展,国内外云计算公司之间的专利之争也日趋激烈。
在云计算等技术领域,专利储备往往代表着企业最新的技术实力。
华云数据本期《华云智能》专栏将围绕《浅谈微服务架构的服务发现》技术,与大家分享云计算领域的最新技术。
由于业务量大幅增长,华云数据决定对因业务增长而变得臃肿的单一应用进行重构。
重构的应用选择了微服务架构。
微服务架构最大的优势就是语言的开放性。
您可以根据业务场景选择最合适的语言。
此外,对于拥有多个技术栈的公司组织结构来说,也能带来很好的整合协作机会。
华云数据的主要技术栈是JAVA和PHP。
JAVA就不用说了,它的微服务框架Spring Cloud对微服务的一站式支持非常全面、完善。
它只是一个微服务架构开发的工具,而PHP则有所欠缺,尤其是在服务管理部分。
比如注册和发现服务的时候比较痛苦。
我们的解决方案 1. 为什么使用服务发现?下图1是一个简单的高可用架构图。
我们看到集群组部署了3个节点,每个节点部署了一个服务A,前面有负载均衡。
以nginx做负载均衡为例,我们会在配置文件中手动配置这三个节点的服务A的地址,并按照负载策略进行转发。
图1 这是传统上比较常用的方法。
服务地址是固定的。
那么如果服务地址是弹性伸缩且可变的呢?如下图2。
图2与传统方法的不同之处在于服务地址是弹性扩展且可变的。
这种弹性带来的最大好处是,服务可以根据流量、CPU、内存等开销,按照一定的策略进行水平扩展或缩减。
除了支持大量的高峰访问之外,还可以带来巨大的成本节省。
另外,特别是docker及其衍生的Kubernates等软件或解决方案,为资源调度、弹性伸缩、架构监控等提供了良好的基础层保障。
回想起来,由于服务地址是可变的,手动配置肯定行不通。
我们需要一种机制来自动发现服务地址的变化。
2、服务发现机制和发现方法 这种机制就是服务发现,也是微服务架构中最常用的技术栈。
如下图3所示,我们引入一个注册中心。
服务实例启动时自动将地址注册到注册中心。
访问相应的服务时,首先通过注册中心获取要访问的服务实例的地址,然后按照一定的策略进行访问。
图3的好处主要有两个: 1、解决上面提到的服务地址变更的问题; 2、注册中心可以监控相应服务的状态。
有了它,我们可以知道微服务架构中有多少个服务,版本是什么,每个服务有多少个实例,它们的状态是什么。
服务发现有两种方式: 2.1 服务器端发现 1)服务实例启动时自动将地址发布到注册中心。
2)当客户端/服务器调用服务时,它会使用服务名称调用负载均衡器。
负载均衡器接收请求,从注册中心获取服务地址(有多个),并根据负载策略访问特定的服务地址。
服务。
这种方式最大的优点是服务端实现服务发现和加载,客户端根本不需要做任何额外的事情。
强烈推荐此方法。
如下图4所示。
图42.2 客户端发现 从下图5可以看出,与服务器发现的区别在于,要访问的服务的地址是客户端从注册中心获取的,需要客户端实现加载(例如:需要访问的服务地址为3,那么客户端需要根据一定的负载策略找到其中一个地址进行访问)。
图5这种方法最大的特点就是灵活性。
客户端或者微服务可以根据自己的业务场景选择最佳的负载策略。
但缺点也很明显。
客户端或微服务需要考虑负载。
这在JAVA中是没有问题的。
它的spring cloud框架非常强大,可以支持。
不过PHP等语言会很痛苦,所以我个人推荐使用服务器端发现的方式。
如下图6,服务端发现可以使用consul template+nginx 图63、工具介绍及总结 Netflix OSS是一个典型的客户端发现示例; Netflix Eureka 是服务注册中心,Netflix Ribbon 是 IPC 客户端,与 Eureka 一起实现了 CLB。
没有明确支持 docker。
Consul是一个典型的服务器端发现示例;它通过consul模板监控consul中服务地址的变化,自动生成或更新nginx.conf,并生效。
对docker有很好的支持。
微服务架构的本质决定了它的复杂性。
微服务有成百上千个,每个微服务可能分布在多个不同的节点上,所以全栈监控非常重要,而服务发现就是其中非常重要的一环。
通过它,我们知道整个系统有多少个微服务,它们的版本是什么,每个服务有多少个实例,它们的状态是什么。
这些是完整的自动化运维架构的基础。
最大限度地发挥微服务架构的价值非常重要,大大减少运维人员在部署和故障排除方面的冗余工作,大大提高工作效率。