Spring cloud

理论

微服务的概念:
微服务的概念源于2014年3月Martin Fowler所写的一篇文章“Microservices”,微服务架构是一种架构模式,他提倡将单一应用程序划分成一组小的服务,服务之间互相互相协调、互相配合,为用户提供最终价值,每个服务运行在其独立的进程中,服务与服务间采用器轻量级的通信机制互相沟通(通常是基于HTTP的RESTFUL API)。每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生产环境、类生产环境等,另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建。微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的(可以相互调用)。每个微服务仅关注于完成一件任务并很好的完成该任务,在所有的情况下,每个任务代表着一个小的业务能力。

耦合: 两个东西的关联度,根据关联度的高低来分耦合的程度,
分为:

完全耦合:关联紧密,不能分开,下一步以上一步为基础
松耦合:关联度不高
完全解耦:没有任何关联

微服务可以放在容器里跑,容器需要给微服务提供环境,容器里跑的就是微服务,容器跟微服务没有关系

为什么叫微服务架构?
整个架构里只要有微服务层,就可以叫做微服务架构

容易混淆的概念:

Spring boot: spring boot是一个框架,一种全新的编程规范,他的产生简化了框架的使用,所谓简化是指简化了spring众多框架中所需的大量且繁琐的配置文件,所以springboot是一个服务于框架的框架,服务范围是简化配置文件

Spring cloud: spring cloud基于spring boot提供了一整套服务的解决方案,包括服务注册与发现,配置中心,全链路监控,服务网关,负载均衡,熔断器等组件

Spring cloud利用spring boot的开发便利性巧妙的简化了分布式系统的基础设施开发,spring cloud为开发人员提供了快速构建分布式系统的一些工具,包扣配置管理、服务发现、断路器、路由、微代理、事件总线,他们都可以用spring boot的开发风格做到一键启动和部署

Springboot与springcloud的区别
Spring boot:专注于快速方便的开发单个个体微服务(关注微观,简化配置);

Spring cloud:关注全局的微服务协调治理框架,将spring boot开发的一个个单体微服务组合并管理起来(关注宏观);

Spring boot可以离开spring cloud独立使用,但是spring cloud不可以离开spring boot,属于依赖关系。

Spring cloud全部组件的解析:

1、Fegin(接口调用): 微服务之间通过rest接口通讯,springcloud提供fegin框架来支持rest的调用,fegin使得不同进程的rest接口调用得以用优雅的方式进行,这种优雅表现的就像同一个进程调用一样(简化微服务的通信过程)

2、Eureka(注册发现): 微服务模式下,一个大的web应用通常都被拆分为很多比较小的web应用(服务),这个时候就需要有一个地方保存这些服务的相关信息,才能让各个小的应用彼此知道对方,这个时候就需要在注册中心进行注册。每个应用启动时向配置的注册中心注册自己的信息(IP地址、端口号、服务名称等信息),注册中心将他们保存起来,服务间相互调用的时候,通过服务名称就可以到注册中心找到对应的服务信息,从而进行通讯,注测与发现服务为微服务之间的调用带来了方便,解决了硬编码的问题,服务间只通过对方的服务id,而无需知道其IP和端口即可,以获取对方服务

硬编码: 代码写死,调用谁就写谁才能查找出来

3、Ribbon(负载均衡): ribbon是Netflix发布的负载均衡器,他有助于控制http和TCP客户端的行为,为ribbon配置服务提供者的地址列表后,ribbon就可基于某种负载均衡算法,自动的帮助服务消费者去请求。Ribbon默认为我们提供了很多的负载均衡算法,例如轮询、随机等,当然,我们也可为ribbon实现自定义的负载均衡算法,在spring cloud中,当ribbon与eureka配合使用时,ribbon可自动从eurekaserver获取服务提供者的地址列表,并基于负载均衡算法,请求其中一个服务提供者的实例(为了服务的可靠性,一个微服务可能部署多个实例)

4、Hystrix(熔断器): 当服务提供者响应非常缓慢,那么消费者对提供者的请求就会被强制等待,直到提供者响应超时。在高负载场景下,如果不做任何处理,此类问题可能会导致服务提供者的资源耗竭甚至整个系统的崩溃(雪崩效应)。Hystrix正是为了防止此类问题发生。Hystirx是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或第三方库,防止级联失败,从而提升系统的可用性与容错性。
在这里插入图片描述
5、Zuul(微服务网关): 不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,例如一个电影购票的手机app。可能调用多个微服务的接口才能完成一次购票的业务流程,如果让客户端直接与各个微服务通信,会有以下的问题:

