文档章节

利用Java上手微服务架构

好雨云帮
 好雨云帮
发布于 2017/08/04 13:56
字数 1846
阅读 17
收藏 1
点赞 0
评论 0

作者: 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://jaxenter.com/introduction-microservices-java-136067.html

共有 人打赏支持
好雨云帮
粉丝 14
博文 74
码字总数 77251
作品 1
东城
【小马哥】Spring Cloud系列讲座

这里为大家推荐一个不错的Spring Cloud系列讲座,讲师介绍如下: 小马哥,阿里巴巴技术专家,从事十余年Java EE 开发,国内微服务技术讲师。目前主要负责微服务技术推广、架构设计、基础设施...

杜琪
03/02
0
0
【小马哥】Spring Boot系列讲座

这里为大家推荐一个不错的Spring Boot系列讲座,讲师介绍如下: 小马哥,阿里巴巴技术专家,从事十余年Java EE 开发,国内微服务技术讲师。目前主要负责微服务技术推广、架构设计、基础设施、...

杜琪
03/02
0
0
“Spring三剑客”,助你快速从月入过万的程序员到年薪百万的架构师

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 Spring作为Java开发的事实开发框架,一直以来都被开发者誉为杀手级...

异步社区
05/10
0
0
Java程序员必读书单,家族又添新成员

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 有些革命出其不意地吸引了全世界的眼球。Twitter、Linux操作系统和...

异步社区
05/09
0
0
微服务解决方案 Apache ServiceComb(incubating) 发布新版本

近期,微服务解决方案Apache ServiceComb(incubating) 捷报频传,除了LC3大会ServiceComb Workshop成功举办之外,Java-Chassis 1.0.0-m2、Service-Center 1.0.0-m2和Saga 0.2.0版本顺利通过投...

微服务框架
07/12
0
0
微服务解决方案Apache ServiceComb(incubating) 发布新版本

近期,微服务解决方案Apache ServiceComb(incubating) 捷报频传,除了LC3大会ServiceComb Workshop成功举办之外,Java-Chassis 1.0.0-m2、Service-Center 1.0.0-m2和Saga 0.2.0版本顺利通过投...

微服务框架
07/12
0
0
interview questions

1.java中为什么会出现多线程? Java内存模型决定了 CPU 不能 完全利用,为了充分利用CPU,所以产生了多线程技术。 2.多线程中,如果不调用start方法,直接调用run方法会发生什么? 只有调用T...

无断无灭无住无念
2017/11/06
0
0
关注这些技术号,你将拥有半个互联网圈

“ IT 行业技术变更周期越来越快,作为技术人最重要的是持续学习,现在的学习途径有很多,我们到底该如何做出选择? 我觉得最重要有两方面:第一,需要保持良好的技术视野,持续关注行业内技...

g6u8w7p06dco99fq3
04/18
0
0
微服务架构实战学习(四):RPC 框架对比

下面是对市面上比较流行的 RPC 框架的对比 以上对比是我结合各框架的网上资料以及官方文档资源总结的,在实际的使用过程中。我们可以结合我们的业务场景来选择不同的框架。 虽然说没有最好的...

雨林_a1d6
06/11
0
0
微服务架构~携程Apollo配置中心架构剖析

一、介绍 Apollo(阿波罗)[参考附录1]是携程框架部研发并开源的一款生产级的配置中心产品,它能够集中管理应用在不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的...

波波微课
06/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

利用 acme.sh 获取网站证书并配置https访问

acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书.(https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E) 主要步骤: 安装 acme.sh 生成证书 copy 证书到 nginx/ap...

haoyuehong
10分钟前
0
0
微擎框架内如何根据media_id获取到微信图片的路径

微擎的框架内,图片选择后,获取的是那个字符串是media_id,相当于你这张图片在微信的图片服务器里面的id 要求是:获取https://mmbiz.qpic.cn/mmbiz_jpg/…… 微信图片的路径 而微信并没有根据m...

老bia同学
14分钟前
0
0
Spring boot中日期的json格式化

Model 在model层中,类的日期属性上面添加如下注解: @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd hh:mm:ss") 参考 Jackson Date格式化教程...

亚林瓜子
15分钟前
0
0
Eclipse:Failed to load the JNI shared library

1.问题背景: 由于我之前使用jdk1.9学习,当使用Luke的时候发现jdk版本过高,需要向下配置jdk,就向朋友拷了一个安装包。重新配置路径后,便开始报错。 2.问题描述: Failed to load the JNI...

tinder_boy
18分钟前
0
0
少儿学习编程课程是否真的适合七八岁的低龄儿童[图]

少儿学习编程课程是否真的适合七八岁的低龄儿童[图]: 天下熙熙皆为利来,天下攘攘皆为利往。 这几年来,乐高教育机构在国内如同雨后春笋般出现,当然关闭/转手的也很多。从教师角度来看,部...

原创小博客
23分钟前
0
0
ES12-词项查询

1.词项查询介绍 全文查询将在执行之前分析查询字符串,但词项级别查询将按照存储在倒排索引中的词项进行精确操作。这些查询通常用于数字,日期和枚举等结构化数据,而不是全文本字段。 或者,...

贾峰uk
31分钟前
0
0
http状态码与ajax的状态值

ajax状态值 1.1 200 & OK:状态请求成功

litCabbage
34分钟前
0
0
iOS动画效果合集、飞吧企鹅游戏、换肤方案、画板、文字效果等源码

iOS精选源码 动画知识运用及常见动画效果收集 3D卡片拖拽卡片叠加卡片 iFIERO - FLYING PENGUIN 飞吧企鹅SpriteKit游戏(源码) Swift封装的空数据提醒界面EmptyView 沙盒文件浏览与分享调试控...

sunnyaigd
37分钟前
0
0
AngularJS配置.run()块中设置路由事件的监听器以及过滤未经授权的请求

AngularJS中的run方法初始化全局数据,只对全局作用域起作用,如$rootScope.多个控制器之间可以共享数据,如下代码所示: <script type="text/javascript"> var m1 = angular....

孟飞阳
38分钟前
0
0
Java语言学习(十):输入/输出

Java中,I/O操作代表着输入、输出,Java所有的I/O机制都是基于数据流进行输入输出。java.io类包提供了很多的输入输出处理功能方法,大家可以参考下JDK文档中关于I/O的一些处理方法:JDK在线中...

海岸线的曙光
47分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部