“云原生”成为近年热词并不是一种偶然,它不是一个软件,也不是一种框架,而是一堆理念集合,以及围绕这些理念所产生的一些最佳实践的工具.云原生天然就是作用于服务架构的,可以视作一个服务微服务架构的生态系统。在我们前期的沙龙和在线课程中,为大家详解了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 的注册表中拉取到自己的本地缓存中来。收到响应后,就可以发送一个请求,调用库存服务扣减库存的接口。

本文图片来自于网络

欢迎点击“链接”了解更多精彩内容

推荐阅读

在线公开课 | 从理论走向实践,多角度详解Cloud Native

视频课程 | 云原生与微服务架构

阅读原文

干货 | 京东云原生容器—SpringCloud实践(一)的更多相关文章

  1. 干货 | 京东云托管Kubernetes集成镜像仓库并部署原生DashBoard

    在上一篇"Cloud Native 实操系列"文章中,我们为大家介绍了如何通过京东云原生容器实现Eureka的部署(

  2. 干货 | 京东云应用负载均衡(ALB)多功能实操

    应用负载均衡(Application Load Balancer,简称ALB)是京东云自主研发的一款七层负载均衡产品,主要面向HTTP和HTTPS流量的WEB应用程序,提供灵活的功能配置.应用负载均衡 ...

  3. 最佳案例 | QQ 相册云原生容器化之路

    关于我们 更多关于云原生的案例和知识,可关注同名[腾讯云原生]公众号~ 福利: ①公众号后台回复[手册],可获得<腾讯云原生路线图手册>&<腾讯云原生最佳实践>~ ②公 ...

  4. 最佳案例 | 游戏知几 AI 助手的云原生容器化之路

    作者 张路,运营开发专家工程师,现负责游戏知几 AI 助手后台架构设计和优化工作. 游戏知几 随着业务不断的拓展,游戏知几AI智能问答机器人业务已经覆盖了自研游戏.二方.海外的多款游戏.游戏知几研发团 ...

  5. Docker Data Center系列(一)- 快速搭建云原生架构的实践环境

    本系列文章演示如何快速搭建一个简单的云原生架构的实践环境. 基于这个基础架构,可以持续部署微服务架构的应用栈,演练敏捷开发过程,提升DevOps实践能力. 1 整体规划 1.1 拓扑架构 1.2 基础 ...

  6. 腾讯 Techo 开发者大会首发来袭!云原生中间件技术实践等你来!

    腾讯 Techo 开发者大会是由腾讯云发起的面向全球开发者和技术爱好者的年度盛会,2019 年 11 月 6 日 - 7 日将在北京嘉里大酒店首次召开. 作为一个专注于前沿技术研讨的非商业大会,Tec ...

  7. 百胜中国使用Rainbond实现云原生落地的实践

    百胜中国使用Rainbond实现云原生落地的实践 关于百胜中国 自从1987年第一家餐厅开业以来,截至2021年第二季度,百胜中国在中国大陆的足迹遍布所有省市自治区,在1500多座城镇经营着11023 ...

  8. 从 Spark 到 Kubernetes — MaxCompute 的云原生开源生态实践之路

    2019年5月14日,喜提浙江省科学技术进步一等奖的 MaxCompute 是阿里巴巴自研的 EB 级大数据计算平台.该平台依托阿里云飞天基础架构,是阿里巴巴在10年前做飞天系统的三大件之分布式计算部 ...

  9. Longhorn,企业级云原生容器分布式存储 - K8S 资源配置示例

    内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? Longhorn 企业级云原生容器分布式存储解决方案设计架构和概念 Longhorn 企业级云原生容器分 ...

随机推荐

  1. 数据结构——java Queue类

    定义 队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作. LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用 图例 Que ...

  2. JuJu团队12月3号工作汇报

    JuJu团队12月3号工作汇报 JuJu   Scrum 团队成员 今日工作 剩余任务 困难 于达 修改batch里给sentence加padding的方法 继续调试 无 婷婷 给crossentro ...

  3. LeetCode874 模拟行走机器人(简单模拟—Java之HashSet简单应用)

    题目: 机器人在一个无限大小的网格上行走,从点 (0, 0) 处开始出发,面向北方.该机器人可以接收以下三种类型的命令: -2:向左转 90 度-1:向右转 90 度1 <= x <= 9 ...

  4. 网卡工作原理和wireshark混杂模式

    通过设置网卡为混杂模式就能捕获局域网内所有发包内容,包括非广播包和非发给自己主机的数据包 这是为什么呢? 即主机A发送一个数据包给主机B,我作为主机C怎么也能截获这个数据包呢,原理是什么? 我的网卡为 ...

  5. SYSTEMTIME 获取日期之差

    #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <string.h& ...

  6. 查看linux硬件的信息

    cpu: cat  /proc/cpuinfo 内存: cat /proc/meminfo 查看内存使用情况: free -m     -m指以M的单位显示 查看硬盘使用情况: df -h       ...

  7. JPA#复杂查询#自定义查询

    编写自定义SQL基于下面信息:1. SpringData JPA 在为Repository接口生成实现的时候,会查找是否有 "接口名称"+"Impl"的类,如果 ...

  8. 六十九、SAP中内表插入的三种方法之三,INSERT的使用,用于指定位置插入

    一.代码如下 二.需要注意的时候,如果内表和工作区同名,这可以用隐式插入,不需要什么工作区INTO到什么表,INDEX为位置,效果图如下:

  9. ActiveMQ消息队列和SignalR之日志实时监控及警报小实例

    主要技术: log4net-生成日志. ActiveMQ-生成日志的时候发送消息,并实时监控日志. SignalR-将ActiveMQ监控的日志实时显示到浏览器上,而不用刷新浏览器. 小实例介绍: 左 ...

  10. Python MySQL 创建数据库

    章节 Python MySQL 入门 Python MySQL 创建数据库 Python MySQL 创建表 Python MySQL 插入表 Python MySQL Select Python M ...