热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于SpringCloud的微服务容器化实践

近几年,互联网飞速发展的同时,也推动了云计算、大数据、人工智能的快速落地,数据本身价值也得到提升。互联网发展对应用开发提出了更高要求。首先

640

近几年,互联网飞速发展的同时,也推动了云计算、大数据、人工智能的快速落地,数据本身价值也得到提升。互联网发展对应用开发提出了更高要求。首先数据采集的量级和效率提高,传统的单体架构将出现瓶颈,其次是数据联通性的需求,对数据对接必须保证高性能、高安全、高标准。使用微服务架构恰好解决了大部分痛点。
本次主要介绍基于Spring Cloud构建微服务,以及配套的DevOps思路,并着重介绍在Docker容器里如何部署基于Spring Cloud的微服务。


1、基于Spring Cloud构建微服务

640

历史总是惊人的相似,合久必分,分久必合。我们经历了“合”:单体架构(软)、计算能力超强的小型机(硬)到“分”:分布式架构的转变,后期可能会将分发挥到了极致(去中心化的分布式,如区块链),最后很可能再经历“合”:计算和存储能力超强的“智人”(集超级计算和存储一身的人工智能)。
单体架构也有自身优势,这里不做详细介绍,大家在做架构选型时可以根据公司组织架构和业务需求综合考虑。
Spring Cloud作为Java语言的微服务框架,它依赖于Spring Boot,是由Pivotal团队提供的全新Web框架。有快速开发、持续交付和容易部署等特点。Spring Cloud提供了开发分布式服务系统的一些常用组件,例如服务注册和发现、配置中心、熔断器、智能路由、微代理、控制总线、全局锁、分布式会话等。
先看看我们使用的一个架构:

640


  • 服务发现中心(Service Discovery):服务注册与发现组件(选用Erueka)

  • 监控面板(Monitor Dashboard):整合了熔断监控(选用Hystrix)、服务调用链路监控(选用Spring Cloud Sleuth)

  • 日志分析面板(Logging Analyses):基于efk构建的日志采集系统

    服务网关(Edge Server):服务网关组件(Zuul & Spring Cloud Security)

  • OAuth认证服务器(OAuth Authorization Server):授权认证模块(Spring Cloud security OAuth2)

  • 配置服务器(Configuration Server):配置中心(Spring Cloud Config & Spring Cloud Bus)



2、基于微服务架构体系的DevOps思路

640

DevOps带来的不仅是技术挑战,还受公司组织架构和文化影响,这里是从技术角度去实现的思路。
先看两个微服务应用案例:
案例1:基于微服务架构的接口开发
平台主要提供Restful API服务,服务方式多样,其中一个最简单的案例流程如下:
  • 首先企业通过申请账号、密码和需要调用的API

  • 平台针对申请企业创建可调用API的账号和密码,并将该企业调用端IP加入服务白名单,用户可在平台下载文档、SDK,并进行测试

  • 企业根据用户名、密码去获取token,并在请求header中加入申请的token调用接口


640


案例2:基于微服务架构的应用开发
Web应用开发采用前后端分离方式,前端采用AngularJS,后端仍是基于Spring Cloud的微服务,整套系统部署到容器云实现CI/CD,架构如下图所示:

640


微服务引入增加了团队配合、测试、运维等后续一系列操作的复杂度,必须考虑自动化,因此需要有一套CI/ CD方案应对:

640


大致流程:
  1. 研发完成本地开发和测试提交代码

  2. 代码连同Dockerfile等构建文件一起push到GitLab(可以自己搭建)

  3. 代码提交触发Jenkins自动构建

  4. Jenkins调用单元测试、代码检查等测试任务,如果测试通过自动构建Docker镜像

  5. Jenkins将构建好的镜像推送到私有镜像仓库(自己搭建Harbor镜像库)

  6. Jenkins调用容器管理平台(我们使用的Rancher)的接口进行升级

  7. 容器管理平台拉取镜像完成部署(测试环境or生产环境)


