编辑推荐
适读人群 :本书适合拥有构建分布式应用程序的经验、拥有Spring的知识背景以及对学习构建基于微服务的应用程序感兴趣的Java开发人员阅读。对于希望使用微服务构建基于云的应用程序,以及希望了解如何将基于微服务的应用部署到云上的开发人员,本书也具有很好的学习参考价值。
微服务将代码分解为小型的、分布式的独立服务,这些服务需要深谋远虑和仔细设计。Spring Boot和Spring Cloud简化了微服务应用程序。就像Spring框架简化了企业级Java开发一样,Spring Boot移除了与编写基于REST的服务有关的样板代码。Spring Cloud提供了一套工具,用于微服务发现、路由以及将微服务部署到企业和云中。
本书教读者如何使用Java和Spring平台构建基于微服务的应用程序。在构建和部署第1个Spring Cloud应用程序时,读者将学习如何进行微服务设计。在本书中,精心挑选的真实案例展示了基于微服务的各种模式,这些模式用于配置、路由、扩展和部署服务。读者将了解Spring易于使用的工具,并看到其如何助力用微服务来增强和重构现有的应用程序。
本书主要内容
● 核心微服务设计原则。
● 使用Spring Cloud Config管理配置。
● 使用Spring、Hystrix和Ribbon实现客户端弹性。
● 使用Netflix Zuul进行智能路由。
● 部署Spring Cloud应用程序。
本书是为具有Java和Spring经验的开发人员编写的。
内容简介
本书以一个名为EagleEye的项目为主线,介绍云、微服务等概念以及SpringBoot和SpringCloud等诸多Spring项目,并介绍如何将EagleEye项目一步一步地从单体架构重构成微服务架构,进而将这个项目拆分成众多微服务,让它们运行在各自的Docker容器中,实现持续集成/持续部署,并很终自动部署到云环境(Amazon)中。针对在重构过程中遇到的各种微服务开发会面临的典型问题(包括开发、测试和运维等问题),本书介绍了解决这些问题的核心模式,以及在实战中如何选择特定SpringCloud子项目或其他工具解决这些问题。
本书适合拥有构建分布式应用程序的经验、拥有Spring的知识背景以及对学习构建基于微服务的应用程序感兴趣的Java开发人员阅读。对于希望使用微服务构建基于云的应用程序,以及希望了解如何将基于微服务的应用部署到云上的开发人员,本书也具有很好的学习参考价值。
作者简介
约翰·卡内尔,是一位资历云工程师,拥有20年的Java开发经验。他大部分时间都在使用AWS平台构建基于电话的微服务。他的日常工作主要是设计和构建跨Java、Clojure和Go等多种技术平台的微服务。
目录
- 第1章欢迎迈入云世界,Spring1
- 1.1什么是微服务1
- 1.2什么是Spring,为什么它与微服务有关4
- 1.3在本书中读者会学到什么5
- 1.4为什么本书与你有关6
- 1.5使用SpringBoot来构建微服务6
- 1.6为什么要改变构建应用的方式10
- 1.7云到底是什么11
- 1.8为什么是云和微服务13
- 1.9微服务不只是编写代码14
- 1.9.1核心微服务开发模式15
- 1.9.2微服务路由模式16
- 1.9.3微服务客户端弹性模式17
- 1.9.4微服务安全模式18
- 1.9.5微服务日志记录和跟踪模式19
- 1.9.6微服务构建和部署模式20
- 1.10使用SpringCloud构建微服务22
- 1.10.1SpringBoot23
- 1.10.2SpringCloudConfig23
- 1.10.3SpringCloud服务发现24
- 1.10.4SpringCloud与NetflixHystrix和NetflixRibbon24
- 1.10.5SpringCloud与NetflixZuul24
- 1.10.6SpringCloudStream24
- 1.10.7SpringCloudSleuth24
- 1.10.8SpringCloudSecurity25
- 1.10.9代码供应25
- 1.11通过示例来介绍SpringCloud25
- 1.12确保本书的示例是有意义的27
- 1.13小结28
- 第2章使用SpringBoot构建微服务29
- 2.1架构师的故事:设计微服务架构31
- 2.1.1分解业务问题31
- 2.1.2建立服务粒度32
- 2.1.3互相交流:定义服务接口35
- 2.2何时不应该使用微服务36
- 2.2.1构建分布式系统的复杂性36
- 2.2.2服务器散乱36
- 2.2.3应用程序的类型36
- 2.2.4数据事务和一致性37
- 2.3开发人员的故事:用SpringBoot和Java构建微服务37
- 2.3.1从骨架项目开始37
- 2.3.2引导SpringBoot应用程序:编写引导类39
- 2.3.3构建微服务的入口:SpringBoot控制器40
- 2.4DevOps工程师的故事:构建运行时的严谨性44
- 2.4.1服务装配:打包和部署微服务46
- 2.4.2服务引导:管理微服务的配置47
- 2.4.3服务注册和发现:客户端如何与微服务通信48
- 2.4.4传达微服务的“健康状况”49
- 2.5将视角综合起来51
- 2.6小结52
- 第3章使用SpringCloud配置服务器控制配置53
- 3.1管理配置(和复杂性)54
- 3.1.1配置管理架构55
- 3.1.2实施选择56
- 3.2构建SpringCloud配置服务器58
- 3.2.1创建SpringCloudConfig引导类61
- 3.2.2使用带有文件系统的SpringCloud配置服务器62
- 3.3将SpringCloudConfig与SpringBoot客户端集成64
- 3.3.1建立许可证服务对SpringCloudConfig服务器的依赖65
- 3.3.2配置许可证服务以使用SpringCloudConfig66
- 3.3.3使用SpringCloud配置服务器连接数据源69
- 3.3.4使用@Value注解直接读取属性72
- 3.3.5使用SpringCloud配置服务器和Git73
- 3.3.6使用SpringCloud配置服务器刷新属性73
- 3.4保护敏感的配置信息75
- 3.4.1下载并安装加密所需的OracleJCEjar75
- 3.4.2创建加密密钥76
- 3.4.3加密和解密属性76
- 3.4.4配置微服务以在客户端使用加密78
- 3.5最后的想法79
- 3.6小结80
- 第4章服务发现81
- 4.1我的服务在哪里82
- 4.2云中的服务发现84
- 4.2.1服务发现架构84
- 4.2.2使用Spring和NetflixEureka进行服务发现实战87
- 4.3构建SpringEureka服务88
- 4.4通过SpringEureka注册服务90
- 4.5使用服务发现来查找服务93
- 4.5.1使用SpringDiscoveryClient查找服务实例95
- 4.5.2使用带有Ribbon功能的SpringRestTemplate调用服务97
- 4.5.3使用NetflixFeign客户端调用服务98
- 4.6小结100
- 第5章使用SpringCloud和NetflixHystrix的客户端弹性模式101
- 5.1什么是客户端弹性模式102
- 5.1.1客户端负载均衡模式103
- 5.1.2断路器模式103
- 5.1.3后备模式103
- 5.1.4舱壁模式104
- 5.2为什么客户端弹性很重要104
- 5.3进入Hystrix107
- 5.4搭建许可服务器以使用SpringCloud和Hystrix107
- 5.5使用Hystrix实现断路器109
- 5.5.1对组织微服务的调用超时111
- 5.5.2定制断路器的超时时间112
- 5.6后备处理113
- 5.7实现舱壁模式115
- 5.8基础进阶—微调Hystrix118
- 5.9线程上下文和Hystrix122
- 5.9.1ThreadLocal与Hystrix122
- 5.9.2HystrixConcurrencyStrategy实战125
- 5.10小结129
- 第6章使用SpringCloud和Zuul进行服务路由131
- 6.1什么是服务网关132
- 6.2SpringCloud和NetflixZuul简介133
- 6.2.1建立一个ZuulSpringBoot项目134
- 6.2.2为Zuul服务使用SpringCloud注解134
- 6.2.3配置Zuul与Eureka进行通信135
- 6.3在Zuul中配置路由135
- 6.3.1通过服务发现自动映射路由136
- 6.3.2使用服务发现手动映射路由137
- 6.3.3使用静态URL手动映射路由140
- 6.3.4动态重新加载路由配置142
- 6.3.5Zuul和服务超时143
- 6.4Zuul的真正威力:过滤器144
- 6.5构建第一个生成关联ID的Zuul前置过滤器147
- 6.6构建接收关联ID的后置过滤器155
- 6.7构建动态路由过滤器157
- 6.7.1构建路由过滤器的骨架159
- 6.7.2实现run()方法159
- 6.7.3转发路由161
- 6.7.4整合162
- 6.8小结163
- 第7章保护微服务164
- 7.1OAuth2简介165
- 7.2从小事做起:使用Spring和OAuth2来保护单个端点167
- 7.2.1建立EagleEyeOAuth2验证服务167
- 7.2.2使用OAuth2服务注册客户端应用程序168
- 7.2.3配置EagleEye用户171
- 7.2.4验证用户172
- 7.3使用OAuth2保护组织服务175
- 7.3.1将SpringSecurity和OAuth2jar添加到各个服务176
- 7.3.2配置服务以指向OAuth2验证服务176
- 7.3.3定义谁可以访问服务177
- 7.3.4传播OAuth2访问令牌180
- 7.4JSONWebToken与OAuth2183
- 7.4.1修改验证服务以颁发JWT令牌184
- 7.4.2在微服务中使用JWT188
- 7.4.3扩展JWT令牌189
- 7.4.4从JWT令牌中解析自定义字段191
- 7.5关于微服务安全的总结193
- 7.6小结195
- 第8章使用SpringCloudStream的事件驱动架构196
- 8.1为什么使用消息传递、EDA和微服务197
- 8.1.1使用同步请求-响应方式来传达状态变化198
- 8.1.2使用消息传递在服务之间传达状态更改199
- 8.1.3消息传递架构的缺点201
- 8.2SpringCloudStream简介202
- 8.3编写简单的消息生产者和消费者205
- 8.3.1在组织服务中编写消息生产者205
- 8.3.2在许可证服务中编写消息消费者210
- 8.3.3在实际操作中查看消息服务213
- 8.4SpringCloudStream用例:分布式缓存214
- 8.4.1使用Redis来缓存查找215
- 8.4.2定义自定义通道221
- 8.4.3将其全部汇集在一起:在收到消息时清除缓存222
- 8.5小结223
- 第9章使用SpringCloudSleuth和Zipkin进行分布式跟踪224
- 9.1SpringCloudSleuth与关联ID225
- 9.1.1将SpringCloudSleuth添加到许可证服务和组织服务中226
- 9.1.2剖析SpringCloudSleuth跟踪226
- 9.2日志聚合与SpringCloudSleuth227
- 9.2.1SpringCloudSleuth与Papertrail实现实战229
- 9.2.2创建Papertrail账户并配置syslog连接器230
- 9.2.3将Docker输出重定向到Papertrail232
- 9.2.4在Papertrail中搜索SpringCloudSleuth的跟踪ID234
- 9.2.5使用Zuul将关联ID添加到HTTP响应235
- 9.3使用OpenZipkin进行分布式跟踪237
- 9.3.1添加SpringCloudSleuth和Zipkin依赖项238
- 9.3.2配置服务以指向Zipkin238
- 9.3.3安装和配置Zipkin服务器239
- 9.3.4设置跟踪级别240
- 9.3.5使用Zipkin跟踪事务241
- 9.3.6可视化更复杂的事务243
- 9.3.7捕获消息传递跟踪244
- 9.3.8添加自定义跨度246
- 9.4小结248
- 第10章部署微服务250
- 10.1EagleEye:在云中建立核心基础设施251
- 10.1.1使用亚马逊的RDS创建PostgreSQL数据库253
- 10.1.2在AWS中创建Redis集群257
- 10.1.3创建ECS集群258
- 10.2超越基础设施:部署EagleEye262
- 10.3构建和部署管道的架构265
- 10.4构建和部署管道实战268
- 10.5开始构建和部署管道:GitHub和TravisCI270
- 10.6使服务能够在TravisCI中构建270
- 10.6.1构建的核心运行时配置273
- 10.6.2安装预构建工具275
- 10.6.3执行构建277
- 10.6.4标记源代码277
- 10.6.5构建微服务并创建Docker镜像279
- 10.6.6将镜像推送到DockerHub279
- 10.6.7在AmazonECS中启动服务280
- 10.6.8启动平台测试280
- 10.7关于构建和部署管道的总结282
- 10.8小结282
- 附录A在桌面运行云服务283
- 附录BOAuth2授权类型291