视频来源: 【Java项目《谷粒商城》Java架构师 | 微服务 | 大型电商项目】
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
GitHub 官网: SpringCloud Alibaba
eureka 以及 Hystrix 停止维护
SpringCloud 的几大痛点
SpringCloud Alibaba 的优势:
阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源出来大家用成套的产品搭配完善的可视化界面给开发运维带来极大的便利搭建简单,学习曲线低。
结合 SpringCloud Alibaba 我们最终的技术搭配方案:
SpringCloud Alibaba - Nacos
:注册中心(服务发现/注册)
SpringCloud Alibaba - Nacos
:配置中心(动态配置管理)
SpringCloud - Ribbon
:负载均衡
SpringCloud - Feign
:声明式 HTTP客户端(调用远程服务)
SpringCloud Alibaba - Sentinel
:服务容错(限流、降级、熔断)
SpringCloud - Gateway
:API网关(webflux 编程模式)
SpringCloud - Sleuth
:调用链监控
SpringCloud Alibaba - Seata
:原Fesca
,即分布式事务解决方案
由于 Spring Boot 1 和 Spring Boot 2 在 Actuator 模块的接口和注解有很大的变更,且 spring-cloud-commons 从 1.x.x 版本升级到 2.0.0 版本也有较大的变更,因此我们采取跟 SpringBoot 版本号一致的版本 :
在 gulimall-common
模块中导入依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>2.1.0.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理 平台。他是使用 java 编写。需要依赖 java 环境
Nacos 文档地址: https://nacos.io/zh-cn/docs/quick-start.html
Demo案例演示: Nacos Discovery Example
1.1 下载 Nacos
下载地址: https://github.com/alibaba/nacos/releases
1.2 启动 Nacos
进入到nacos的bin目录,打开cmd命令行,输入: startup.cmd -m standalone
单机模式启动
1.3 gulimall-common
模块引入依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
1.4 在模块的application配置文件中,配置Nacos注册地址以及注册服务名
spring:
application:
name: gulimall-coupon # 服务名
cloud:
nacos:
discovery:
server-addr: localhost:8848
1.5 启动类增加: @EnableDiscoveryClient
注解
@SpringBootApplication
@EnableDiscoveryClient
@MapperScan("com/atguigu/gulimall/coupon/dao")
public class GulimallCouponApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallCouponApplication.class);
}
}
1.6 启动服务
总结
使用 nacos-discovery 步骤:
@EnableDiscoveryClient
coupon作为服务提供者,member服务消费者。使用OpenFeign的前提是注册到服务注册中心
2.1 将 gulimall-member
、gilimall-coupon
注册到 Nacos注册中心
2.2 在 gulimall-member
中引入 OpenFeign 依赖(在创建模块时已经引入)
2.3 在 gilimall-coupon
的 controller 层提供服务
// 测试 OpenFeign 远程调用
@RequestMapping("coupons")
public R memberCoupons() {
List<CouponEntity> list = couponService.list();
return R.ok().put("list",list);
}
2.4 gulimall-member
中的主启动类增加 @EnableFeignClients
注解
@SpringBootApplication
@MapperScan("com.atguigu.gulimall.member.dao")
@EnableDiscoveryClient
@EnableFeignClients
public class GulimallMemberApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallMemberApplication.class);
}
}
2.5 gulimall-member
中创建远程调用接口: 明确调用了哪个服务的哪个请求
@FeignClient("gulimall-coupon") // 远程调用的服务名
public interface CouponFeign {
@RequestMapping("/coupon/coupon/coupons") // 要写完整路径
public R memberCoupons();
}
2.6 调用 CouponFeign 接口中的 memberCoupons 方法就相当于调用了 gilimall-coupon
中的memberCoupons 方法
@Autowired
private CouponFeign couponFeign;
// 测试 OpenFeign
@RequestMapping("coupons")
public R testOpenFeign() {
R r = couponFeign.memberCoupons();
return r;
}
总结
使用OpenFeign的步骤:
@EnableFeignClients
注解@FeignClient
指明调用的服务名3.1 gulimall-common
中引入 config 依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
3.2 在 gulimall-coupon
中创建 bootstrap.properties
配置文件
spring.application.name=gulimall-coupon
# 配置中心的地址
spring.cloud.nacos.config.server-addr=localhost:8848
bootstrap 会优先于 application 配置文件加载
3.3 在Nacos配置中心,创建配置文件,文件名: gulimall-coupon.properties
3.4 使用 @Value + @RefreshScope
动态获取配置中心的配置
@RestController
@RequestMapping("coupon/coupon")
@RefreshScope // 动态刷新Nacos配置
public class CouponController {
@Value("${coupon.user.name}")
private String name;
@Value("${coupon.user.age}")
private String age;
// 测试Nacos配置中心
@RequestMapping("testConfig")
public R testConfig() {
return R.ok().put("name",name).put("age",age);
}
}
总结
使用Nacos-Config 步骤:
@RefreshScope + @Value
动态获取配置命名空间(namespace) 用来做配置隔离。默认创建的配置文件都在 public 命名空间里。
比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个 Namespace,不同的Namespace之间是隔离的。
通过配置 spring.cloud.nacos.config.namespace=命名空间ID
指定加载哪个命名空间下的配置文件
如果每一个服务的配置众多,也可以根据不同的服务创建命名空间进行隔离。
Data Id: 配置文件名
DataID 命名规则:
prefix- spring.profiles.active.file-extension
prefix: 默认为 spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置。
spring.profiles.active: 即为当前项目的环境(dev、test、prod)。 注意:当 spring.profiles.active
为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 prefix.extension
file-exetension : 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension
来配置。目前只支持 properties 和 yaml 类型。
设置不同的分组,隔离配置,默认配置组是 DEFAULT_GROUP
每个服务创建自己的命名空间,使用配置分组区分环境(test、prod、dev)
通过配置 spring.cloud.nacos.config.group=组名
指定使用哪个组。
创建三个配置文件: 分别保存数据库连接、MyBatis-Plus、其他配置信息。
bootstrap 配置文件:
spring.application.name=gulimall-coupon
# 配置中心的地址
spring.cloud.nacos.config.server-addr=localhost:8848
# 指定命名空间
spring.cloud.nacos.config.namespace=00319af2-fcbf-4322-996f-f501ebdf5176
# 指定组
#spring.cloud.nacos.config.group=test
# 加载多个配置文件
# 第一个
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=others.yaml
# 组名
spring.cloud.nacos.config.ext-config[2].group=dev
# 是否自动刷新
spring.cloud.nacos.config.ext-config[2].refresh=true
网关作为流量的入口,常用功能包括路由转发、权限校验、限流控制等。而 springcloud gateway 作为 SpringCloud 官方推出的第二代网关框架,取代了 Zuul 网关。
路由: 路由是网关最基础的部分,路由信息有一个 ID、一个目的 URL、一组断言和一组 Filter 组成。如果断言路由为真,则说明请求的 URL 和配置匹配
断言: Java8 中的断言函数。Spring Cloud Gateway 中的断言函数输入类型是 Spring5.0 框架中的 ServerWebExchange。Spring Cloud Gateway 中的断言函数允许开发者去定义匹配来自于 http request 中的任何信息,比如请求头和参数等。
过滤器: 一个标准的 Spring webFilter。Spring cloud gateway 中的 filter 分为两种类型的 Filter,分别是 Gateway Filter 和 Global Filter。过滤器 Filter 将会对请求和响应进行修改处理
当前端发送请求,网关将符合断言的请求转发给对应的服务中,在请求前后均能使用过滤器完成某些操作
官网帮助文档: SpringCloud Gateway
1、创建网关模块: gulimall-gateway
2、修改SpringBoot和SpringCloud的版本
3、配置文件
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
gateway:
routes:
- id: baidu_route
uri: https://www.baidu.com
predicates:
- Query=url,baidu
- id: qq_route
uri: https://www.qq.com
predicates:
- Query=url,qq
server:
port: 88
4、主启动类
@EnableDiscoveryClient
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class GulimallGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallGatewayApplication.class, args);
}
}