说明:这里我们不仅使用了Docker,还选用容器编排工具构建了容器云平台,以方便我们快速实现CI/CD。大家可以根据自己情况选择,如Kubernetes、Rancher(Rancher 2.0以后底层使用的编排工具也是Kubernetes)等。


3、Spring Cloud基于Docker的实践

640

我们使用Docker,主要因为以下4点:
  1. Docker提供一个简单、轻量的建模方式

  2. Docker使团队职责的逻辑分离

  3. 可以实现快速高效的开发生命周期

  4. 团队使用面向服务的架构


以下介绍如何构建Docker镜像和配置细节。
1. 项目目录
Dockerfile及相关文件一般放到项目子目录,由开发维护。这种方式对研发提出了更高的技能要求,这也是近期全栈工程师比较火的一个原因。当然,具体协作方式还是根据公司情况定。以下是我们的项目目录:

640


2. 编写Dockerfile(供参考)
注:配合自动化工具使用效果更好。

FROM harbor.jry.com/library/alpine-jdk-time:slim
ADD *.jar service.jar
COPY formFile /
ENTRYPOINT [ "sh""-c""java -jar service.jar" ]

3、模块配置

我们将Spring Cloud相关的配置放到了bootstrap.yml文件,需要注意的配置如下:

640


注意标红部分,服务要以IP地址方式注册到注册中心,否则注册中心无法做心跳检测,因为容器之间默认无法通过hostname通信。我们也可以搭建内部DNS方式解决此问题。
服务发现中心建议配置成高可用(比如两个注册中心互相注册),也需要上图配置。
4、打包构建
这里截取了Jenkins里的打包及构建命令:

  1. 打包

    640

  2. 构建

    640


5、容器启动配置(docker-compose.yml)


version: '2'
services:
  zipkin:
    image: harbor.jry.com/zipkin:v1.0.1
    environment:
      eureka.client.service-url.defaultZone: http://discovery:8761/eureka/
    stdin_open: true
    tty: true
     links:
    - discovery2:discovery
     volumes:
    - /data/log:/target/log
    ports:
    - 9411:9411/tcp


  service-config:
    image: harbor.jry.com/service-config:v1.0.1
    hostname: config
    environment:
      eureka.client.service-url.defaultZone: http://discovery:8761/eureka/
    stdin_open: true
    tty: true
    links:
    - discovery2:discovery
    volumes:
    - /data/log:/target/log
    ports:
    - 8889:8889/tcp


  service-monitor:
    image: harbor.jry.com/service-monitor:v1.0.1
    environment:
      eureka.client.service-url.defaultZone: http://discovery:8761/eureka/
    stdin_open: true
    tty: true
    links:
    - discovery1:discovery
    volumes:
    - /data/log:/target/log


  discovery2:
    image: harbor.jry.com/service-discovery
    environment:
      eureka.client.service-url.defaultZone: http://discovery:8761/eureka/
    stdin_open: true
    tty: true
    links:
    - discovery1:discovery
    volumes:
    - /data/log:/target/log
    ports:
    - 8762:8761/tcp


  discovery1:
    image: harbor.jry.com/service-discovery:v1.0.1
    environment:
      eureka.client.service-url.defaultZone: http://discovery:8761/eureka/
    stdin_open: true
    tty: true
    links:
    - discovery2:discovery
    volumes:
    - /data/log:/target/log


  daas-monitor:
    image: harbor.jry.com/daas-monitor:v1.0.1
    environment:
      eureka.client.service-url.defaultZone: http://discovery:8761/eureka/
    stdin_open: true
    tty: true
    links:
    - discovery1:discovery
    volumes:
    - /data/log:/target/log
    ports:
    - 9080:9080/tcp


  proxy-server:
    image: harbor.jry.com/service-proxy:v1.0.1
    environment:
      eureka.client.serviceUrl.defaultZone: http://discovery:8761/eureka/
    stdin_open: true
    links:
    - discovery1:discovery
    tty: true
    links:
    - oauth2-server:oauth
    volumes:
    - /data/log:/target/log
    ports:
    - 8111:8443/tcp


  oauth2-server:
    image: harbor.jry.com/oauth2-cg:v1.0.1
    environment:
      eureka.client.serviceUrl.defaultZone: http://discovery:8761/eureka/
    stdin_open: true
    links:
    - discovery2:discovery
    volumes:
    - /data/log:/target/log
    tty: true
    ports:
    - 9999:9999/tcp