01.客户端会多次请求不同的微服务,增加了客户端的复杂性

02.存在跨域请求,在一定场景下处理相对复杂

03.认证复杂,每个服务都需要独立认证

04.某些微服务可能使用了对防火墙、浏览器不友好的协议,直接访问时会有一定的困难

以上问题可借助微服务网关解决。
微服务网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过微服务网关。是由微服务网关后,微服务网关将封装应用程序的内部结构,客户端只用跟网关交互,而无须直接调用特定微服务的接口,这样,开发就可以得到简化,不仅如此,使用微服务网关还有以下优点:
1)易于监控:可在微服务网关收集监控数据并将其送到外部系统进行分析
2)易于认证:可在微服务网关上进行认证,然后再将请求转发到后端的微服务,而无需在每个微服务中进行认证
3)减少了客户端与各个微服务之间的交互次数

Spring cloud bus(统一配置服务): 对于传统的单体应用,常使用配置文件管理所有配置。例如一个springboot开发的单体应用,可将配置内容放在application.Yml文件中,如果需要切换环境,可设置多个profile,并在启动应用时指定spring.profiles.active={profile}。然而,在微服务架构中,微服务的配置管理一般有以下需求:

01.集中管理配置:一个使用微服务架构的应用系统可能会包含成百上千个微服务,因此集中管理配置是非常有必要的

02.不同环境、不同配置:例如数据源配置在不同的环境(开发、测试、预发布、生产等)中是不同的。

03.运行期间可动态调整:例如可根据各个微服务的负载情况,动态调整数据源连接池大小或熔断阈值,并且在调整配置时不停止微服务

04.配置修改后可自动更新:如配置内容发生变化,微服务能够自动更新配置
综上所述,对于微服务架构而言,一个通用的配置管理机制是必不可少的,常见做法是使用配置服务器管理配置,spring cloudbus利用GIT或SVN等管理配置、采用Kafka或rabbit MQ等信息总线通知所有应用,从而实现配置的自动更新并且刷新所有微服务实例的配置

Sleuth+zipkin(跟踪服务): sleuth和zipkin结合使用可以通过图形化的界面查看微服务请求的延迟情况及各个微服务的依赖情况,可以描绘出微服务系统的拓扑图,也可以根据耗时分析来做对某个微服务的优化

注:实验仅供参考,理论更加重要

环境:

主机ip
第一台192.168.10.10
第二台192.168.10.20

两台都要做

[root@localhost ~]# yum -y install git
[root@localhost ~]# git clone https://github.com/luojunyong/spring-cloud-examples.git

安装maven和jdk(两台都要安装)
jdk:

[root@localhost ~]# java -version
openjdk version "1.8.0_102"
OpenJDK Runtime Environment (build 1.8.0_102-b14)
OpenJDK 64-Bit Server VM (build 25.102-b14, mixed mode)
[root@localhost ~]# rm -rf /usr/bin/java #删除原本主机上的Java程序
[root@localhost ~]# java -version
-bash: /usr/bin/java: 没有那个文件或目录
[root@localhost ~]# tar -zxf jdk-8u201-linux-x64.tar.gz 
[root@localhost ~]# mv jdk1.8.0_201/ /usr/local/java

添加环境变量(通常情况我们使用第二种方法)

[root@localhost bin]# vim /etc/profile
#末尾添加
export JAVA_HOME=/usr/local/java
export JRE_HOME=/usr/local/java/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

[root@localhost bin]# source /etc/profile
[root@localhost bin]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/java/bin:/usr/local/java/jre/bin
[root@localhost bin]# java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)

maven:

[root@localhost ~]# tar -zxf apache-maven-3.6.0-bin.tar.gz 
[root@localhost ~]# mv apache-maven-3.6.0 /usr/local/maven
[root@localhost ~]# vim /etc/profile
export PATH=$PATH:/usr/local/maven/bin
[root@localhost ~]# source /etc/profile
[root@localhost ~]# mvn -v
Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-25T02:41:47+08:00)
Maven home: /usr/local/maven
Java version: 1.8.0_201, vendor: Oracle Corporation, runtime: /usr/local/java/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-514.el7.x86_64", arch: "amd64", family: "unix"

