专栏亮点

优势

  • 内容通俗易懂,更适合初学者。
  • 重实操性,专栏包含一个完整的项目实战,通过开发项目掌握技术的实际应用。
  • 案例理论结合,专栏以实际案例为主,更有利于上手应用。

专栏特色

  • 从零讲起,轻松入门
  • 通俗易懂,实战为主
  • 3 大章节,内容全面

你的收获

  • 掌握 Spring Cloud 各个组件的使用
  • 使用 Spring Cloud 开发完整的项目

专栏介绍

为什么要学习 Spring Cloud?

Spring 是当下 Java 行业的开发标准,Spring Boot、Spring Cloud 更是热门话题,出门遇见同行,不会 Spring 你可能都不好意思跟别人打招呼,企业的招聘信息中也越来越多地出现对于 Spring 技术栈开发能力的要求,不会 Spring 技术栈找工作别说有优势了,先被别人落下一大截,可以说 Spring 技术栈已经成为 Java 开发人员的必备技能,同时随着互联网技术的发展和业务量不断增长,越来越多的公司选择使用分布式架构进行项目开发,Spring Cloud 是业内公认最优秀的解决方案之一,是每一个 Java 开发都需要掌握的技术。

初学者的困惑

无论你是初级菜鸟还是有一定经验的老鸟,都应该好好学习 Spring Cloud 的使用,这一点毋庸置疑。但遗憾的是目前市面上有关于 Spring Cloud 详细全面且实用的教程比较少,尤其对于初学者来讲,学习成本依旧很高。

目前市面上很多课程都侧重于理论讲解,缺乏相应的实战案例,这对于初学者来讲也是挺痛苦的,看似学了很多,真正需要写代码时又不知如何下手,完全没有思路,学了一堆技术却不知道如何应用,那不就背离了我们最初的学习目的了吗?我们学技术就是为了实际应用,提高自己的竞争力,去争取更优质的资源。

我写这门专栏就是希望能帮助初学者解决这个问题,结合实战案例让读者能够快速掌握实际开发能力,以输出为结果导向是最高效的学习方法,希望通过我的这门专栏,让所有需要掌握 Spring Cloud 的读者都能够快速上手,具备使用 Spring Cloud 进行实际开发的能力。

专栏大纲

作者介绍

宁楠,资深 Java 开发工程师,技术总监,拥有丰富的软件研发、系统架构经验。热衷于知识分享,乐于将自己的行业经验分享给初学者,互联网讲师,《Java零基础实战》一书作者、B站认证UP主、头条认证作者。

适宜人群

  • Java 开发工程师
  • 希望学习 Spring Cloud 的开发者
  • 希望学习微服务架构的开发者

前置知识

  • 熟练掌握 Java 核心基础。
  • 熟练掌握 Java Web 后端开发技术。
  • 对 Spring 框架有基本的了解。

购买须知

  • 本专栏为图文内容,共计 22 篇。
  • 付费用户可享受文章永久阅读权限。
  • 本专栏为虚拟产品,一经付费概不退款,敬请谅解。
  • 本专栏可在 GitChat 服务号、App 及网页端 gitbook 上购买,一端购买,多端阅读。

订阅福利

  • 订购本专栏可获得专属海报(在 GitChat 服务号领取),分享专属海报每成功邀请一位好友购买,即可获得 25% 的返现奖励,多邀多得,上不封顶,立即提现。
  • 提现流程:在 GitChat 服务号中点击「我-我的邀请-提现」。
  • 购买本专栏后,服务号会自动弹出入群二维码和暗号。如果你没有收到那就先关注微信服务号「GitChat」,或者加我们的小助手「GitChatty6」咨询。(入群方式可查看第 3 篇文末说明)。

课程内容

Spring Boot 快速入门

前言

从本节课开始,我们进入 Spring Boot 框架的学习,Spring Boot 是当前 Java 领域主流的技术栈,同时也是整个 Spring 全家桶中非常重要的一个模块。

Spring Boot 简介