说明:

  • Zipkin:服务调用链路监控

  • service-config:配置中心服务

  • service-monitor:断路监控服务

  • discovery1, discovery2:高可用的服务发现中心

  • daas-monitor:自研的监控面板,整合其他监控服务

  • proxy-server:服务网关

  • oauth2-server:OAuth认证服务器


注:
  1. 虽然使用的配置文件,但维护起来还是很麻烦,所以建议使用编排工具,一般会提供部分DevOps工具集。

  2. 上述各服务模块可以根据实际情况启动多个相同容器,以保证高可用。

  3. 以上各服务模块做了磁盘映射,主要为采集日志,这里我们使用的EFK,时间关系暂不展开。


Q&A

640

Q:WSO2的API Manager会将所有流量都统一到他这里进出,如何解决统一API网关的大流量问题?A:API Manager是可以拆开的,分开部署,比如调用你接口走网关模块,可以做高可用。当然不拆开也可以做高可用,前面加负载均衡。
Q:Eureka在生产上的Kubernetes中是如何做到高可用和动态扩容的?A :好问题,Eureka我们目前是指定数量,可以结合脚本(或代码)做动态扩容和高可用。目前我们Hadoop就是结合代码做到的。
Q:服务之间二阶段事务控制一般怎么做?或者说有没有现成工具或代码?服务间用http靠谱还是其他协议靠谱?A:这个网上有一些思路比如补偿的方式,还有就是通过流数据库(Kafka),事件驱动的方式。我们目前正在尝试这种方式。

640



基于Kubernetes的DevOps实践培训

640?


基于Kubernetes的DevOps实践培训将于2018年8月24日在北京开课,3天时间带你系统掌握Kubernetes本次培训包括:容器特性、镜像、网络;Kubernetes架构、核心组件、基本功能;Kubernetes设计理念、架构设计、基本功能、常用对象、设计原则;Kubernetes的数据库、运行时、网络、插件已经落地经验;微服务架构、组件、监控方案等,点击下方图片查看详情。

640?


推荐阅读
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 大家好,我是李白。本文将分享一个从零开始的全栈项目,涵盖了设计、前端、后端和服务端的全面学习过程。通过这个项目,我希望能够帮助初学者更好地理解和掌握全栈开发的技术栈。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • 阿里巴巴终面技术挑战:如何利用 UDP 实现 TCP 功能?
    在阿里巴巴的技术面试中,技术总监曾提出一道关于如何利用 UDP 实现 TCP 功能的问题。当时回答得不够理想,因此事后进行了详细总结。通过与总监的进一步交流,了解到这是一道常见的阿里面试题。面试官的主要目的是考察应聘者对 UDP 和 TCP 在原理上的差异的理解,以及如何通过 UDP 实现类似 TCP 的可靠传输机制。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 在ElasticStack日志监控系统中,Logstash编码插件自5.0版本起进行了重大改进。插件被独立拆分为gem包,每个插件可以单独进行更新和维护,无需依赖Logstash的整体升级。这不仅提高了系统的灵活性和可维护性,还简化了插件的管理和部署过程。本文将详细介绍这些编码插件的功能、配置方法,并通过实际生产环境中的应用案例,展示其在日志处理和监控中的高效性和可靠性。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
author-avatar
拍友2702936504
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有