springcloud


1 主要介绍

1.1 主要内容

微服务的由来,以及微服务和springcloud之间的关系
springcloud核心组件的使用,快速搭建一个微服务架构
springcloud中的辅助组件,例如微服务监控、链路追踪
springcloud Alibaba,以及核心组件的具体用法

1.2 收获

了解微服务的由来以及基本原理
学会springcloud各个组件的实验
了解springcloud中核心组件的运行原理
掌握通过springcloud搭建微服务架构
掌握辅助组件的用法

2 微服务介绍

微服务越来越流行,什么是微服务?使用微服务能给我们的开发带来什么改变?
为什么要使用微服务?
互联网应用产品的两大特点:需求变化快、用户群体庞大
我们需要构建一个能灵活扩展,同时能够快速应对外部环境的一个应用,使用传统的开发方式,无法满足修改,这时候微服务就登场了。

2.1 什么是微服务?

微服务就是一种将一个单一应用程序拆分为一组小型服务的方法,拆分完成后,每一个服务都运行在独立的进程中,服务与服务之间采用轻量级的通信机制来进行沟通(springcloud采用基于HTTP的RESTful API)。

每一个服务,都是围绕具体的业务进行构建,例如一个电商系统,订单服务、支付服务、物流服务、会员服务等,这些拆分后的应用都是独立的应用,都可以独立的部署到生产环境中。在采用微服务之后,我们的项目不再拘泥于一种语言,可以多种语言混合使用,这在传统开发中是无法想象的。而使用微服务之后,我们可以根据业务的上下文来选择合适的语言和工具进行构建。

微服务可以理解为SOA的一个传承,一个本质的区别是微服务是一个真正的分布式、去中心化的,微服务的拆分比SOA更加彻底。

2.2 微服务的优势

1、复杂度可控
2、独立部署
3、技术选型灵活
4、较好的容错性
5、较强的可扩展性

2.3 使用springcloud的优势

springcloud是微服务这种思想在java领域下的一个具体落地,springcloud在发展之初,借鉴了微服务的思想,同时结合springboot,springcloud提供了组件的一键式启动和部署能力,极大的简化了微服务架构的落地。

springcloud这种框架,从设计之初,就充分考虑了分布式架构演化所需要的功能,例如服务注册、配置中心、消息总线以及负载均衡。这些功能都是可插拔的形式提供出来的,这样,在分布式系统不断演化的过程中,我们的spring也可以非常方便的进化。

3 springcloud介绍

3.1 什么是springcloud

springcloud是一系列框架的集合,springcloud内部包含了许多框架,这些框架相互协作,共同构建分布式系统,利用这些组件可以非常方便的构建一个分布式系统。

3.2 核心

1、服务注册与发现
2、负载均衡
3、服务之间调用
4、容错、服务降级、断路器
5、消息总线
6、分布式配置中心
7、链路器

3.3 版本名称

不同于其他框架,springcloud版本名称是通过A、B、C、D这样来命名的,这些名字使用了伦敦地铁站的名字。

springcloud中除了大版本之外,还有一些小版本,小版本命名方式如下:
M版:里程碑Milestone的缩写
RC版:Release Candidate,表示该项目处于后续状态,这是正式发布之前的一个状态
SR版:Service Release,表示正式发布的稳定版,相当于GA(Generally Available)版
Snapshot:快照版

4 springcloud体系

4.1 springcloud包含组件

springcloud Netflix,这个组件在springcloud成立之初,立下汗马功劳,但是2018年断更了
springcloud Config,分布式配置中心,利用git/svn来集中管理项目的配置文件
springcloud Bus,消息总线,可以构建消息驱动的微服务,也可以用来做一些状态管理
springcloud Consul,服务注册发现
springcloud Stream,基于Redis、RabbitMQ、kafka实现的消息微服务
springcloud OpenFeign,提供OpenFeign集成到Springboot应用中的方式,主要解决微服务之间的调用问题
springcloud Gateway,springcloud官方推出的网关服务

springcloud Cloudfoundry,利用Cloudfoundry集成应用程序
springcloud Security,在Zuul代理中,为OAuth2客服端认证提供支持
springcloud AWS,快速集成亚马逊云服务
springcloud Contract,一个消费者驱动,面向java的契约框架
springcloud Zookeeper,基于Apache Zooleeper的服务注册和发现
springcloud DataFlow,在一个结构化的平台上,组成数据微服务
springcloud Kubernetes,springcloud提供针对Kubernetes的支持
springcloud Function,函数式编程
springcloud Task,短生命周期的微服务

4.2 Springcloud和springboot版本关系