注册中心:
第一台:

[root@localhost ~]# cd /root/spring-cloud-examples/eureka-producer-consumer/spring-cloud-eureka/
[root@localhost spring-cloud-eureka]# vim src/main/resources/application.properties
3 server.port=8000  #端口
#修改
4 eureka.client.register-with-eureka=true #当前的应用是否注册在注册中心
5 eureka.client.fetch-registry=true  #当前的应用是否在注册中心上获取信息
7 eureka.client.serviceUrl.defaultZone=http://192.168.10.10:8000/eureka/,http://192.168.10.20:8000/eureka/  #注册中心的路径

[root@localhost spring-cloud-eureka]# systemctl stop firewalld
[root@localhost spring-cloud-eureka]# setenforce 0
[root@localhost spring-cloud-eureka]# mvn clean package
………………
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  13:53 min
[INFO] Finished at: 2021-01-22T11:02:10+08:00
[INFO] ------------------------------------------------------------------------

第二台:

[root@localhost ~]# cd /root/spring-cloud-examples/eureka-producer-consumer/spring-cloud-eureka/
[root@localhost spring-cloud-eureka]# vim src/main/resources/application.properties
3 server.port=8000
#修改
4 eureka.client.register-with-eureka=true
5 eureka.client.fetch-registry=true
7 eureka.client.serviceUrl.defaultZone=http://192.168.10.10:8000/eureka/,http://192.168.10.20:8000/eureka/ 

[root@localhost spring-cloud-eureka]# systemctl stop firewalld
[root@localhost spring-cloud-eureka]# setenforce 0
[root@localhost spring-cloud-eureka]# mvn clean package
…………
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  19:45 min
[INFO] Finished at: 2021-01-22T11:10:50+08:00
[INFO] ------------------------------------------------------------------------

两台都运行jar包

[root@localhost spring-cloud-eureka]# java -jar target/spring-cloud-eureka-0.0.1-SNAPSHOT.jar

都运行完成之后可以通过访问本机ip加8000端口去访问页面
在这里插入图片描述
在这里插入图片描述
produce 生产者:
第一台主机:另开一个终端

[root@localhost ~]# source /etc/profile
[root@localhost ~]# cd /root/spring-cloud-examples/eureka-producer-consumer/spring-cloud-producer/
[root@localhost spring-cloud-producer]# vim src/main/resources/application.properties
3 eureka.client.serviceUrl.defaultZone=http://192.168.10.10:8000/eureka/,http://192.168.10.20:8000/eureka/
[root@localhost spring-cloud-producer]# mvn spring-boot:run
………………

第二台主机: 也一样另开一个终端

[root@localhost ~]# source /etc/profile
[root@localhost ~]# cd /root/spring-cloud-examples/eureka-producer-consumer/spring-cloud-producer/
[root@localhost spring-cloud-producer]# vim src/main/resources/application.properties
3 eureka.client.serviceUrl.defaultZone=http://192.168.10.10:8000/eureka/,http://192.168.10.20:8000/eureka/
[root@localhost spring-cloud-producer]# vim src/main/java/com/neo/controller/HelloController.java #更改源代码
12         return "hello "+name+",this is first aaaaa";
[root@localhost spring-cloud-producer]# mvn spring-boot:run
…………

消费者:
第一台:再另开一个终端

[root@localhost ~]# source /etc/profile
[root@localhost ~]# cd /root/spring-cloud-examples/eureka-producer-consumer/spring-cloud-consumer/
[root@localhost spring-cloud-consumer]# vim src/main/resources/application.properties
2 server.port=9001
3 eureka.client.serviceUrl.defaultZone=http://192.168.10.10:8000/eureka/,http://192.168.10.20:8000/eureka/
[root@localhost spring-cloud-consumer]# mvn spring-boot:run

再次访问页面进行查看
在这里插入图片描述
在这里插入图片描述
第一台再重新开一个终端进行验证轮询

[root@localhost ~]# curl 192.168.10.10:9001/hello/haha
hello haha,this is first aaaaa
[root@localhost ~]# curl 192.168.10.10:9001/hello/haha
hello haha,this is first messge 

