目录
四、微服务——注册中心、配置中心、网关
1.SpringCloud-Alibaba简介
2.组件
3.版本选择、依赖注入
4.Nacos注册中心
5.OpenFeign测试远程调用
(1).Feign声明式远程调用
(2).模拟测试
5.Nacos配置中心
(1).配置
(2).测试
(3).真正的配置中心
(4).配置中心-命名空间与配置分组
(5).加载多配置集
6.Gateway网关
(1).相关概念
(2).How It Works
(3).配置
(4).测试网关
GitHub - alibaba/spring-cloud-alibaba: Spring Cloud Alibaba provides a one-stop solution for application development for the distributed solutions of Alibaba middleware.
SpringCloud-Alibaba包含开发分布式项目微服务的必要组件,开发者可以通过spring cloud编程模型轻松使用这些组件来开发分布式应用服务
只需要添加一些注解和少量配置,就可以spring cloud应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统
SpringCloud 的痛点:
部分组件停止更新和维护
部分环境搭建复杂,没有完善的可视化界面
配置复杂,难以上手
SpringCloudAlibaba的优势:
性能强悍、设计合理
搭配了完善的可视化界面
搭建简单
结合SpringCloudAlibaba,我们最终的技术搭建方案:
注册中心(服务发现、注册) :SpringCloud Alibaba-Nacos
配置中心(动态配置管理 ) :SpringCloud Alibaba-Nacos
负载均衡 :SpringCloud-Ribbon
声明式HTTP客户端(调用远程服务):SpringCloud-Fegin
服务容错(熔断、降级、限流) :SpringCloud Alibaba-Sentinel
API网关(webflux编程模式) :SpringCloud-Gateway
调用链监控 :SpringCloud-Sleuth
原Fescar,即分布式事务解决方案 :SpringCloud Alibaba-Seata
官网的推荐版本
这里我用的2.2.6
依赖注入到公共模块里
各种组件官方配置文档:spring-cloud-alibaba/README-zh.md at 2.2.x · alibaba/spring-cloud-alibaba (github.com)
Nacos注册中心官方配置文档:spring-cloud-alibaba/readme-zh.md at 2.2.x · alibaba/spring-cloud-alibaba (github.com)
引入Nacos Discovery Starter
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery
下载Nacos Server:Releases · alibaba/nacos (github.com) 解压出来,启动nacos/bin/startup.cmd
新版本nacos好像默认集群启动,如果启动失败可以找解决方法
配置yml文件,8848是nacos默认启动端口,配置name
主启动类添加@EnableDiscoveryClient
启动
访问localhost:8848/nacos,账号密码默认都是nacos
会员服务(gulimall-member)从注册中心获取到优惠券服务(gulimall-coupon)在哪些服务器上,再向服务器发送请求
Feign是一个声明式HTTP客户端,它的目的是让远程调用更简单,提供HTTP的请求模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息
Feign整合了Ribbon(负载均衡)和Hystrix(服务熔断)可以让我们不显示地使用这两个组件
OpenFeign在NextflixFegin的基础上拓展了springmvc注解的支持,在其实现下我们只需要常见一个接口并用注解的方式配置他,即可完成对服务提供方的接口绑定
确保你的微服务已经引入了openfegin
编写一个controller返回所有的优惠券
编写一个接口调用远程服务
添加@EnableFeignClients开启远程调用功能
重启两个微服务,访问/member/member/test
在访问member模块调用的时候,idea可能会报错 “Did you forget to include spring-cloud-starter-loadbalancer?”
由于SpringCloud Feign在Hoxton.M2 RELEASED版本之后不再使用Ribbon而是使用spring-cloud-loadbalancer,所以不引入spring-cloud-loadbalancer会报错 解决方法 加入spring-cloud-loadbalancer依赖 并且在nacos中排除ribbon依赖,不然loadbalancer无效
org.springframework.cloud spring-cloud-starter-loadbalancer 3.1.3
参考文章:spring cloud整合feign和nacos报错:No Feign Client for loadBalancing defined. Did you forget to include_OldMan1024的博客-CSDN博客
启动成功之后访问8002网页可能会报500,这是因为我们在上面添加了spring-cloud-loadbalancer,但是还没有删除ribbon的依赖
所以删除掉ribbon的依赖就成功了
参考文章:hystrix客户端服务降级报错:org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.choose_肖了个肖~的博客-CSDN博客
修改pom.xml,引入Nacos Config Starter
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config
在bootstrap.properties文件中配置Nacos Config元数据
在application.properties设置user.name会默认获取到系统的名字
在启动项目之后查看log有没有输出获取配置源的信息,如果没有,很可能是因为使用了高版本的spingboot
需要引入spring-cloud-starter-bootstrap依赖 来使bootstrap.properties文件生效
org.springframework.cloud spring-cloud-starter-bootstrap 3.1.3
测试成功
在上面我们配置都是在每个微服务模块的application.properties里,但是在实际开发过程中,如果要修改配置文件,不可能每一个微服务模块都手动去修改,使用nacos配置中心来解决。
在实际过程中,如果配置中心和配置文件中都配置了相同的项,优先使用配置中心的
在nacos可视化界面里添加一个配置
重启项目,依旧能获取到值
在项目运行的情况下,在nacos可视化界面修改配置文件
刷新页面,发现没有动态改变
在控制层上加一个@RefreshScope注解实现动态刷新
重启项目并且重新修改值测试成功
命名空间:配置隔离,默认是public(保留空间),默认新增的所有配置都在public空间。可以指定像dev、prod等环境命名空间,不同环境下配置文件可以重命名。然后在bootstrap.properties配置文件指定要使用的命名空间的id spring.cloud.nacos.config.namespace= id
配置集:所有配置的集合
配置集id:类似配置文件名
默认分组:默认是DEFAULT_GROUP
新建命名空间
配置组
随着项目业务的完善,配置文件的配置也相当巨大,所有我们一般将不同的配置属性放到不同的配置集里,方便后期的维护和更新
将不同的配置放到各个配置集里,之后再bootstrap.properties里设置获取这三个配集的总和
可以设置data-id、group、以及refresh(是否动态刷新。默认false)
添加coupon微服务模块所需要的配置
点进这条代码,发现是之前配置的一个集合
将application.yml里的代码注释了,重新启动项目
启动成功
访问成功
同时,尽管我们的配置文件是放到了配置中心,但是springboot以前从任何配置文件获取值都还能使用。(@Value)
网关作为流量的入口,功能包括路由转发、权限校验、限流控制等
官方文档:Spring Cloud Gateway
Route(路由):包含独一无二的路由id、目的地的URL、断言集合、过滤器集合,断言用来判断路由是否能到达目的地URL
Predicats(断言):用来判断路由是否能到达目的地URL
Filter(过滤器):在请求访问成功之前、响应成功之后,都能进行修改
当请求到达网关,网关先利用断言判断这次请求是否符合路由规则,如果符合规则,就经过一系列的过滤器之后到达目的地。
可以在yml文件里配置
开启服务注册发现
配置nacos的注册中心地址
将网关的配置也配置到配置中心
因为我们在common模块里配置了mybatis相关的依赖,所以默认spring会扫描我们的数据库配置,为了防止找不到数据库配置报错,我们要排除掉数据库配置
启动成功
测试是否能访问成功
需要注意的是在配置uri的时候,需要加上https、htpp,否则会报错java.lang.IllegalArgumentException: The parameter [www.xxxxxx.com] format is incorrect, scheme can not be empty
同时一些网址是net结尾,简易先去指定网站查看完整的网址再测试
一些其他的错误也可以参考文章:近期遇到的一些问题_周有骛的博客-CSDN博客
访问成功(大都是404)