Spring 作为一个软件设计层面的框架,在 Java 企业级开发中应用非常广泛,但是 Spring 框架的配置非常繁琐,且大多是重复性的工作,Spring Boot 的诞生就解决了这一问题,通过 Spring Boot 可以快速搭建一个基于 Spring 的 Java 应用程序。Spring Boot 对常用的第三方库提供了配置方案,可以很好地与 Spring 进行整合,如 MyBatis、Spring Data JPA 等,可以一键式搭建功能完备的 Java 企业级应用程序。

Spring Boot 的优势:

  • 不需要任何 XML 配置文件。
  • 内嵌 Web 服务器,可直接部署。
  • 默认支持 JSON 数据,不需要额外配置。
  • 支持 RESTful 风格。
  • 最少一个配置文件可以配置所有的个性化信息。

简而言之,Spring Boot 就是一个用很少的配置就可以快速搭建 Spring 应用的框架,并且很好的集成了常用第三方库,让开发者能够快速进行企业级项目开发。

创建 Spring Boot 工程

有 3 种常用方式可以快速创建一个 Spring Boot 工程,接下来详细给大家介绍每种方式的具体操作。

  • 在线创建工程

打开浏览器访问 https://start.spring.io,可在线创建一个 Spring Boot 工程,页面如下图所示。

这这个页面中可以选择创建工程的方式和语言,我们选择 Maven 和 Java,Spring Boot 的版本选择 2.1.5,接下来需要输入 Group Id 和 Artifact Id,以及选择需要依赖的模块。以上这些信息设置完毕之后,点击下方的 Generate Project 按钮即可下载模版的压缩文件,解压后用 IDEA 打开即可。

  • 使用 IDEA Spring Initializr 创建工程

1、打开 IDEA,选择 Create New Project。

2、选择 Spring Initializr,点击 Next,可以看到实际上 IDEA 还是通过 https://start.spring.io 来创建工程的。

3、输入 GroupId、ArtifactId 等基本信息,点击 Next

4、选择需要依赖的模块,点击 Next

5、选择项目路径,点击 Finish 即可完成创建。

  • 手动创建 Spring Boot 工程。

1、打开 IDEA,选择 Create New Project。

2、选择 Maven,点击 Next

3、输入 GroupId 和 ArtifactId,点击 Next

4、选择项目路径,点击 Finish 即可创建一个空的 Maven 工程。

5、手动添加 Spring Boot 相关依赖,在 parent 标签中配置 spring-boot-starter-parent 的依赖,相当于给整个工程配置了一个 Spring Boot 的父依赖,其他模块直接在继承父依赖的基础上添加特定依赖即可。

比如现在要集成 Web MVC 组件,直接在 dependencies 中添加一个 spring-boot-starter-web 依赖即可,默认使用 Tomcat 作为 Web 容器,pom.xml 如下所示。

<parent>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-parent</artifactId>  <version>2.1.5.RELEASE</version></parent><dependencies>  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId>  </dependency></dependencies>
使用 Spring Boot

通过以上任意一种方式都可快速搭建一个 Spring Boot 工程,然后就可以根据需求添加各种子模块依赖了,比如上述的第 3 种方式,我们添加了 Web MVC 组件,当前工程就成为了一个 Spring MVC 框架项目,开发者可以按照 Spring MVC 的开发步骤直接写代码了,同时 Spring Boot 还帮助我们大大简化了配置文件。

你可以拿当前的工程和之前课程中我们创建的 Spring MVC 工程对比一下,会发现不需要在 web.xml 中配置 DispatcherServlet,同时也不需要创建 springmvc.xml 了。

传统 Spring MVC 工程的 springmvc.xml 中主要添加三个配置,一是启用注解驱动,二是自动扫包,三是视图解析器。Spring Boot 自动帮我们搞定了前两个配置,第三个视图解析器需要开发者手动配置,因为视图层资源的存储路径和文件类型框架是没有办法自动获取的,不同工程的具体方式也不一样,像这种个性化的配置,Spring Boot 框架是无法自动完成的,需要开发者在 Spring Boot 特定的配置文件中自己完成。