出现轮询的效果 因为ribbon组件有负载均衡的功能
在这里插入图片描述

微服务的断容器

第一台主机consumer(消费者)停止
需要运行带熔断器的consumer

[root@localhost ~]# cd /root/spring-cloud-examples/spring-cloud-hystrix/spring-cloud-consumer-hystrix/
[root@localhost spring-cloud-consumer-hystrix]# vim src/main/resources/application.properties
4 eureka.client.serviceUrl.defaultZone=http://192.168.10.10:8000/eureka/,http://192.168.10.20:8000/eureka/
[root@localhost spring-cloud-consumer-hystrix]# mvn spring-boot:run

另开终端

[root@localhost ~]# curl http://192.168.10.10:9001/hello/aa
hello aa,this is first messge
[root@localhost ~]# curl http://192.168.10.10:9001/hello/aa
hello aa,this is first aaaaa 

第一台的produce(生产者)停止
再去另一台终端上访问查看

[root@localhost ~]# curl http://192.168.10.10:9001/hello/aa
hello aa,this is first aaaaa
[root@localhost ~]# curl http://192.168.10.10:9001/hello/aa
hello aa,this is first aaaaa

熔断器的监控界面 可以监控各项指标
把刚才关掉的produce(生产者)再运行起来
把启动的熔断器停止

[root@localhost spring-cloud-consumer-hystrix]# cd /root/spring-cloud-examples/hystrix-dashboard-turbine/spring-cloud-consumer-hystrix-dashboard/
[root@localhost spring-cloud-consumer-hystrix-dashboard]# vim src/main/resources/application.properties
#修改
eureka.client.serviceUrl.defaultZone=http://192.168.10.10:8000/eureka/,http://192.168.10.20:8000/eureka/
[root@localhost spring-cloud-consumer-hystrix-dashboard]# mvn spring-boot:run

另一台终端上查看

[root@localhost ~]# curl http://192.168.10.10:9001/hello/aa
hello aa,this is first messge
[root@localhost ~]# curl http://192.168.10.10:9001/hello/aa
hello aa,this is first aaaaa 

访问192.168.10.10:9001/hystrix
在这里插入图片描述
在这里插入图片描述

微服务的网关

在这里插入图片描述
调用的时候只需要找网关 不需要知道如何调用

如何通过网关去访问服务:
curl http://网关ip:port/对应服务的名称servername/访问改服务的方法

网关的作用:
1、请求转发(路由)
2、安全认证(token验证)

第一台上的熔断器停止

[root@localhost ~]# cd /root/spring-cloud-examples/spring-cloud-zuul/
[root@localhost spring-cloud-zuul]# cd spring-cloud-zuul/
[root@localhost spring-cloud-zuul]# vim src/main/resources/application.properties
#修改
eureka.client.service-url.defaultZone=http://192.168.10.10:8000/eureka,http://192.168.10.20:8000/eureka
[root@localhost spring-cloud-zuul]# mvn spring-boot:run

注:这里可能需要等待几分钟,等它的终端完全阻塞了
再开一台终端去访问

[root@localhost ~]# curl 'http://192.168.10.10:8888/spring-cloud-producer/hello?name=haha&token=123'
hello haha,this is first aaaaa 
[root@localhost ~]# curl 'http://192.168.10.10:8888/spring-cloud-producer/hello?name=haha&token=123'
hello haha,this is first messge

链路追踪

组件: sleuth(收集数据)、zipkin(存储数据、显示数据)组合在一块,实现链路追踪
如果请求经过上面的一条线路,当请求经过每一个节点的时候,都埋入一个调用记录(span),调用记录记录的是这个请求从哪来、来我这经历过多少时间、下一步要去哪。把所有的调用记录连到一块就可以分析出在这个微服务架构里走过的路径。当请求多、复制的话,会经过很多条调用记录,就可以描绘出微服务架构的拓扑图。一个点叫一个span,将span连接到一块叫做trace(相当于链路)

Sleuth 、zipkin 加起来的作用:
1.可以描绘出微服务层的架构,拓扑图
2.根据调用记录的特点,可以对请求经过的节点进行耗时分析
耗时分析的作用:可以根据耗时分析的结果,对相应的微服务节点进行专项优化,让微服务层更加的健康,更加有效率
在这里插入图片描述
可以将之前做的所有的都停掉
第一台调整内存大小为最少3G内存
直接使用链路追踪里面的生产者和消费者 从而看到实验结果