Springcloudspringboot
2020.0.x aka Ilford2.4.x
Hoxton2.2.x, 2.3.x (Starting with SR5)
Greenwich2.1.x
Finchley2.0.x
Edgware1.5.x
Edgware1.5.x

5 Eureka

5.1 注册中心

Eureka是Springcloud中的注册中心,类似于Dubbo中的Zooleeper,什么是注册中心?为什么需要注册中心?
传统的单体应用:
传统的单体应用

在单体应用中,所有的业务都集中在一个项目中,当用户从浏览器发起请求是,直接由前端发起请求给后端,后端调用业务逻辑,给前端请求作出响应,完成一次调用,后端调用过程是一条直线,不需要服务之间的中转,所以没有必要引入注册中心。

随着公司项目越来越大,我们会将系统进行拆分,例如一个电商项目,可以拆分为订单模块、物流模块、支付模块、CMS模块等,这样,当用户发起请求时,就需要各个模块之间进行协作,这样不可避免的要进行模块之间的调用,此时,我们的系统架构就会发生变化。
在这里插入图片描述
在这里,可以看到模块之间的调用变得越来越复杂,而且模块之间还存在强耦合,例如A调用B,也意味着B的部署位置要固定,同时,如果以后B要进行集群化部署,A也需要修改。
为了解决服务与服务间的高耦合,注册中心闪亮登场。

5.2 Eureka

Eureka是Netflix公司提供的一款服务注册中心,Eureka是基于REST来实现服务的注册与发现,曾经,Eureka是Springcloud中最重要的核心组件之一。Springcloud中封装了Eureka,在Eureka的基础上,优化了一些配置,然后提供了可视化的页面,可以方便的查看服务的注册情况以及服务注册中心集群的运行情况。
Euraka由两部分组成:服务端和客户端,服务端就是注册中心,用来接收其他服务的注册,客户端则是一个java客户端,用来注册,并可以实现负载均衡等功能。
在这里插入图片描述
从图中可以看出,Eureka中有三个角色:
Eureka Server:注册中心
Service Provider:服务提供者(客户端)
Service Consumer:服务消费者(客户端)

5.1 Eureka搭建

Eureka本身是使用java来开发的,springcloud使用Springboot中使用Eureka非常方便,主需要引入spring-cloud-starter-netflix-eureka-server这个依赖即可,然后就像启动一个普通的Springboot项目一样启动Eureka即可。

1、创建一个普通的springboot项目,创建时添加Eureka依赖:
在这里插入图片描述

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
		</dependency>

2、项目创建成功后,在项目启动类上添加@EnableEurekaServer注解,标记该项目是一个Eureka Server
EurakaApplication.java
3、在application.yml中添加基本配置信息

application-a.yml(Eureka Server)

4、配置完成后启动项目
http://localhost:8088/,浏览器如下所示,搭建成功
在这里插入图片描述

内容名称包含内容
System Status系统状态启动时间等
DS Replicas集群副本就请你环境下的副本,也就是当前服务从哪里同步数据
Instances currently registered with Eureka当前注册上来的服务
General Info系统运行环境内存、cpu
Instance Info当前服务的基本信息ip地址、状态

5.2 Eureka集群

在使用注册中心后,所有的服务都要通过服务注册中心来进行信息交换,服务注册中心的稳定性就非常重要了,一旦服务中心掉线,会影响整个系统的稳定性,所以,在实际开发中,Eureka一般都是以集群的形式出现的。

Eureka集群,实际上就是启动多个Eureka实例,多个Eureka实例之间互相注册,互相同步数据,共同组成一个Eureka集群。

1、搭建Eureka集群,首先的准备工作是修改电脑的hosts文件,路径:C:\Windows\System32\drivers\etc\hosts
文件保存不了请按此教程操作:Win10怎么修改hosts文件

127.0.0.1   eurekaA eurekaB

2、在5.1节的基础上,我们在resources目录下,分别创建两个文件

application-a.yml(Eureka Server)
application-b.yml(Eureka Server)

3、配置完后,当前项目打成jar包
在这里插入图片描述
4、打包完成后,在命令行启动两个Eureka实例

C:\Users\22370\Desktop\springcloud>cd C:\Users\22370\Desktop\springcloud\euraka\target
C:\Users\22370\Desktop\springcloud\euraka\target>java -jar euraka-0.0.1-SNAPSHOT.jar --spring.profiles.active=a
C:\Users\22370\Desktop\springcloud\euraka\target>java -jar euraka-0.0.1-SNAPSHOT.jar --spring.profiles.active=b