好了,接下来我们就一起来学习用 Spring Boot 启动 Web 应用的具体操作。

1、创建 HelloHandler,具体步骤与 Spring MVC 一样。

@RestControllerpublic class HelloHandler {    @GetMapping("/index")    public String index(){        return "Hello World";    }}

2、创建 Spring Boot 启动类 Application。

@SpringBootApplicationpublic class Application {    public static void main(String[] args) {        SpringApplication.run(Application.class,args);    }}

这个类是整个 Spring Boot 应用的入口,可以看到在类定义处添加了一个 @SpringBootApplication 注解,这个注解是 Spring Boot 的核心,它开启了 Spring Boot 的自动化配置,开发者可以使用自定义配置来覆盖自动化配置,同时它完成了自动扫包,默认的范围是该类所在包的所有子包,当然也包括所在包本身,因此我们在实际开发中应该将启动类放在跟目录下。

要启动 Spring Boot 应用,直接运行启动类的 main 方法即可,会自动将项目部署到内置 Tomcat 中,并启动 Tomcat,看到控制台输出如下信息。

启动成功,并且默认端口为 8080,打开浏览器,输入 localhost:8080/index 即可看到返回 Hello World

同时需要注意 Application 一定要覆盖 HelloHandler,因为 Application 启动之后会自动进行扫描,将需要的类交给 Spring IoC 容器来管理,这些类必须被 Application 所覆盖,如何实现覆盖呢?很简单,只需要设置它们的层级关系即可,被扫描的类和 Application 在同一个包下,或者被扫描类所在的包是 Application 所在包的子包,如下图所示。

即 Application 和 HelloHandler 都在 com.southwind.controller 包中,或者 Application 放在 com.southwind 包中,HelloHandler 放在 com.southwind.controller 包中。

如果不按照上述规则设置,将 Application 和 HelloHandler 放在两个同级包中,如下所示。

启动之后,访问 localhost:8080/index ,则无法访问到 HelloHandler 资源,抛出 404 异常,,如下图所示。

很好理解,因此此时的 HelloHandler 并没有被 Spring 管理,IoC 容器中不存在这个资源。

总结

本节课作为整个 Spring Boot 阶段的开篇课程,我们主要讲解了 Spring Boot 的基本概念,Spring Boot 应用的创建方式,以及 Spring Boot 的基本使用。相信大家已经可以感受到使用 Spring Boot 搭建一个 Spring 应用是多么简单快捷,后续的课程会在此基础上讲解更多 Spring Boot 技术栈的实用模块。

源码

https://github/southwind9801/gcspringboot.git

Zipkin 服务跟踪

前言

本节课我们来学习服务跟踪,首先来思考一个问题,为什么要有服务跟踪,我们知道一个分布式系统中往往会部署很多个微服务,这些服务彼此之间会相互调用,整个过程就会较为复杂,我们在进行问题排查或者优化的时候工作量就会比较大。如果能准确跟踪每一个网络请求的整个运行流程,获取它在每个微服务上的访问情况、是否有延迟、耗费时间等,这样的话我们分析系统性能,排查解决问题就会容易很多,我们使用 Zipkin 组件来实现服务跟踪。

什么是 Zipkin

Zipkin 是一个可以采集并且跟踪分布式系统中请求数据的组件,可以为开发者采集某个请求在多个微服务之间的追踪数据,并以可视化的形式呈现出来,让开发者可以更加直观地了解到请求在各个微服务中所耗费的时间等信息。

ZipKin 组件包括两部分:Zipkin Server 和 Zipkin Client,服务端用来采集微服务之间的追踪数据,再通过客户端完成数据的生成和展示,Spring Cloud 为服务跟踪提供了解决方案,Spring Cloud Sleuth 集成了 Zipkin 组件。

接下来我们通过实际代码来完成服务跟踪的实现,首先来实现 Zipkin Server。

1. 在父工程下创建 Module。