[root@localhost ~]# cd /root/spring-cloud-examples/spring-cloud-sleuth-zipkin/
[root@localhost spring-cloud-sleuth-zipkin]# ls
pom.xml  spring-cloud-eureka  spring-cloud-producer  spring-cloud-zuul  zipkin-server

启动注册中心

[root@localhost spring-cloud-sleuth-zipkin]# cd spring-cloud-eureka/
[root@localhost spring-cloud-eureka]# vim src/main/resources/application.yml
#修改
9       defaultZone: http://192.168.10.10:8761/eureka/
[root@localhost spring-cloud-eureka]# mvn spring-boot:run

另开终端 运行存储数据,进行链路追踪

[root@localhost ~]# cd /root/spring-cloud-examples/spring-cloud-sleuth-zipkin/zipkin-server/
[root@localhost zipkin-server]# vim src/main/resources/application.yml
#修改
4       defaultZone: http://192.168.10.10:8761/eureka/
[root@localhost zipkin-server]# mvn spring-boot:run

另开一台终端 运行生产者(producer)

[root@localhost ~]# cd /root/spring-cloud-examples/spring-cloud-sleuth-zipkin/spring-cloud-producer/
[root@localhost spring-cloud-producer]# vim src/main/resources/application.yml
#修改
7     base-url: http://192.168.10.10:9000
14       defaultZone: http://192.168.10.10:8761/eureka/
[root@localhost spring-cloud-producer]# mvn spring-boot:run

另开一台终端 运行网关

[root@localhost ~]# cd /root/spring-cloud-examples/spring-cloud-sleuth-zipkin/spring-cloud-zuul/
[root@localhost spring-cloud-zuul]# vim src/main/resources/application.yml 
#修改
7     base-url: http://192.168.10.10:9000
14       defaultZone: http://192.168.10.10:8761/eureka/
[root@localhost spring-cloud-zuul]# mvn spring-boot:run

另开一台终端去访问

[root@localhost ~]# curl 'http://192.168.10.10:8888/producer/hello?name=haha&token=123'
hello haha,this is first messge

访问192.168.10.10:9000
在这里插入图片描述
在这里插入图片描述

配置邮件

微服务如果出现问题,可以自动发送邮件

[root@localhost ~]# cd /root/spring-cloud-examples/spring-boot-admin-eureka/
[root@localhost spring-boot-admin-eureka]# ls
pom.xml  spring-boot-admin-server  spring-cloud-eureka  spring-cloud-producer  spring-cloud-producer-2
[root@localhost spring-boot-admin-eureka]# cd spring-cloud-eureka/
[root@localhost spring-cloud-eureka]# mvn spring-boot:run

另开终端 启动生产者

[root@localhost ~]# cd /root/spring-cloud-examples/spring-boot-admin-eureka/
[root@localhost spring-boot-admin-eureka]# cd spring-cloud-producer
[root@localhost spring-cloud-producer]# mvn spring-boot:run

另开终端启动第二个生产者

[root@localhost ~]#  cd /root/spring-cloud-examples/spring-boot-admin-eureka/spring-cloud-producer-2/
[root@localhost spring-cloud-producer-2]# mvn spring-boot:run

另开终端 配置邮件

[root@localhost ~]# cd /root/spring-cloud-examples/spring-boot-admin-eureka/spring-boot-admin-server/
[root@localhost spring-boot-admin-server]# vim src/main/resources/application.yml
8     username: 1612977378@qq.com  #自己的邮箱 
9     password: hflsjbnijpvucfgj   #授权码
21           from: 1612977378@qq.com   #发件人
22           to: 1612977378@qq.com    #收件人
[root@localhost spring-boot-admin-server]# mvn spring-boot:run

授权码获取方法:
打开qq邮箱——找到设置——找到账户——找到IMAP/SMTP服务 点击开启——验证完成之后保存授权码

随便停止自己的一个produce(生产者)
会发送邮件 邮件有可能会在垃圾箱里
在这里插入图片描述
监控的图形界面
http://192.168.10.10:8000
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值