Spring Cloud 是一系列框架的有序集合。它利用 Spring Boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 Spring Boot 的开发风格做到一键启动和部署。对于开发者来说,Spring Cloud 有着使用方便、使用门槛较低、组件条理清晰、更新频率快、持续性可以得到保证等优势。
微服务的实现需要有标准化的交付技术来支撑,容器的持续集成、版本控制、可移植性、隔离性和安全性等优势很好地满足了这个需求。从微服务的角度看,容器可以被看做是开发和运维之间的桥梁,使得微服务环境开发和运维变得更加简单、高效。
在本系列文章中,我们探讨在京东云的容器服务上,如何利用 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 的注册表中拉取到自己的本地缓存中来。收到响应后,就可以发送一个请求,调用库存服务扣减库存的接口。
评论