2. 输入 ArtifactId,点击 Next。

3. 设置工程名和工程存放路径,点击 Finish。

4. 在 pom.xml 中添加 Zipkin Server 依赖。

<dependencies>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-web</artifactId>    </dependency>    <dependency>        <groupId>io.zipkin.java</groupId>        <artifactId>zipkin-server</artifactId>        <version>2.9.4</version>    </dependency>    <dependency>        <groupId>io.zipkin.java</groupId>        <artifactId>zipkin-autoconfigure-ui</artifactId>        <version>2.9.4</version>    </dependency></dependencies>

5. 在 resources 路径下创建配置文件 application.yml,添加 Zipkin 相关配置。

server:  port: 9090

属性说明:

  • server.port:当前 Zipkin Server 服务端口。

6. 在 java 路径下创建启动类 ZipkinApplication。

@SpringBootApplication@EnableZipkinServerpublic class ZipkinApplication {    public static void main(String[] args) {        SpringApplication.run(ZipkinApplication.class,args);    }}

注解说明:

  • @SpringBootApplication:声明该类是 Spring Boot 服务的入口。
  • @EnableZipkinServer:声明启动 Zipkin Server。

Zipkin Server 搭建成功,接下来创建 Zipkin Client。

7. 在父工程下创建 Module。

8. 输入 ArtifactId,点击 Next。

9. 设置工程名和工程存放路径,点击 Finish。

10. 在 pom.xml 中添加 Zipkin 依赖。

<dependencies>    <dependency>        <groupId>org.springframework.cloud</groupId>        <artifactId>spring-cloud-starter-zipkin</artifactId>    </dependency></dependencies>

11. 在 resources 路径下创建配置文件 application.yml,添加 Zipkin 相关配置。

server:  port: 8090spring:  application:    name: zipkinclient  sleuth:    web:      client:        enabled: true    sampler:      probability: 1.0  zipkin:    base-url: http://localhost:9090/eureka:  client:    service-url:      defaultZone: http://localhost:8761/eureka/

属性说明:

  • server.port:当前 Zipkin Client 服务端口。
  • spring.application.name:当前服务注册在 Eureka Server 上的名称。
  • spring.sleuth.web.client.enabled:设置是否开启 Sleuth。
  • spring.sleuth.sampler.probability:设置采样比例,默认是 0.1.
  • spring.zipkin.base-url:Zipkin Server 地址。
  • eureka.client.service-url.defaultZone:注册中心的访问地址。

12. 在 java 路径下创建启动类 ZipkinClientApplication。

@SpringBootApplicationpublic class ZipkinClientApplication {    public static void main(String[] args) {        SpringApplication.run(ZipkinClientApplication.class,args);    }}

注解说明:

  • @SpringBootApplication:声明该类是 Spring Boot 服务的入口。

13. 创建 ZipkinHandler,定义相关业务方法。

package com.southwind.controller;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/zipkin")public class ZipkinHandler {    @Value("${server.port}")    private String port;    @GetMapping("/index")    public String index(){        return "当前端口:"+this.port;    }}

14. 依次启动注册中心、Zipkin、ZipkinClient,如下图所示。

15. 打开浏览器访问 http://localhost:9090/zipkin/,可看到 Zipkin 首页,如下图所示。

16. 点击 Find Traces 按钮可看到监控数据情况,当前没有监控到任何数据,如下图所。

17. 通过 Postman 访问 http://localhost:8090/zipkin/index,如下图所示。

18. 再次刷新 http://localhost:9090/zipkin/,可看到监控数据,如下图所示。

19. 点击可查看详情,如下图所示。

总结

本节课我们讲解了使用 Zipkin 来实现服务链路追踪的具体操作,通过服务跟踪,我们可以追踪到每个网络请求,了解它整个运行流程,经过了哪些微服务、是否有延迟、耗费时间等,在此基础上我们能够更好的分析系统性能,解决系统问题。

请点击这里查看源码

Spring Cloud 面试题汇总