编译a的时候由于b还未注册,a会报错,可以无视错误,是正常的在这里插入图片描述
在这里插入图片描述

5、启动成功后就可以看到两个集群互相注册共同组成一个集群

5.3 Eureka工作细节

Eureka本身可以分为两大部分:Eureka Server和Eureka Client

5.3.1 Eureka Server

Eureka Server对外提供了三个功能:
1、服务注册
所有的服务注册到Eureka Server上面来
2、提供注册表
注册表就是所有注册上来服务的一个列表,Eureka Client在调用服务时,需要获取这个注册表,一般来说,这个注册表会缓存下来,如果缓存失败,则直接获取最新的注册表。
3、同步状态
Eureka Client通过注册、心跳等机制,和Eureka Server同步当前客户端状态。

5.3.2 Eureka Client

Eureka Client主要是用来简化每一个服务和Eureka Server之间的交互,Eureka Client会自动拉取、更新以及缓存Eureka Server中的信息,这样,及时Eureka Server所有节点都宕机,Eureka Client依然能够获取到想要调用的服务的地址(但是地址可能不准确)。

5.3.2.1 服务注册

服务提供者将自己注册到服务中心(Eureka Server),需要注意,所谓的服务提供者,只是一个业务上的划分,本质上就是一个Eureka Client。当Eureka Client向Eureka Server注册时,他需要提供自身的一些元数据的信息,例如IP地址、端口、名称、运行状态等等。

5.3.2.2 服务续约

Eureka Client注册到Eureka Server上之后,事情没有结束,刚刚开始而已,注册成功后,默认情况下,Eureka Client每隔30秒就要向Eureka Server发送一条心跳信息,来告诉Eureka Server我还在运行。如果Eureka Server连续90秒都没有收到Eureka Client的续约消息,它会认为Eureka Client已经掉线,会将掉线的Eureka Client从当前的服务注册列表中删除。
服务续约有两个相关的属性(一般不建议修改):

### application.properties
# 表示服务的续约时间
eureka.instance.lease-renewal-interval-in-seconds=30
# 表示服务的失效时间
eureka.instance.lease-expiration-duration-in-seconds=90
5.3.2.3 服务下线

当Eureka Client下线时,它会主动发送一条信息,告诉Eureka Server,我下线了。

5.3.2.4 获取注册表的信息

Eureka Client从Eureka Server上获取服务的注册信息,并将其缓存在本地。本地客户端,在需要调用远程服务时,会从该信息中查找远程服务所对应的IP地址、端口等信息。Eureka Client上缓存的服务注册信息会定期更新,如果Eureka Server返回的注册表信息与本地缓存的注册表信息不同的话,Eureka Client会自动处理。

这里,也涉及到两个属性

# 是否允许获取注册表的信息
eureka.client.fetch-registry=true
# Eureka Client上缓存的服务注册信息,定期更新的时间间隔,默认30秒
eureka.client.registry-fetch-interval-seconds=30

5.4 Eureka集群原理

官方的Eureka集群架构图

在这个集群架构中,Eureka Server之间通过Replicate进行数据同步,不同的Eureka Server之间不区分主从节点,所有的节点都是平等的。节点之间,通过置顶serviceUrl来互相注册形成一个集群,进而提高节点的可用性。

在Eureka Server集群中,如果有一个节点宕机,Eureka Client会自动切换到新的Eureka Server上,每一个Eureka Server节点,都会互相同步数据。

6.1 服务注册

服务注册就是把一个微服务注册到Eureka Server上,这样当其他服务需要调用该服务时,只需要从Eureka Server上查询该服务的信息即可。
1、创建一个provider
作为我们服务的提供者,创建项目时,选择Web和Eureka Client依赖,这样,当服务创建成功后,简单配置一下,就可以注册到Eureka Client上。
在这里插入图片描述

在这里插入图片描述
2、项目创建成功后,在application.yml中配置一下项目的地址即可。 注册地址的配置,和Eureka Server集群的配置很像。配置如下:

application.yml(Eureka Client)
启动Eureka Server,待服务注册中心启动成功后,再启动provider。

3、两者都启动成功后,浏览器中看到provider,服务注册成功。
在这里插入图片描述

6.2 服务消费

1、部署一个写死provider地址的consumer
首先在provider中提供一个接口,然后创建一个新的consumer项目,消费这个接口。

在provider中,提供一个hello的接口如下:

HelloController.java

接下来,创建一个consumer项目,去消费provider提供的接口。consumer要能够获取到provider这个接口的地址,他就要去Eureka Server中查询。如果直接在consumer中写死provider地址,意味着这两个服务之间的耦合度太高了我们需要降低耦合度,首先来看一个写死的调用。

