2019独角兽企业重金招聘Python工程师标准>>>

作者: Alexsandro Souza​

几乎每个人都在关注微服务架构,我们也不例外。作为一个与时俱进的程序员,我一直在努力了解这一架构,希望寻找一种通过Spring在Java中实现微服务架构的方法。

我们公司虽然很棒,但技术堆栈略显过时,至今还没有使用Java 8或微服务,因此我需要从外部了解更多关于微服务架构的经验和方法。我决定通过创建一个“to-do system”项目来梳理经验以供将来参考。

概览

本文的目标是为不同的微服务提供源代码walkthrough,因此我不打算深入概念和工具,而是提出一个包含用于开发微服务的模式、工具、技术的应用示例。

“to-do system”将由8个应用组成:

  • Reminder
  • User
  • Service Discovery System
  • Mailer
  • OAuth Server
  • System Integration Test
  • API Gateway
  • Web Application Client

系统如何工作

上图未系统与微服务的交互。用户访问Angular2编写的应用,该应用链接OAuth Authorization server,通过OAuth Authorization server分配用户和权限。此server将返回一个Jason Web Token,其中包含有关客户端及其权限的信息以及格式的范围。当用户认证通过并拥有token之后,Web应用可以与API Gateway通信。API Gateway将利用JWT验证请求是否来自授权server,而后调用微服务并构建响应。

OAuth server通过User service获取用户权鉴细节,API Gateway从OAuth server获取用户信息。

Reminder service是安置ToDo功能的地方,ToDo服务按计划检查reminders并通过电子邮件通知用户,电子邮件由Mail service发送,该事件由使用Kafka的事件提醒服务触发。

System Integration Test是负责联络Reminder Service endpoints的Java应用。

连接微服务

在微服务架构中,我们需要处理许多在不同IP和端口上运行的微服务。因此有必要找到一种无需硬编码的方式来管理每个地址。

Netflix Eureka是一种很好的解决方案,作为客户端服务发现,Eureka允许服务自动查找和相互通信。我们有必要理解eureka的工作原理,一边了解REST服务在不同微服务之间的通信。利用eureka来管理服务运行位置,我们可以添加instance,并通过负载均衡实现在微服务之间分配incoming application traffic。】

在我们的系统中,使用Netflix Ribbon作为客户端负载均衡器,实现容错并通过冗余增加可靠性和可用性。我们使用Netflix Feign编写声明性REST客户端,并集成Ribbon和Eureka来提供负载平衡HTTP客户端。

我们正在使用Netflix Hystrix断路器将我们的应用程序与依赖性故障隔离开来。它有助于阻止cascading failure,并允许我们快速恢复或添加fallbacks。Hystrix为每个依赖关系提供一个thread-pool。当thread-pool耗尽,hystrix将拒绝请求。Hystrix同时提供断路器功能,可以停止对依赖关系的所有请求,在请求失败、拒绝或超时时,还可以实现备用逻辑。

Authentication

对于任何系统来说,安全性都是非常重要的,微服务架构也一样。我们通过OAuth2来保持微服务的安全性。OAuth2作为一项知名Authorization,早已广泛应用于Google,Facebook和Github。

在我们的这个项目中,同时还应用了Spring Security,并在安全问题上增加了一个元素:JSON Web Token(JWT)。

如果我们仅使用OAuth,我们将需要一个OAuth授权服务器来验证用户,生成令牌并充当资源服务器的endpoints,询问该令牌是否有效以及授权的权限。与Authorization Server相比,这需要两倍的请求。而JWT提供了一种在access token中传输权限和用户数据的简单方法。一旦所有数据都已经存在于token string中,资源服务器就不需要再请求令牌检查。所有信息都被序列化为JSON,用base64编码,最后用私有RSA密钥签名。它假设所有资源服务器都将有一个公钥,以检查令牌是否为适当的私钥签名,并对令牌进行反序列化以获取信息。

REST

在我们的系统中,我们有两种交互方式:同步和异步。对于异步风格,我们使用分布式事件与Kafka,遵循模型发布/订阅。对于同步,我们有支持JSON和XML的REST风格。

对于RESTful,有四个成熟级别。我们的微服务处于2级,为了简单起见,我决定不使用HATEOAS设计模式实现超媒体控件。

因为我们正在使用Spring Cloud,所以我们要“out-of-box“一些可扩展性模式,把它们放在HTTP连接中,如断路器、bulkhead、负载均衡、连接池、超时和重试。

分布式事件

如上所述,我们通过使用Kafka将Reminder服务和Mailer服务之间的通信异步地与其他微服务进行通信。在Reminder中,我们有一个计划任务来检查提醒时间并发布RemainderFound事件。Mailer服务中将会有一个订阅的事件,它将开始向用户发送电子邮件的过程。我邀请您看看我们如何进行这种整合,以及我如何在Kafka事件模块中写入发送到Kafka的数据的序列化/反序列化。

Event sourcing及CQRS

一体化应用通畅具有单个关系数据库。我们可以使用ACID transaction。因此,如果出现问题,我们的应用程序可以简单地开始一个transaction、更改多个行并提交transaction。但处理微服务架构中的数据访问要复杂得多,这是因为数据分布在不同的数据库中。跨多个服务实施业务transactions是一个很大的挑战。

在我们的“To-Do system“中,我们正在使用事件来处理跨多个服务的业务事务。您可以查看在Mailer服务中应用的CQRS实施事件采购。您可以看到如何分离读和写,使我们能够轻松地缩放每个部分。我们使用关系数据库作为事件存储,然后使用Kafka分发事件。我们将需要使这两个动作为Atomic并避免存储事件,这样就不会发布最终的JVM崩溃。我不使用Kafka作为事件存储,因为从关系数据库构建聚合更简单。我们正在努力使事情变得容易!

