分布式组件-SpringCloud Alibaba
文章目录
20.简介
SpringCloudAlibaba的优势:
阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源出来大家用成套的产品搭配完善的可视化界面给开发运维带来了极大的便利,搭建简单,学习曲线低。
SpringCloud Alibaba-Nacos:注册中心(服务发现/注册)
SpringCloud Alibaba-Nacos:配置中心(动态配置管理)
SpringCloud-Ribbon:负载均衡
SpringCloud-Feign:声明式HTTP客户端(调用远程服务)
SpringCloud Alibaba-Sentinel:服务容错(限流、降级、熔断)
SpringCloud-Gateway:API网关
SpringCloud-Sleuth:调用链监控
SpringCloud Alibaba-Seata:原 Fescar,即分布式事务
gulimall-common的pom.xml
<dependencyManagement>
<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>
21.Nacos注册中心
第一步:gulimall-common的pom.xml加入依赖
<!-- 服务注册/发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
第二步:下载nacos
地址:github.com/alibaba/nacos/releases
版本:1.1.3
第三步:修改你要将那个服务注册上去的application.yml
spring:
application:
name: gulimall-coupon
cloud:
nacos:
discovery:
server-addr: localhost:8848
第四步:在启动类上标注注解
@EnableDiscoveryClient
第五步:访问nacos
路径:127.0.0.1:8848/nacos/#/login
22.OpenFeign远程调用
需求:gulimall-member会员服务调用gulimall-coupon优惠券服务
1.在gulimall-common pom.xml文件加入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.//gulimall-coupon
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
@RequestMapping("/member/list")
public R membercoupons(){
CouponEntity couponEntity = new CouponEntity();
couponEntity.setCouponName("满100减10");
return R.ok().put("coupon",Arrays.asList(couponEntity));
}
}
3.//gulimall-member
@FeignClient("gulimall-coupon")
public interface CouponFeignService {
@RequestMapping("/coupon/coupon/member/list")
public R membercoupons();
}
4.//开启远程调用功能:EnableFeignClients
@EnableRedisHttpSession
@EnableFeignClients(basePackages = "com.xunqi.gulimall.member.feign")
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallMemberApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallMemberApplication.class, args);
}
}
5.调用
@RestController
@RequestMapping("member/member")
public class MemberController {
@Autowired
private MemberService memberService;
@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"));
}
}
23.配置中心-简单实例
1.在gulimall-common pom.xml文件加入
<!-- 配置中心来做配置管理-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.在gulimall-coupon创建bootstrap.yml
spring:
application:
name: gulimall-coupon
cloud:
nacos:
config:
server-addr: localhost:8848
3.在application.properties
//此方法有了注册中心后,不再使用
application.properties
coupon.user.name=zhangsan
coupon.user.age=18
24.配置中心-命名空间
了解几个概念
1.命名空间:配置隔离;默认是public
2.配置集:所有配置的集合
3.配置集id:类似于文件名
4.配置分组
刚刚,我们创建的gulimall-coupon.properties是在public的命名空间,里面的内容是name=zhangsan,age=24
现在,我们在prop下也创建一个gulimall-coupon.properties
以上,演示完了命名空间,里面命名空间做环境的隔离;其实是通过dev、prop、public(开发、生成、默认)等角度来命名
现在,我们要给每一个微服务创建自己的命名空间。
配置分组的概念
最终版使用:每一个微服务创建自己的服务命名空间;使用配置分组来确定是dev、prop、test。
25.配置中心-加载多配置集
随着我们服务越来越多,一个yml文件里面需要配置mysql、redis、server.port等等的配置。现在,我们要将他们抽取出来。
拆分后
26.Gateway网关核心
27.Gateway创建测试网关
1.创建网关服务gulimall-gateway
2.application.properties
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=gulimall-gateway
server.port=88
3.bootstrap.yml
spring:
application:
name: gulimall-coupon
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
# file-extension: yml
namespace: ea65d118-135f-4928-bbc6-c8ec85b3fd78
4.application.yml
spring:
cloud:
sentinel:
transport:
#配置sentinel dashboard地址
dashboard: localhost:8080
gateway:
routes:
# - id: test_route
# uri: https://www.baidu.com
# predicates:
# - Query=uri,baidu
#
# - id: qq_route
# uri: https://www.qq.com
# predicates:
# - Query=uri,qq