创建一个consumer项目,添加web和Eureka Client依赖
项目创建过程见6.1 服务注册,实际上就是创建一个Eureka Client。
创建完成后,我们首先也在application.yml中配置一下注册信息。
application.yml(Eureka Consumer)

配置完后,假设我们现在在consumer中调用provider提供的服务,我们可以直接调用写死。就是说,整个调用过程中不会涉及到Eureka Server(不过为了让程序正常启动,还是需要先启动Eureka Server)。
UseHelloController.java public String hello1();

先启动EurekaApplication.java Eureka Server
再启动ProviderApplication.java Eureka Client
最后启动ConsumerApplication.java Eureka Consumer
地址栏输入:http://localhost:1114/hello1
最后运行的结果如下:
在这里插入图片描述

在这里插入图片描述这是一段利用了HttpURLConnection来发起请求,请求中provider的地址写死了,意味着provider和consumer高度绑定在一起,这个不符合微服务的思想。

2、部署一个不写死provider地址的consumer
要改造它我们可以通过Eureka Client提供的DiscoveryClient工具,利用这个工具,我们可以根据微服务的名称从Eureka Server上查询一个服务的详细信息,改造后的代码见:
UseHelloController.java public String hello2();

地址栏输入:http://localhost:1114/hello2
最后运行的结果如下:
在这里插入图片描述注意,DiscoveryClient查询到的服务列表是一个集合,因为服务在部署的过程中可能是集群化部署,集合的每一项就是一个实例。

3、集群化部署
修改provider中的hello接口:
HelloController.java(集群化部署)

启动多个provider实例,多个provider实例的端口不同,为了区分调用时到底是哪一个provider提供的服务,这里在接口返回值中返回端口。

修改完成后,对provider打包。provider打包成功后,在命令行启动两个provider实例:

java -jar provider-0.0.1-SNAPSHOT.jar --server.port=1113
java -jar provider-0.0.1-SNAPSHOT.jar --server.port=1115

启动完成后,检查Eureka Server上,两个provider是否成功注册上来。
在这里插入图片描述

注册成功后,在consumer中再去调用provider,DiscoveryClient集合中,获取到的就不是一个实例了。这里可以手动实现一个负载均衡(在从集合中,获取数据时,通过count++取余数组长度,就可以实现线性负载均衡。)。
HelloController.java(集群化部署) public String hello3();

多次刷新网址http://localhost:1114/hello3:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
【2021年,将Spring全家桶系列课程进行Review,修复顺序等错误。进入2022年,将Spring的课程进行整理,整理为案例精讲的系列课程,并新增高级的Spring Security等内容,通过手把手一步步教你从零开始学会应用Spring,课件将逐步进行上传,敬请期待】 本课程是Spring案例精讲课程的第四部分Spring Cloud,Spring案例精讲课程以真实场景、项目实战为导向,循序渐进,深入浅出的讲解Java网络编程,助力您在技术工作中更进一步。 本课程聚焦Spring Cloud的核心知识点:注册中心、服务提供者与消费者、服务的调用OpenFeign、Hystrix监控、服务网关gateway、消息驱动的微服务Spring Cloud Stream、分布式集群、分布式配置中心的案例介绍, 快速掌握Spring Cloud的核心知识,快速上手,为学习及工作做好充足的准备。 由于本课程聚焦于案例,即直接上手操作,对于Spring的原理等不会做过多介绍,希望了解原理等内容的需要通过其他视频或者书籍去了解,建议按照该案例课程一步步做下来,之后再去进一步回顾原理,这样能够促进大家对原理有更好的理解。【通过Spring全家桶,我们保证你能收获到以下几点】 1、掌握Spring全家桶主要部分的开发、实现2、可以使用Spring MVC、Spring Boot、Spring Cloud及Spring Data进行大部分的Spring开发3、初步了解使用微服务、了解使用Spring进行微服务的设计实现4、奠定扎实的Spring技术,具备了一定的独立开发的能力  【实力讲师】 毕业于清华大学软件学院软件工程专业,曾在Accenture、IBM等知名外企任管理及架构职位,近15年的JavaEE经验,近8年的Spring经验,一直致力于架构、设计、开发及管理工作,在电商、零售、制造业等有丰富的项目实施经验  【本课程适用人群】如果你是一定不要错过!  适合于有JavaEE基础的,如:JSP、JSTL、Java基础等的学习者没有基础的学习者跟着课程可以学习,但是需要补充相关基础知识后,才能很好的参与到相关的工作中。 【Spring全家桶课程共包含如下几门】 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值