谷粒商城学习笔记,第三天:分布式组件
一、分布式选型
插件 | 作用 |
---|---|
nacos | 注册中心 + 配置中心 |
Ribbon | 负载均衡 |
openFeign | 远程调用 |
gateway | API网关 |
sentinel | 服务容错(降级、限流、熔断) |
sleuth | 调用链监控 |
seata | 分布式事务解决方案 |
我们在使用spring-cloud-alibaba之前,应先在父工程中引用(确定版本)
<dependencyManagement>
<!--spring-cloud-alibaba-->
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
二、注册中心Nacos
1、下载Nacos-server
2、客户端:引用Nacos
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3、客户端:配置文件制定Nacos Server地址
##Nacos server
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
4、客户端:打开服务注册和发现
##在主启动类上 增加
@EnableDiscoveryClient
5、客户端:设置服务端口和服务名称
##服务名称
spring:
application:
name: gulimall-coupon
##服务端口
server:
port: 7000
注意:
nacos1.3.2 Windows版本默认使用cluster集群启动,我们需要修改下配置文件
application.properties
##打开一下配置
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://xxxxxxxxxxxx:3307/gulimall_nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=admin123
cluster.conf.example修改成cluster.conf
#nacos本机
192.168.0.139:8848
三、远程调用OpenFeign
1、服务端和客户端 :引入OpenFeign
<!--openFeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、服务端和客户端:指明注册中心服务路径
##Nacos server
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
3、服务端:提供Feign接口
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
@Autowired
private CouponService couponService;
@GetMapping("/couponListByMemberId")
public R couponListByMemberId(){
CouponEntity entity = new CouponEntity();
entity.setId(1l);
entity.setCouponName("满100减30");
return R.ok().put("couponList",Arrays.asList(entity));
}
}
4、客户端:Feign接口
@FeignClient("gulimall-coupon")
public interface CouponFeign {
@GetMapping("/coupon/coupon/couponListByMemberId")
public R couponListByMemberId();
}
5、客户端:开启FeignClient服务
//打开Feignclient:并指定feign的扫描包
@EnableFeignClients(basePackages = "com.lee.gulimall.member.feign")
6、客户端调用
@RestController
@RequestMapping("member/member")
public class MemberController {
@Autowired
private CouponFeign couponFeign;
@GetMapping("/test/{memberId}")
public R test(@PathVariable("memberId") Long memberId){
R r = couponFeign.couponListByMemberId();
return R.ok().put("couponList",r.get("couponList")).put("memberId",memberId);
}
}
四、配置中心Nacos
1、引用
<!--spring-cloud-alibaba-nacos config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2、创建bootstrap.yml
指明:应用名称 和 配置中心地址
spring:
application:
name: gulimall-coupon
cloud:
nacos:
config:
##配置中心地址
server-addr: 127.0.0.1:8848
##名称后缀
file-extension: yml
profiles:
active: dev
Data ID名称规则:
${prefix}-${spring.profile.active}.${file-extentsion}
prefix:
默认值为:spring.application.name,也可以通过spring.cloud.nacos.config.prefix来配置
spring.profile.active:
spring.profile.active不存在时,对应的连接符也将不存在。
对应的data id拼接格式为:
${prefix}.${file-extension}
file-extension:
为配置内容的数据格式,可以通过spring.cloud.nacos.config.file-extension来配置。
目前只支持properties和yaml类型
3、在nacos配置中心创建对应文件
## DATA ID : gulimall-coupon-dev.yml
## CONTENT
coupon:
user:
name: zhangsan
age: 20
4、打开动态刷新+测试
controller文件中
//@RefreshScope打开动态刷新
@RefreshScope
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
@Value("${coupon.user.name}")
private String name;
@Value("${coupon.user.age}")
private int age;
@GetMapping("/dynamicConfig")
public R dynamicConfig(){
return R.ok().put("name",name).put("age",age);
}
}
5、其他
1>、namespace:配置文件的环境隔离
【可以根据 DEV TEST PROD 开发阶段命名,也可以根据COUPON MEMBER ORDER 服务类型命名】
##第一步:在nacos中创建namespace
##第二步:在bootstrap.yml中指明要使用的命名空间
spring:
application:
name: gulimall-coupon
cloud:
nacos:
config:
##配置中心地址
server-addr: 127.0.0.1:8848
##名称后缀
file-extension: yml
##命名空间
namespace: 5fa23e47-f4ec-4874-8e5c-ed9b4657cad8
profiles:
active: dev
##第三部:在nacos的对应的namespace中创建对应的 配置文件
2>、group:配置组
##第一步:在nacos中 创建 配置文件的时候 指明 group
##第二步:在bootstrap.yml中指明要使用的group
spring:
application:
name: gulimall-coupon
cloud:
nacos:
config:
##配置中心地址
server-addr: 127.0.0.1:8848
##名称后缀
file-extension: yml
##命名空间
namespace: 5fa23e47-f4ec-4874-8e5c-ed9b4657cad8
##分组
group: coupon
profiles:
active: dev
注意:可以根据 业务类型 分namespace 根据 开发阶段 分 group
3>、加载多配置集
根据属性配置:DataSource redis mybatis 等
##第一步:配置
spring:
cloud:
nacos:
config:
extension-configs[0]:
data-id: datasource.yaml
group: dev # 默认为DEFAULT_GROUP
refresh: true # 是否动态刷新,默认为false
extension-configs[1]:
data-id: mybatis.yaml
group: dev
refresh: true
extension-configs[2]:
data-id: redis.yaml
group: dev
refresh: true
##第二步:在nacos中创建对应的文件 datasource.yaml mybatis.yaml redis.yaml
五、API网关Gateway
路由:Route 、 断言:Predicate 、 过滤器:Filter
1、引入
<!--spring-cloud-gateway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2、配置文件
server:
port: 88
spring:
application:
name: gulimall-gateway
cloud:
gateway:
routes:
- id: coupon_routh #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:7000 #匹配后提供服务的路由地址
predicates:
- Path=/coupon/** #断言,路径相匹配的进行路由
- id: member_routh
uri: http://localhost:8000
predicates:
- Path=/member/** #断言,路径相匹配的进行路由
3、指明注册中心路径
spring:
cloud:
nacos:
server-addr: 127.0.0.1:8848
4、主启动类开启服务发现
##主启动类添加
@EnableDiscoveryClient
5、测试
访问:http://localhost:88/coupon/coupon/couponListByMemberId