1、SpringCloud Alibaba简介
1)、简介
SpringCloud Alibaba致力于提供微服务开发的一站式解决方案。此项包含开发分布式应用微服务的必须组件,方便开发者通过SpringCloud编程模型轻松使用这些组件来开发分布式应用服务。
依托SpringCloud Alibaba,您只需要添加一些注解和少量配置,就可以将SpringCloud应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统
2)、为什么使用
SpringCloud Alibaba的优势
阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源出来 大家用成套的产品搭配完善的可视化界面给开发运维带来了极大的便利,搭建简单,学习曲线低
结合SpringCloud Alibaba我们最终的技术搭配方案
SpringCloud Alibaba - Nacos : 注册中心(服务发现/注册)
SpringCloudAlibaba - Nacos : 配置中心(动态配置管理)
SpringCloud - Ribbon : 负载均衡
SpringCloud - Feign : 声明式HTTP客户端(调用远程服务)
SpringCloud Alibaba - Sentinel : 服务容错(限流、降级、熔断)
SpringCloud - Gateway: API 网关(webflux编程模式)
SpringCloud - Sleuth : 调用链监控
SpringCloud Alibaba - Seata : 原 Fescar:即分布式事务解决方案
3)、版本选择
项目版本号为xxx形式,其中x为数字,从0开始,不限于0~9范围。项目处于孵化器阶段时,版本号为0.xx
由于 Spring Boot 1 和 Spring Boot 2 的接口和注解在 Actuator 模块中发生了很大的变化,而 spring-cloud-commons 从 1.xx 到 2.0.0 也发生了很大的变化,我们采用相同的版本规则为SpringBoot 版本号。
- 1.5.x 用于 Spring Boot 1.5.x
- 2.0.x 用于 Spring Boot 2.0.x
- 2.1.x 用于 Spring Boot 2.1.x
- 2.2.x 用于 Spring Boot 2.2.x
- 2020.x 用于 Spring Boot 2.4.x
- 2021.x 用于 Spring Boot 2.6.x
- 2021.x 分支:对应 Spring Cloud 2021 & Spring Boot 2.6.x。支持 JDK 1.8 或更高版本。
- 2020.0 分支:对应 Spring Cloud 2020 & Spring Boot 2.4.x。支持 JDK 1.8 或更高版本。
- 2.2.x 分支:对应 Spring Cloud Hoxton & Spring Boot 2.2.x。支持 JDK 1.8 或更高版本。
- 格林威治分支:对应于 Spring Cloud Greenwich & Spring Boot 2.1.x。支持 JDK 1.8 或更高版本。
- finchley 分支:对应于 Spring Cloud Finchley & Spring Boot 2.0.x。支持 JDK 1.8 或更高版本。
- 1.x 分支:对应Spring Cloud Edgware & Spring Boot 1.x,支持JDK 1.7 或更高版本。
2、SpringCloud Alibaba-Nacos[作为注册中心]
Nacos是阿里马马开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。他是使用java编写。需要依赖java环境
1)、下载Nacos-server
http://github.com/alibaba/nacos/releases
2)、启动nacos-server
双击bin中的startup.cmd文件
访问http://localhost:8848/nacos
使用默认的nacos/nacos进行登录
3)注册服务导包
在gulimall-common模块中
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
<dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
4)配置注册地址,在模块/src/resource/application.properties配置文件中配置Nacos Server地址
spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848 application: name: member
5)使用@EnableDiscoveryClient注解开启服务注册与发现功能
在模块启动器上方添加注解
@SpringBootApplication
@EnableDiscoveryClient
public class GulimallMemberApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallMemberApplication.class, args);
}
}
6)登录nacos,查看服务列表是否存在该服务
其他模块也按这种方式进行服务注册
Feign声明式远程调用
1、简介
Fegin是一个声明式的HTTP客户端,它的目的就是让远程调用更加简单。Feign提供了HTTP请求模块,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息
Feign整合了Ribbon(负载均衡)和Hystrix(服务熔断)可以让我们不再需要电焊工地使用这两个组件。
SpringCloudFeign在NetflixFegin的基础上扩展了对SpringMVC注解的支持,在其实现下,我们只需要创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定。简化了SpringCloudRlbbon自行封闭服务调用客户端的开发量。
2、使用(例member调用coupon模块)
1)引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
2)在gulimall-coupon的controller的CouponController文件下
@RestController @RequestMapping("coupon/coupon") public class CouponController { @Autowired private CouponService couponService; @RequestMapping("/member/list") public R membercoupons(){ CouponEntity coupon = new CouponEntity(); coupon.setCouponName("满100减10"); return R.ok().put("coupons",Arrays.asList(coupon)); }
2)开启feign功能
@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign")
声明
@FeignClient("coupon") public interface CouponFeignService { @RequestMapping("/coupon/coupon/member/list") public R membercoupons(); }
调用
@Autowired CouponFeignService couponFeignService; @RequestMapping("/coupons") public R test(){ MemberEntity memberEntity = new MemberEntity(); memberEntity.setNickname("张三"); R membercoupons = couponFeignService.membercoupons(); return R.ok().put("member",memberEntity).put("coupons",membercoupons.get("coupons")); }
/**
1、想要远程调用别的服务
1)、引入 open-feign
2)、编写一个接口,告诉springcloud这个接口需要远程服务
1、声明接口的每一个方法都是调用哪个远程服务的那个请求
3)、开启远程调用功能
*/
个人理解 :远程调用分客户端和服务端
在客户端和服务端都引用openfeign的包
服务端只需要正常写请求返回服务就好RequestMapping
客户端需要声明调用的接口,接口类上需要加上FeignClient("服务名")
使用时,客户端在Controller中调用该接口需要先注入接口,然后再使用
客户端的启动类上需要开启远程调用@EnableFeignClients(basePackages="全路径包名")
R 实质上是个Map
常见故障
Nacos作为配置中心管理配置
接入:
1、修改公共模块的pom.xml文件,引入Nacos Config Starter
<!-- nacos配置中心--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!-- 查询spring官网,发现spring团队居然将spring-cloud-starter-bootstrap提取出来了, 在以前的版本中,bootstrap是整合在springboot中的,从springboot2.4就独立出来了。--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> <version>3.1.1</version> </dependency>
2、在使用模块的/src/main/resources/bootstrap.properties配置文件中配置Nacos Config元数据
什么是元数据:描述其它数据的数据
在Nacos指的节点、配置、分组等基础信息
#服务名 spring.application.name=coupon #配置管理地址 spring.cloud.nacos.config.server-addr=127.0.0.1:8848 #服务注册地址 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
测试:
在使用的模块的Controller中添加
@Value("${coupon.user.name}") private String name; @Value("${coupon.user.age}") private Integer age; @RequestMapping("/test") public R test(){ return R.ok().put("name",name).put("age",age); }
在nacos中添加模块的默认配置
增加配置:模块名.properties
内容为:
coupon.user.name=zhangsan2 coupon.user.age=20
启动模块服务,访问Controller中test地址,如果结果正确则正常
如果需要动态刷新,则在Controller上面添加注解: @RefreshScope
/**
1、如何使用Nacos作为配置中心统一管理配置
1)、引入依赖
2)、创建bootstrap.properties并配置元数据
3)、需要给配置中心默认添加一个叫数据集(Data Id)coupon.properties.默认规则 ,应用名.properties
4)给应用名.properties添加任何配置
5)动态获取配置
@RefreshScope:动态刷新并获取配置
@Value("${配置项的名}"):获取到配置
如果配置中心和当前应用的配置文件中都配置了相同的项,优先使用配置中心的配置
2、细节
1)、命名空间
默认:public(保留空间):默认新增的所有配置都在public空间
应用场景一:开发、测试、生产:利用命名空间来做环境隔离
使用:在bootstap.properties中添加
spring.cloud.nacos.config.namespace=命名空间ID
应用场景二:可以基于微服务给每一个微服务创建一个命名空间
2)配置集:所有配置的集合
3)命名集ID:类似文件名。
Data ID:类似文件名
4)配置分组:
默认所有的配置集都属于:DEFAULT_GROUP
使用:在bootstap.properties中添加
spring.cloud.nacos.config.group=分组名
每个微服务创建自己的命名空间,使用配置分组区分环境,dev,test,prod
3、同时加载多个配置集
1)微服务任何配置信息,任何配置文件都可以放在配置中心中
2)、只需要在bootstrap.properties说明加载中心哪些配置文件即可
3)、@Value,@ConfigurationProperties...
以前SpringBoot任何方法从配置文件中获取值,都能使用
配置中心有的优先使用配置中心的
*/
同时添加多个配置集
#服务名 spring.application.name=coupon #配置管理地址 spring.cloud.nacos.config.server-addr=127.0.0.1:8848 #服务注册地址 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 #命名空间 spring.cloud.nacos.config.namespace=259cd183-7f9b-4d99-9963-564509574c1e #配置分组 spring.cloud.nacos.config.group=dev #多配置 spring.cloud.nacos.config.ext-config[0].data-id=datasource.yaml spring.cloud.nacos.config.ext-config[0].group=dev spring.cloud.nacos.config.ext-config[0].refresh=true spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yaml spring.cloud.nacos.config.ext-config[1].group=dev spring.cloud.nacos.config.ext-config[1].refresh=true spring.cloud.nacos.config.ext-config[2].data-id=other.yaml spring.cloud.nacos.config.ext-config[2].group=dev spring.cloud.nacos.config.ext-config[2].refresh=truem
网关
API网关:可以做鉴权、限流、日志输出
Gateway
1、简介:
网关作为流量的入口,常用功能包括路由转发,权限校验、限流控制等。而Springcloud gatewaywt作为SpringCloud官方推出的第二代网关框架,取代了Zuul网关
网关提供API全托管服务,丰富的API管理功能,辅助企业管理大规模的API,以降低管理成本和安全风险,包括协议适配、协议转发、安全策略、防刷、流量、监控日志等功能
SpringCloud Gateway旨在提供一种简单而有效的方式来对API进行路由,并为他们提供切面 ,例如:安全性,监控/指标和弹性等
流程:请求进来---》进入到断言,判断是否符合路由规则-----》进行过滤-----》转到实际的请求服务中
Route:路由规则
Predicate:断言,如何判断成功与失败
Filter:过滤,使用哪些过滤