至此,本专栏为大家详细讲解 Spring 全家桶最热门的模块 Spring Cloud 的使用,包括服务网关、Ribbon、Feign、Hystrix、Spring Cloud Config 等,涵盖了实际开发中常用的技能点,理论结合实践的方式不仅仅让读者掌握基本概念,同时具备使用 Spring Cloud 搭建微服务架构的能力。

快速上手 Spring Cloud -> Spring Cloud 实践入门

1. 什么是 Spring Cloud?

<summary>点击查看答案</summary>

  • Spring Cloud 基于 Spring Boot 使得整体的开发、配置、部署都非常方便,可快速搭建基于微服务的分布式应用,Spring Cloud 相当于微服务各组件的集大成者。
  • Spring Boot 和 Spring Cloud 的关系可大致理解为,Spring Boot 快速搭建基础系统,Spring Cloud 在此基础上实现分布式系统中的公共组件,如服务注册、服务发现、配置管理、熔断器、控制总线等,服务调用方式是基于 REST API,整合了各种成熟的产品和架构。
点击获取更多 Spring Cloud 面试题详解

2. Spring Cloud 和 Spring 之间有什么关联关系?

<summary>点击查看答案</summary>

Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的开发便利性巧妙地简化了分布式系统基础设施的开发。服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 Spring Boot 的开发风格做到一键启动和部署。为了解决微服务架构中服务治理而提供的具备一系列功能的开发框架,并且 Spring Cloud 是完全基于 Spring Boot 进行开发的,Spring Cloud 利用 Spring Boot 特性整合了开源行业中优秀的组件,整体对外提供了一套在微服务架构中服务治理的解决方案。

点击获取更多 Spring Cloud 面试题详解

3. Spring Cloud 实现服务注册和发现的原理是什么?

<summary>点击查看答案</summary>

  • 服务在发布时指定对应的服务名(服务名包括了 IP 地址和端口)将服务注册到注册中心(Eureka 或者 Zookeeper)这一过程是 Spring Cloud 自动实现的,只需要在 main 方法添加 @EnableDisscoveryClient 即可,同一个服务修改端口就可以启动多个实例。
  • 调用方法:传递服务名称通过注册中心获取所有的可用实例,通过负载均衡策略调用(Ribbon 和 Feign)对应的服务。
点击获取更多 Spring Cloud 面试题详解

4. Ribbon 和 Feign 有什么区别?

<summary>点击查看答案</summary>

Ribbon 和 Feign 都是用于调用其他服务的,不过方式不同。

  • 启动类使用的注解不同,Ribbon 使用的是 @RibbonClient,Feign 用的是 @EnableFeignClients。
  • 服务的指定位置不同,Ribbon 是在 @RibbonClient 注解上声明,Feign 则是在定义抽象方法的接口上使用 @FeignClient 声明。
  • 调用方式不同,Ribbon 需要自己构建 HTTP 请求,模拟 HTTP 请求然后使用 RestTemplate 发送给其他服务,步骤相当繁琐。

Feign 则是在 Ribbon 的基础上进行了一次改进,采用接口的方式,将需要调用的其他服务的方法定义成抽象方法即可。不需要自己构建 HTTP 请求,不过要注意的是抽象方法的注解、方法签名要和提供服务的方法完全一致。

点击获取更多 Spring Cloud 面试题详解

5. 为什么要使用 Spring Cloud 熔断器,它的作用是什么?

<summary>点击查看答案</summary>

当一个服务调用另一个服务,由于网络原因或者自身原因出现问题时 ,调用者就会等待被调者的响应,当更多的服务请求到这些资源时,导致更多的请求等待,这样就会发生连锁效应,断路器就是解决这一问题的。

断路器的状态有以下几种:

  • 完全打开:一定时间内,达到一定的次数无法调用,并且多次检测没有恢复的迹象,断路器完全打开,那么下次的请求不会请求到该服务。
  • 半开:短时间内有恢复迹象,断路器会将部分请求发送给服务,当能正常调用时,断路器关闭。
  • 关闭:服务一直处于正常状态,能正常调用,断路器关闭。
