传送门
SpringMVC的源码解析(精品)
Spring6的源码解析(精品)
SpringBoot3框架(精品)
MyBatis框架(精品)
MyBatis-Plus
SpringDataJPA
SpringCloudNetflix
SpringCloudAlibaba(精品)
Shiro
SpringSecurity
java的LOG日志框架
Activiti(敬请期待)
JDK8新特性
JDK9新特性
JDK10新特性
JDK11新特性
JDK12新特性
JDK13新特性
JDK14新特性
JDK15新特性
JDK16新特性
JDK17新特性
JDK18新特性
JDK19新特性
JDK20新特性
JDK21新特性
其他技术文章传送门入口
前言
本文第一代SpringCloudNetflix和第二代SpringCloudAlibaba都有讲解。参考尚硅谷周阳老师的资料。
下面文章不定期更新中。。。
SpringCloud服务注册中心
SpringCloud服务调用
SpringCloud服务降级
SpringCloud服务网关
SpringCloud服务配置
SpringCloud服务总线
SpringCloud消息驱动
SpringCloud链路跟踪
SpringCloud分布式事务
一、概念
1、概念理论图
老版本组件
红框为升级后新的选型
2、版本选型
https://spring.io/projects/spring-cloud#overview
https://spring.io/projects/spring-cloud#learn 后面的是其他框架的具体版本
https://docs.spring.io/spring-cloud/docs/current/reference/html/
其他版本在同一页
更细粒度:
https://start.spring.io/actuator/info
版本组件选择说明:
看wiki里面的说明。https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
3、restTemplate
httpClient基础上封装了一次
并没有用微服务的组件
用了微服务组件,依据注册中心可以拿到一个一样的名字,然后默认是负载均衡-轮询的策略,来实现调用达到负载均衡(服务提供端要做集群)
前端截图去访问的话会报错,因为没有设置负载均衡(未设置代码)
要加一个注解来启动负载均衡。
备注:
SOA是面向服务的架构,系统的所有服务都注册在总线上,当调用服务时,从总线上查找信息,然后调用服务
其他一些概念:
中文官网,注意版本号切换
https://github.com/alibaba/spring-cloud-alibaba/blob/2.2.x/README-zh.md
4、全部四个注册中心
Eureka、Zookeeper、Consul、Nacos
二、服务注册中心Eureka
1、Eureka服务端
Eureka服务端pom的配置 (多余的jar包,比如durid多引入了,会报数据库相关错误,所以pom要简洁)
Eureka服务端的yml配置
Eureka服务端的启动类配置
2、Eureka客户端
Eureka客户端(任何微服务)的pom配置
Eureka客户端(任何微服务)的yml配置
Eureka客户端(任何微服务)的启动类配置
3、Eureka访问
访问地址
原理
Eureka的自我保护机制 CAP中的AP
4、说明
Eureka已经停止更新,原来是Netflix公司的,建议使用阿里巴巴公司的Nacos。
注册中心除了提供注册发现服务外,注册的客户端微服务的application.name还能被当做url地址来访问(只限制与微服务和微服务的调用,直接 http浏览器访问是不行的)。
例如 order微服务注册到Eureka里面的肯定是大写ORDER服务名称(当application.yml配置name为order时),那么http://ORDER就是这个微服务的URI,加一些资源路径,在浏览器是不能访问的,比如http://ORDER/order/get/1,这种在浏览器访问不行(毕竟是公网,要ip地址和端口号, 浏览器地址是 http://localhost:80/order/get/1),但是在微服务和微服务直接调用完全可以,用restTemplate模板的时候。
三、服务注册中心Zookeeper
1、安装
https://blog.csdn.net/ring300/article/details/80446918
jar包冲突解决(记录一次,我弄的时候都是最新项目,没有冲突)
安装后类似tomcat或者redis那样在window启动一下,看网站有说明,要改配置文件,不然启动会报错
2、服务提供者修改配置
payment8004改pom
引入注册中心
3、消费者修改配置
orderZk80改pom
引入注册中心
直接通过注册中心提供的地址去调用了消费者payment8004的接口
在Linux中可以通过命令查看,就是yml配置中的application.name
4、说明
zookeeper是java开发的,并且在Linux系统下可以用命令查看到引入到注册中心的服务,比如上面截图中的payment8004,它没有像Eureka一样的浏览器界面让我们直观的看(听说现在可以配置了,但是很不好用?)。
Eureka在客户端断开后,会进入自我保护机制,长达90秒(默认设置),在超过90秒后才删除服务。而Zookeeper则只有2000毫秒(默认设置),客户端断开后(客户端挂机或者客户端网络问题等等),2000毫秒就删除服务了,基本可以认为是及时删除,客户端只是Zookeeper的临时节点。
和Eureka不同的还有,注册后的服务地址就是小写,同样的直接到浏览器肯定是不能用这个服务地址的,但是服务和服务直接调用完成可以,而且和application.name设置的名字一模一样,没有像Eureka那样全部变大写。
四、服务注册中心Consul
1、安装
官网直接下载解压后,就是一个consul.exe可执行程序。非常方便。
consul agent -dev命令启动,在cmd框中。当然也可以直接双击运行。
访问地址:http://localhost:8500
安装目录下面的cmd框运行这个命令
cmd启动框
2、服务提供者修改配置
payment8006改pom配置
改yml配置 引入注册中心(把localhost改成本地ip地址不行,可能有什么原因,暂时不知道)
3、消费者修改配置
orderConsul80改pom配置
改yml配置 引入注册中心
微服务发现地址
4、说明
HashiCrop公司用Go语言写的。分布式服务发现和配置管理系统。提供了完整的服务网格解决方案。有自己的可视化界面。说是Zookeeper配置完也有,但是支撑不太好。除去Zookeeper,其他三个注册中心都有自己的可视化界面。
和Zookeeper非常相似,类似redis或者tomcat的window版本启动,注册后微服务能够互相调用的地址也是小写,同样的浏览器不能直接访问这个服务地址,和application.name名字一模一样,并且由于和Zk都是CAP中的CP,保证强一致性的,微服务挂掉后,很快就会删除微服务,类似ZK。,而Eureka是AP,不会马上删除微服务。Consul有自己非常漂亮的可视化界面。
5、上面三个注册中心对比
对比
6、CAP经典简单举例
P肯定会有,现在不是CP就是AP,P就是有问题的时候,不会因为一个节点挂了影响整体,很分布式很微服务,所以肯定会满足。而A和C是互斥的,A是可用C是强一致,举个例子:点赞数,在一定情况下,是允许点赞数不是那么实时,统计出来不是那么准确的,这种情况下就是保证了点赞数这个功能的可用性,由于这样,统计不准确,数据肯定不准确,数据就不是强一致性,就不满足C了。所以点赞数一般都是AP,能用就行了。有些,比如订单这种,数据必须准确,一般都是CP。
CP这种情况下,为了数据一致性,B服务直接返回错误码了。而AP情况下,B服务能正常返回。
五、服务注册中心Nacos
1、概念
Nacos=Eureka+Config+Bus
1.1、下载
https://github.com/alibaba/nacos 这个网站 点nacos.io过去就是官网
点开源版会回到前面截图
这边版本下载
1.2、安装运行
直接解压,出来一个nacos文件夹
bin下cmd运行命令 startup.cmd -m standalone 因为默认是集群模式了,这边要指明单机模式启动 linux对应为 sh startup.sh -m standalone
http://localhost:8848/nacos 浏览器访问 账号密码 默认都是 nacos
1.3、访问
为了版本一致性,降低到1.4.2了
2、注册中心
2.1、服务提供者配置
注意:总pom的版本一定要按照官网上要求的来,不然各种坑,各种报错。一定要版本保持一致。
改pom
改yml
改启动类
业务类 (payment9001 和 payment9002类似,启动集群)
测试成功
2.2、消费者配置
改pom
改yml
改启动类
业务类
restTemplate的坑
消费者要单独引入,不然报 payment这个url是未知host地址
报错原因猜测就是 新版并没有看到包含ribbon了。
测试结果,请求轮询 9001 9002
2.3、坑
版本一定要匹配,项目中我用错了Alibaba的版本,用的2.2.7导致,服务提供者一直无法注册进去
为了保证版本一直,将nacos下载安装的降低到1.4.2版本了。下载一个tar.gz包就行了,在三个操作系统window(同上安装)、mac、Linux(官网命令)都能用。
3、配置中心
3.1、概念
两个配置,bootstrap和application
官网理论
视频的配置案例说明(注意深坑,nacos那边配置时, .yml不行呀,要.yaml才行)
视频的配置(注意深坑,.yml不行呀,要.yaml才行)
视频的配置(注意深坑,.yml不行呀,要.yaml才行)(这里截图是对的,data ID 要有.yaml的后缀结尾。注意!注意!注意!)
小总结
3.2、客户端配置(nacos本身就是服务端)
改pom
改yml(红框的字,不知道后面有没有优化)(坑:注意yaml的格式,不能被其他配置插入影响了)
改yml
改启动类(这个上面加个@RefreshScope,全局影响)
业务类(这个@RefreshScope可以放在启动类,全局影响)
nacos配置文件。这个具体可以看上面的概念截图。坑多,配置要非常仔细。(不用像config那样搞github,非常方便)
测试结果。成功
3.3、坑
客户端启动错误,坑1,但是还是不行啊,看后面截图
https://blog.csdn.net/wyz0923/article/details/118303072
网速源码解析
在application.yml加上name配置就可以了,在bootstrap加上就不行。原因就在于改了规则,得引入bootstrap的依赖
坑2
深坑
深坑,还是报错,因为ymal写错了,正确的是 yaml
这才是正确的
3.4、动态刷新
Controller上面加个@RefreshScope注解。
支持nacos的动态刷新,不是被动的,是真正的,不像config那样还得主动post请求什么的,或者结合mq还是要请求。这个主动刷新了,nacos那边的配置一改,马上生效,不用人工去post,不用重启任何微服务,不用重启nacos,真棒!!!。
真正的动态刷新。秒杀config+bus,帅的一批
3.5、分类配置概念
4、集群和持久化
4.1、概念
持久化说明:
不能用自带的内嵌数据库derby,当要弄nacos集群的时候,每个都在自己带的数据库里面存,数据有一致性问题,所以要 集中用MySQL数据库
4.2、数据库操作(同理移植到Linux系统)
在自己MySQL数据库创建数据库
改application文件
视频的修改截图
我自己修改的截图,注意数据库名称 和用户名和密码修改成自己MySQL数据库的,改错了又是深坑。而且url参考了这个配置文件的(比官网东西多)
重启后发现之前的dev和test等都不见了,说明对了,之前是存到内嵌数据库的,现在链接到了MySQL数据库了。
4.3、nacos的修改
改conf下面文件
改conf下面文件(注意,这边一定要在Linux系统查看hostname -i 看到的ip地址,不能是localhost和127)
养成好习惯,先备份原来的配置文件 .bk结尾
视频截图,这个我下的版本已经有了,不用搞这个
视频截图,这个我下的版本由于前面截图已经有了,后面不用跟着搞了,实测可以
启动命令:
sh startup.sh -p 3333(在bin目录下./startup.sh -p 3333这个居然不行)
sh startup.sh -p 4444
sh startup.sh -p 5555
ps -ef | grep nacos| grep -v grep|wc -l 命令检查几个启动了,是3才对
4.4、nginx的修改
视频截图
我自己的截图
开启端口*(注意把8848也加上去)
启动命令:
nohup /usr/local/nginx/sbin/nginx &
4.5、坑
在吉帆Linux启动nacos集群的时候,发现linux内存不够用,改shartup.sh把,值改小,依次为 64 64 40,生产环境一般不用改。还是不够用,Linux环境测试放弃
4.6、日志的坑
默认按照上面的配置启动后,会有大量日志产生。所以后面要关闭一下配置再去启动。
vim /usr/local/nacos/conf/application.properties
4.7、小总结
1、集群和持久化,都在Linux系统环境中弄;
2、首先Linux中的MySQL数据库要安装弄好,并且创建数据库nacos_config,然后nacos安装路径下面的application.properties文件要增加db连接等内容连接到Linux系统上的MySQL数据库;
3、其次Linux中的nacos安装好后,在conf文件下创建新文件cluster.conf文件,里面加上3个或3个以上的ip地址和端口;视频改了shutup.sh的启动文件,但是新版本不用改了。并且window环境下需要三份nacos文件,而linux环境下不需要,启动的时候带参数就能抽像成三份。
4、再次Linux中的Nginx要修改nginx.config文件,增加3个ip地址的负载均衡和反向代理。(Nginx本身没有做集群) nohup /usr/local/nginx/sbin/nginx & 启动。
5、上面四个注册中心对比
对比(这里面nacos显示了支撑ap,其实cp也支撑,可以切换),nacos全场景覆盖,相当牛批
下面命令就是切换cp模式
六、综合案例:Alibaba组件整合
1、服务提供者
2、服务消费者
3、nacos配置
4、gateway网关