SpringCloud Alibaba分布式组件
一、分布式组件

GitHub学习网址:https://github.com/alibaba/spring-cloud-alibaba/blob/2.2.x/README-zh.md
SpringCloud Alibaba官方网站:https://spring.io/projects/spring-cloud-alibaba/
二、SpringCloud Alibaba引入pom依赖
<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>
三、SpringCloud Alibaba-Nacos
SpringCloud Alibaba-Nacos【作为注册中心】
①Nacos作为注册中心pom所需导入的依赖
<!-- Nacos--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
②虚拟机启动Nacos服务

③yml配置文件中配置Nacos Server地址
spring: cloud: nacos: discovery: server-addr: 192.168.254.128:8848 #虚拟机ip地址加docker中nacos服务的端口地址 application: name: gulimall-coupon #服务注册的名称
④启动类上加注解进行服务注册
@EnableDiscoveryClient
⑥访问Nacos
http://192.168.254.128:8848/nacos
⑦服务注册成功

SpringCloud Alibaba-Nacos【作为配置中心】
①Nacos作为配置中心pom所需导入的依赖
注意:springboot2.4及以上版本需要添加spring-cloud-starter-bootstrap依赖
<!-- nacos作为配置中心来做配置管理--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
<!--spring-cloud-starter-bootstrap依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.1.1</version>
</dependency>
②bootstrap.properties配置文件中配置Nacos Config元数据
spring.application.name=gulimall-coupon spring.cloud.nacos.config.server-addr=192.168.254.128:8848
spring.cloud.nacos.config.namespace=c88828d0-9152-49b5-839e-5b396b717bab #切换其他环境 利用命名空间的id
spring.cloud.nacos.config.group= 自定义组名 #绑定Group
③需要给配置中心默认添加一个叫 数据集(Data Id)gulimall-coupon.properties 默认规则 应用名.propertie


④动态获取配置 ==>如果配置中心和当前应用的配置文件中都配置了相同的项,有限使用配置中心的配置
@RefreshScope #动态获取并刷新配置
@Value("${配置项的名}") #获取到配置
注意:
1、命名空间:配置隔离;
默认:public(保留空间); 默认新增的所有配置都在public空间
①开发、测试、生产:利用命名空间来做环境隔离 ==>配置上,需要使用哪个命名空间下的配置


②每一个微服务之间相互隔离配置,每一个微服务都创建自己的命名空间,只加载自己命名空间下的所有配置

2、配置集:所有的配置的集合
3、配置集ID:类似文件名
Data ID: 类似文件名
4、配置分组
默认所有的配置集都属于:DEFAULT_GROUP ==>可以随意定义组名

每个微服务创建自己的命名空间,使用配置分组区分环境,dev,test,prod
5、同时加载多个配置集
①微服务任何配置信息,任何配置文件都可以放在配置中心中


②只需要再bootstrap.properties说明加载配置中心中哪些配置文件即可
spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml 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.yml 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.yml spring.cloud.nacos.config.ext-config[2].group=dev spring.cloud.nacos.config.ext-config[2].refresh=true
四、Feign 声明式远程调用
步骤:先启动被调用的微服务,再启动需调用的微服务,否则会导致500错误
①Feign 声明式远程调用所需依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
②在另一个微服务下创建方法
@RestController @RequestMapping("/member/member") public class MemberController { @RequestMapping("/coupons") public R test(){ MemberEntity memberEntity = new MemberEntity(); memberEntity.setNickname("张三"); R memercoupons = couponFeignService.memercoupons(); return R.ok().put("member",memberEntity).put("coupons",memercoupons.get("coupons")); }
③在当前微服务下创建feign包作为远程调用包,包下创建调用服务接口
@FeignClient("gulimall-coupon") #远程调用的微服务名称
public interface CouponFeignService {
@RequestMapping("/coupon/coupon/member/list")
public R memercoupons(); #另一微服务中的方法 声明接口的每一个方法都是调用哪个远程服务的哪个请求
}
④启动类添加注解,开启远程调用的功能
@EnableFeignClients(basePackages = "com.he.gulimall.member.feign") 扫描调用服务接口包,注入spring容器中
⑤当前微服务控制层调用方法
@RestController @RequestMapping("/member/member") public class MemberController { @Autowired CouponFeignService couponFeignService; @RequestMapping("/coupons") public R test(){ MemberEntity memberEntity = new MemberEntity(); memberEntity.setNickname("张三"); R memercoupons = couponFeignService.memercoupons(); return R.ok().put("member",memberEntity).put("coupons",memercoupons.get("coupons")); }
注意:SpringBoot版本过高会导致nacos中ribbon会造成loadbalanc包失效,需要更改common中pom的nacos依赖
<!-- Nacos作为服务注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
五、Gateway网关
Gateway执行流程
Gateway的客户端会向Spring Cloud Gateway发起请求,请求首先会被 HttpWebHandlerAdapter进行提取组装成网关的上下文,然后网关的上下文会传递到DispatcherHandler。
DispatcherHandler是所有请求的分发处理器,DispatcherHandler主要负责分发请求对应的处理器,比如将请求分发到对应RoutePredicateHandlerMapping(路由断言处理器映射器)。
RoutePredicateHandlerMapping路由断言处理映射器主要用于路由的查找,以及找到路由后返回对应的FilteringWebHandler。
FilteringWebHandler主要负责组装Filter链表并调用Filter执行一系列Filter处理,然后把请求转到后端对应的代理服务处理,处理完毕后,将Response返回到Gateway客户端。在Filter链中,通过虚线分割Filter的原因是,过滤器可以在转发请求之前处理或者接收到被代理服务的返回结果之后处理。所有的Pre类型的Filter执行完毕之后,才会转发请求到被代理的服务处理。被代理的服务把所有请求完毕之后,才会执行Post类型的过滤器。
实现原理图

①启动类加开启服务注册发现注解
@EnableDiscoveryClient
#SpringBoot继承mybatis,yml配置文件中没有配置数据库以及mybatis会报错,使用exclude参数自动加载 @SpringBootApplication(exclude= {DataSourceAutoConfiguration.class}) exclude ==>DataSourceAutoConfiguration会自动加载.可以排除此类的自动配置
②Gateway网关需引入的依赖 ==>同样需要使用nacos注册网关服务到注册中心
<!-- Nacos作为服务注册发现--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <exclusions> <exclusion> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-loadbalancer</artifactId> <version>2.2.2.RELEASE</version> </dependency> <!-- nacos作为配置中心来做配置管理--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
③将网关服务注册到注册中心 application.properties
spring.cloud.nacos.discovery.server-addr=192.168.254.128:8848 //Nacos中心地址 spring.application.name=gulimall-gateway //微服务名称 server.port=88 //端口号
bootstrap.properties配置文件
spring.application.name=gulimall-gateway spring.cloud.nacos.config.server-addr=192.168.254.128:8848 spring.cloud.nacos.config.namespace=89cd0a17-8da5-444f-b1d9-0ecffbb3cbd2
④路由以及断言规则application.yml配置
spring: cloud: gateway: routes: - id: test_route uri: https://www.baidu.com predicates: - Query=url,baidu - id: qq_route #断言成功访问路径 uri: https://www.qq.com #断言规则 predicates: - Query=url,qq

浙公网安备 33010602011771号