点击获取更多 Spring Cloud 面试题详解

6. 什么是 Hystrix?

<summary>点击查看答案</summary>

Hystrix 是一个延迟和容错库,旨在隔离远程系统,服务和第三方库的访问点,当出现故障是不可避免的故障时,停止级联故障并在复杂的分布式系统中实现弹性。通常对于使用微服务架构开发的系统,涉及到许多微服务,这些微服务彼此协作, 随着微服务数量的增加,这个问题变得更加复杂。我们将使用 Hystrix 的 Fallback 方法来处理,假设由于某种原因,公开的服务接口抛出异常,我们在这种情况下使用 Hystrix 定义一个回退方法。这种后备方法应该具有与公开服务相同的返回类型,如果暴露服务中出现异常,回退方法将返回对应信息。

点击获取更多 Spring Cloud 面试题详解

7. Eureka 和 ZooKeeper 有哪些区别?

<summary>点击查看答案</summary>

  • Eureka 不再从注册列表移除因长时间没收到心跳而应该过期的服务;Eureka 仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点(高可用);当网络稳定时,当前实例新的注册信息会被同步到其他节点中(最终一致性);Eureka 可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像 ZooKeeper 一样使得整个注册系统瘫痪。
  • ZooKeeper 有 Leader 和 Follower 角色,Eureka 各个节点平等。ZooKeeper 采用过半数存活原则,Eureka 采用自我保护机制解决分区问题。
点击获取更多 Spring Cloud 面试题详解

8. 为什么要使用负载均衡?

<summary>点击查看答案</summary>

在程序运行时,负载平衡可以改善跨计算机、计算机集群、网络链接、中央处理单元或磁盘驱动器等多种计算资源的工作负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免任何单一资源的过载。使用多个组件进行负载平衡而不是单个组件可能会通过冗余来提高可靠性和可用性,负载平衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务器进程。

点击获取更多 Spring Cloud 面试题详解

9. Spring Cloud 实现服务注册和发现的具体流程是什么?

<summary>点击查看答案</summary>

当我们开始一个项目时,通常在属性文件中进行所有的配置,随着越来越多的服务开发和部署,添加和修改这些属性变得更加复杂。有些服务可能会下降,而某些位置可能会发生变化,手动更改属性可能会产生问题。Eureka 服务注册和发现可以在这种情况下提供帮助,由于所有服务都在 Eureka 服务器上注册并通过调用 Eureka 服务器完成查找,因此无需处理服务地点的任何更改和处理。

点击获取更多 Spring Cloud 面试题详解

10. 为什么要使用 Spring Cloud ,它有哪些优势?

<summary>点击查看答案</summary>

  • 解决与分布式系统相关的复杂性问题,这种开销包括网络问题、延迟开销、带宽问题、安全问题。
  • 服务发现—服务发现工具管理群集中的流程和服务如何查找和互相交谈,它涉及一个服务目录,在该目录中注册服务,然后能够查找并连接到该目录中的服务。
  • 解决分布式系统中的冗余问题。
  • 负载平衡改善跨多个计算资源的工作负荷,诸如计算机、计算机集群、网络链路、中央处理单元或磁盘驱动器的分布。
点击获取更多 Spring Cloud 面试题详解
Spring Boot 启动原理
微服务概述
注册中心
服务提供者
跨服务接口调用神器 RestTemplate
服务消费者
用服务网关统一 URL,开发更简洁
Ribbon 负载均衡
Spring Cloud Feign 声明式接口调用
Hystrix 容错监控机制
Spring Cloud Config 本地配置
搭建消息中间件 RabbitMQ 环境
Spring Cloud Config 远程配置
微服务项目实战:环境搭建
注册中心和配置中心
服务提供者 account
服务提供者 menu
服务提供者 order
服务提供者 user
服务消费者 clientfeign

阅读全文: http://gitbook/gitchat/column/5e38e68dec8d9033cf91a047

更多推荐

Spring Cloud 极简入门