下一步

在To-Do-System已经包含许多微服务架构涉及到的方方面面,另一方面也仍然存在诸多挑战。我们未来计划在此项目基础上增加更多东西,例如Spring云配置、Docker容器、与Jenkins的持续集成、Spring Sleuth分布式跟踪、ELK日志管理等等。

推荐阅读

开源项目:[云框架]基于Spring Cloud的微服务架构,提供Spring Cloud微服务架构最佳实践,即插即用

在好雨云帮一键部署基于Spring Cloud的微服务架构

转载于:https://my.oschina.net/zhouyq/blog/1502695

利用Java上手微服务架构相关推荐

  1. 基于java基于微服务架构的设备管理系统的设计与实现计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署

    基于java基于微服务架构的设备管理系统的设计与实现计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 基于java基于微服务架构的设备管理系统的设计与实现计算机毕业设计源码+系统+lw文 ...

  2. 基于java基于微服务架构的在线音乐平台计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署

    基于java基于微服务架构的在线音乐平台计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 基于java基于微服务架构的在线音乐平台计算机毕业设计源码+系统+lw文档+mysql数据库+调 ...

  3. 计算机毕业设计JAVA基于微服务架构的设备管理系统的设计与实现mybatis+源码+调试部署+系统+数据库+lw

    计算机毕业设计JAVA基于微服务架构的设备管理系统的设计与实现mybatis+源码+调试部署+系统+数据库+lw 计算机毕业设计JAVA基于微服务架构的设备管理系统的设计与实现mybatis+源码+调 ...

  4. java常见微服务架构

    1.dubbo 阿里巴巴研发的一款微服务组件,服务调用使用RPC 服务注册Zookeeper 服务调用dubbo 2.Spring Cloud Netflix Spring Cloud 的第一代实现, ...

  5. 一文读懂 Spring Boot、微服务架构和大数据治理三者之间的故事

    微服务架构 微服务的诞生并非偶然,它是在互联网高速发展,技术日新月异的变化以及传统架构无法适应快速变化等多重因素的推动下诞生的产物.互联网时代的产品通常有两类特点:需求变化快和用户群体庞大,在这种情况 ...

  6. 一文透析 Spring Boot、微服务架构和大数据治理三者之间的故事

    微服务架构 微服务的诞生并非偶然,它是在互联网高速发展,技术日新月异的变化以及传统架构无法适应快速变化等多重因素的推动下诞生的产物.互联网时代的产品通常有两类特点:需求变化快和用户群体庞大,在这种情况 ...

  7. GO微服务实战第五节 为什么说 Service Meh 是下一代微服务架构?

    在前面第 2 课时我们介绍过,Service Mesh(服务网格) 是云原生的代表技术之一,并且在后面的组件案例实践中,Service Mesh 也是其中的"主角",因此我们非常有 ...

  8. 让ERP的服务更开放! ——用微服务架构搭建的一套基于EBS的API服务系统

    1. 源码下载地址 源码链接: https://github.com/samt007/xygerp-api-demo 这是用Spring Cloud微服务架构搭建的一套基于EBS的API服务系统 如对 ...

  9. 微服务架构盛行的时代,你需要了解点 Spring Boot

    随着互联网的高速发展,庞大的用户群体和快速的需求变化已经成为了传统架构的痛点. 在这种情况下,如何从系统架构的角度出发,构建出灵活.易扩展的系统来快速响应需求的变化,同时,随着用户量的增加,如何保证系 ...

最新文章

  1. 2021-07-08执行Linux的命令分析
  2. 转工厂方法模式-想吃什么汉堡自己要
  3. java list 转数组_数组转List,一定要小心这个坑!
  4. Tomcat forward debug - how is jsp file served in Tomcat
  5. nginx配置多个server_Nginx基本属性配置详解
  6. Centos下MySQL的安装及常见问题
  7. 大橙子_【大橙子活动】工程学院新媒体中心第二届总结大会圆满结束!
  8. Cesium颜色调整
  9. 边缘检测后去除噪点_Street Lanes Finder - 检测自动驾驶汽车的车道
  10. 树莓派命令行连接蓝牙音箱及不出声问题
  11. SpringCache实战遇坑
  12. Orchard 之:Widget,兼看 Layer 在权限控制中的作用
  13. AnyLogic建模笔记
  14. 在线运行此php解密navicat导出的密码!(用于navicat已经连接数据库但是忘记了密码)
  15. 【React自制全家桶】九、Redux入手
  16. 2021/04/10 OJ每日一题 1190: 按出生日期排序(结构体专题)python
  17. 别让Java对象逃逸(Object Escape)
  18. NTU RGB-D数据集申请
  19. 全球及中国生物农药行业投资状况与十四五运行态势研究报告2022版
  20. ACCV 2020 最受关注的 Top10 代码开源论文!

热门文章

  1. 香蕉派安装64位linux,在香蕉派里安装配置archlinux到树莓派
  2. python调用gitlab api自动合并分支_Python3 如何使用 GitLab API 进行批量的合并分支
  3. python number函数_Python3 数据类型-Number
  4. NVIDIA Tesla/Quadro和GeForce GPU的比较
  5. 源码阅读之Java栈的实现
  6. anime.js 实战:实现一个带有描边动画效果的复选框...
  7. 关于const 修饰的一些知识
  8. 查看linux 服务器有多少CPU
  9. Scrum项目5.0
  10. MySQL中同一时候存在创建和上次更新时间戳字段解决方法浅析