当前位置: 首页 > 科技观察

云原生如何助力微服务?

时间:2023-03-15 19:18:18 科技观察

随着科技的发展,我们的云托管时代已经逐渐向云原生时代进化。所谓云原生,就是将微服务、DevOps的架构理念与云提供的容器、Serverless更好地结合起来,从而提高资源使用效率,提高研发和运维效率。那么在云原生时代,微服务和云原生应该如何互补呢?我们先看一下微服务的定义,也就是将单个应用拆分成多个微服务,微服务相互协作对外提供服务支持。微服务运行存在三个问题:1、如何管理微服务的生命周期;2、如何管理不同技术栈的微服务之间的通信;3、如何处理不同技术栈的微服务请求?让我们来看看如何管理微服务的生命周期。最初,服务是单一的。上线的时候可以直接部署一些机器资源。当出现异常时,机器上的服务版本直接下线。服务和资源之间的关系比较简单,没有动态依赖。当我们将服务拆分成微服务时,不同的微服务部署在不同的机器上,最后将整个应用呈现给用户。这时候服务和资源的关系就变得复杂了。如果应用是由不同的技术栈开发实现的,比如有的微服务使用C++,有的使用Java,有的使用PHP,还有的使用Golang,那么在部署每一个服务的时候都需要在机器上安装相应的运行环境,整个应用的运维成本增加了。但在云原生时代,有了Docker这样的容器,有了Kubernetes这样的容器平台技术,这一切都变得容易了。Docker容器技术通过标准的封装和标准的运行时,将微服务的部署标准化,而Kubernetes技术则使得在机器上运行标准化的微服务变得简单,运维人员不再需要将微服务分配到特定的机器上,Kubernetes中的Pod模型提供单个容器运行状态接口和DNS地址服务。通过简单的二次开发,可以看到每个微服务在哪个地址上的运行状态,简化了整个流程。微服务生命周期管理。让我们看看如何管理不同技术栈的微服务之间的通信。最初,服务是单体的,模块之间的通信通过静态编译生成,比较简单。当我们将服务拆分成微服务时,模块之间的通信是动态关联的,一个微服务如何找到另一个微服务就变得复杂了。一些微服务框架,比如Java的Spring,减轻了开发者的负担。只要是基于Java的服务开发,微服务之间通信的逻辑是不需要写的。但是,当业务引入多个技术栈时,上层用Java写,底层用Golang写是很常见的。不同微服务之间的通信框架不同,这无疑增加了开发者的成本。但是在云原生时代,我们有了ServiceMesh服务网格,通过通信劫持实现服务之间更好的通信监控和管理。在servicemesh中,有一个sidecar容器的概念,从业务中抽象出微服务之间通信的能力,分离到一个容器中与微服务并行运行,然后利用Istio提供的管控能力来整合微服务和边车。汽车容器形成一个网格数据平面,在该平面上进行服务间通信的配置、管理和监控。我们来看看如何处理不同技术栈的微服务请求。原来的外部请求通过浏览器或者app进来后,会通过应用层/网络层的负载均衡分配到哪台机器去处理。因为bodyapplication是一个大的整体,可以直接分布式,比较简单,而微服务需要经过复杂的逻辑来决定发送到哪个服务,发送到哪台机器。在多技术栈开发的情况下,每个微服务框架都需要编写一次请求逻辑。但是在云原生时代,我们有了serverless的概念。我们可以提取和标准化请求类型、请求管理和请求处理的逻辑。在业务层,只有前端需要调用这个函数,后面的请求处理Distribution不再管。微服务的出现确实推动了技术的演进向前迈进了一大步,但微服务并不是万能的。使用它时,您必须承担其复杂性的代价。不过,微服务确实是一剂良药。随着云原生技术的出现,这颗良药的副作用可以消除很多。云原生一定是企业实现微服务的绝佳伴侣~