原创: 王淼
“云原生”成为近年热词并不是一种偶然,它不是一个软件,也不是一种框架,而是一堆理念集合,以及围绕这些理念所产生的一些最佳实践的工具.云原生天然就是作用于服务架构的,可以视作一个服务微服务架构的生态系统。在我们前期的沙龙和在线课程中,为大家详解了Cloud Native相关的知识点,接下来的一个月中,我们将会从实践的角度为大家带来相关实操文档。让大家可以更近距离地感受“云原生”。
【导言】
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。对于开发者来说,Spring Cloud有着使用方便、使用门槛较低、组件条理清晰、更新频率快、持续性可以得到保证等优势。
微服务的实现需要有标准化的交付技术来支撑,容器的持续集成、版本控制、可移植性、隔离性和安全性等优势很好地满足了这个需求。从微服务的角度看,容器可以被看做是开发和运维之间的桥梁,使得微服务环境开发和运维变得更加简单、高效。
京东云原生容器是基于京东在容器技术方面的深厚积淀,发布的创新型容器产品。该产品充分融合了容器和虚拟机的优点,无需管理虚拟机或集群,为用户打造安全、易用的容器服务,通过灵活计费方式,有效降低用户的投入成本。
京东云原生容器还支持原生容器Pod,原生容器Pod兼容Kubernetes Pod定义,一个Pod内可以封装多个共享内核、网络、文件系统的原生容器。另外,京东云容器镜像仓库提供容器镜像存储、分发平台,提供安全、可靠的镜像服务,与京东云原生容器、Kubernetes集群服务无缝集成,为基于容器的应用提供一站式部署服务。帮助企业快速实现应用开发、部署和运维。
在本系列文章中,我们探讨在京东云的容器服务上,如何利用Spring Cloud来构造一个微服务应用。
第一节重点介绍如何通过京东云原生容器实现Eureka的部署。
一、服务注册与发现Eureka
当子系统与子系统之间不是在同一个环境下,那就需要远程调用。远程调用可能就会想到HttpClient,Web Service 等这些技术来实现。在服务多的情况下,手动来维护这些静态配置非常复杂。为了解决微服务架构中的服务实例维护问题(ip地址),产生了大量的服务治理框架和产品。在 Spring Cloud 中我们的服务治理框架一般使用的就是 Eureka。
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。
在SpringCloud框架中,所有的组件服务一般都需要向注册中心Eureka进行服务注册;微服务的配置一般都统一由配置中心config进行管理。Eureka在SpringCloud框架中与其他组件的关系如图:
Eureka包含两个组件:Eureka Server和Eureka Client。
Eureka Server,即服务注册中心。它同其他服务注册中心一样,支持高可用配置。依托于强一致性提供良好的服务实例可用性,可以应对多种不同的故障场景。Eureka服务端支持集群模式部署,当集群中有分片发生故障的时候,Eureka会自动转入自我保护模式。它允许在分片发生故障的时候继续提供服务的发现和注册,当故障分配恢复时,集群中的其他分片会把他们的状态再次同步回来。集群中的的不同服务注册中心通过异步模式互相复制各自的状态,这也意味着在给定的时间点每个实例关于所有服务的状态可能存在不一致的现象。
Eureka Client,主要处理服务的注册和发现。客户端服务通过注册和参数配置的方式,嵌入在客户端应用程序的代码中。在应用程序启动时,Eureka客户端向服务注册中心注册自身提供的服务,并周期性的发送心跳来更新它的服务租约。同时,他也能从服务端查询当前注册的服务信息并把它们缓存到本地并周期行的刷新服务状态。
使用Eureka需要注意如下事项:
1、服务续约任务调用时间间隔,默认30s
2、服务缓存清单默认每30s更新一次
3、服务失效时间默认90s
4、默认每60s讲当前清单中超过90s(没有续约)的服务剔出去
5、自我保护机制的工作机制是如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制。(Eureka自我保护机制,通过配置 eureka.server.enable-self-preservation来true打开/false禁用自我保护机制,默认打开状态,建议生产环境打开此配置)
二、创建Eureka-server
首先,需要搭建一个空的maven工程,其它模块都可以放入该工程里面。
创建完成后删除src目录,然后新建一个server,选中project → new → module,注意选择Spring initializr
填写server名字
下一步,选择Cloud Discovery,加入Eureka Server组件
完成后目录如下:
Eureka-Server下pom.xml文件如下
接下来需要修改启动类 EurekaServerApplication.java,添加@EnableEurekaServer
和@SpringBootApplication,如下所示
在默认情况下,服务注册中心也会把自己当做是一个服务,将自己注册进服务注册中心,所以我们可以通过配置来禁用他的客户端注册行为,修改application.properties文件:
启动应用,并访问http://localhost:8080/即可看到Eureka信息面板,如下:
可以看到此时是没有实例在跑的
三、创建Eureka-client
创建方式如eureka-server模块类似;在选择组件的时候需要选择对应的组件:
注意要选择Web组件或者其它能够持久运行的。不然会注册失败。另外要选择cloud discovery里面的eureka discovery。
创建后,添加@EnableEurekaClient和@SpringBootApplication
修改配置文件application.properties
先启动:eureka-server
然后启动eureka-client
发现多了一条实例。
说明创建成功。
四、发布成docker镜像
首先安装docker integration,在settings→Plugins里面搜索docker,如下:
完成后,在settings→Docker下面测试连接
测试成功后启动容器服务
创建dockerfile
编写dockerfile文件
在容器里面运行
运行成功,可以看到docker containers里面多了eureka-server
同时在images里面多了server的镜像
Client也是如上操作,client的dockerfile如下:
五、在京东云原生容器部署
注册表为kstore,镜像仓库为eureka,镜像版本号为latest,地域选择华北-北京为cn-north-1。用户可根据具体情况修改。
使用京东云CLI获取登录指定注册表的临时令牌或在控制台获取临时令牌:
jdc cr get-authorization-token --region-id cn-north-1 --registry-name kstore
使用临时令牌,登录到京东云的注册表;如您使用京东云CLI获取临时令牌,请输入返回的Docker客户端登录命令:
docker login -u jdcloud -p * kstore-cn-north-1.jcr.service.jdcloud.com
将镜像推送到京东云镜像仓库,本地镜像例为eureka-server:latest
标记待推送到京东云镜像仓库中的本地镜像:
docker tag eureka-server:latest kstore-cn-north-1.jcr.service.jdcloud.com/eureka:latest
将已标记的镜像推送到京东云镜像仓库:
docker push kstore-cn-north-1.jcr.service.jdcloud.com/eureka:latest
发布成功后在控制台可以看到镜像信息
之后通过镜像创建原生容器
查看容器状态
查看应用状态
给容器绑定公网IP后再访问验证
同样,可以通过镜像创建Pod
六、小结
本文介绍了如何通过Eureka进行服务注册和发现,如何发布镜像等内容。最后介绍了如何通过京东云原生容器构建示例中的服务镜像。可以看到整个镜像构建、上传、部署非常简洁。京东云原生容器让用户专注于应用程序,快速使用容器。并且可以让用户在同一私有网络中实现容器实例与公有云计算、存储、网络等资源内网互通,充分利用丰富产品资源。
对于一套基于微服务框架搭建的电商系统,可能分为库存服务、仓储服务、积分服务等不同的微服务。而每个服务中都有一个 Eureka Client 组件,这个组件专门负责将这个服务的信息注册到 Eureka Server 中,告诉 Eureka Server自己在哪台机器上,监听着哪个端口。Eureka Server保存了各服务所在的机器和端口号。
完成本文Eureka部署后,可以对原有系统的服务进行改造,将Eureka Client放到不同的服务中。在实际请求中,比如一个订单下单库存扣减流程,订单服务的 Eureka Client会找 Eureka Server 查找库存服务所在实例位置,监听的端口号等,然后就可以把这些相关信息从 Eureka Server 的注册表中拉取到自己的本地缓存中来。收到响应后,就可以发送一个请求,调用库存服务扣减库存的接口。