SpringCloud Alibaba
1.版本问题
版本对应
项目中使用的版本
导入的SpringCloud Alibaba依赖
<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>
2.Nacos注册中心
官方文档:https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme-zh.md
1.下载并启动Nacos-server
-
下载地址:https://github.com/alibaba/nacos/releases?after=1.2.0-beta.0
-
下载1.1.3 版本的,下载其他版本启动时会报错,需要修改配置文件。
-
找到bin/startup.bat ,双击启动即可。
-
访问 http://localhost:8848/nacos/
-
账号和密码默认为nacos
2.将微服务注册到nacos
- 引入nacos依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 在application.yml 配置注册中心的地址
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # 注册中心的地址
compatibility-verifier:
enabled: false # 解决启动时的版本冲突问题
application:
name: gulimall-member # 设置微服务的名字,否则服务不会被注册进去
- 使用@EnableDiscoveryClient 开启服务注册发现功能
@SpringBootApplication
@EnableDiscoveryClient
public class GulimallMemberApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallMemberApplication.class, args);
}
}
- 启动服务,观察nacos服务列表是否已经注册上服务
3.Feign远程调用
- 在调用的一方导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 编写一个接口,告诉SpringCloud这个接口需要调用远程服务。
- 声明接口的方法都是调用哪个远程服务的哪一个请求。
@FeignClient("gulimall-coupon") //调用的服务
public interface CouponFeignService {
@RequestMapping("/coupon/coupon/member/list") //调用的方法
public R memberCoupons();
}
- 开启远程调用功能,在调用方启动类上加注解
@EnableFeignClients(basePackages = "com.dz.member.feign")
- 测试
@Autowired
CouponFeignService couponFeignService;
@RequestMapping("/coupons")
public R test(){
MemberEntity memberEntity=new MemberEntity();
memberEntity.setNickname("zhangsan");
R memberCoupons = couponFeignService.memberCoupons();
return memberCoupons.put("member",memberEntity).put("coupons",memberCoupons.get("coupons"));
}
4.Nacos配置中心
- 官方地址:https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme-zh.md
- 如果配置中心和当前应用的配置文件都配置了相同的项,优先使用配置中心的配置
1.使用流程
- 导入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- 在应用的 /src/main/resources/bootstrap.properties 配置文件中配置 Nacos Config 元数据
#当前应用的名字
spring.application.name=gulimall-coupon
#配置中心的服务器地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
- 给配置中心添加一个数据集(Data ID)。 默认规则: 应用名.properties
- 动态获取配置
//在类上加 动态获取并刷新配置
@RefreshScope
//获取配置文件中的值
@Value("${coupon.user.name}")
private String name;
2.细节
命名空间(配置隔离)
-
作用:开发,测试,生产,利用命名空间来做环境隔离
-
添加命名空间
- 需要使用哪个命名空间,需要在bootstarp.properties中进行配置。
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=6fc01a0b-d789-4cc7-8f9d-00889ed34cc3
配置集
所有配置的集合
配置集id
Data ID: gulimall-coupon.properties
配置分组
- 默认为DEFAULT_GROUP
- 可以在新建配置时修改分组
- 在配置文件中修改分组
spring.cloud.nacos.config.group=1111
总结
每个微服务创建的自己的命名空间,使用配置分组来区分环境,如dev,test,prod
加载多配置集
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 可以选择对应的命名空间 # 写上对应环境的命名空间ID
spring.cloud.nacos.config.namespace=b176a68a-6800-4648-833b-be10be8bab00
# 更改配置分组
spring.cloud.nacos.config.group=dev
#新版本不建议用下面的了
#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
spring.cloud.nacos.config.extension-configs[0].data-id=datasource.yml
spring.cloud.nacos.config.extension-configs[0].group=dev
spring.cloud.nacos.config.extension-configs[0].refresh=true
spring.cloud.nacos.config.extension-configs[1].data-id=mybatis.yml
spring.cloud.nacos.config.extension-configs[1].group=dev
spring.cloud.nacos.config.extension-configs[1].refresh=true
spring.cloud.nacos.config.extension-configs[2].data-id=other.yml
spring.cloud.nacos.config.extension-configs[2].group=dev
spring.cloud.nacos.config.extension-configs[2].refresh=true
5.Gateway
网关是请求流量的入口,常用功能包括路由转发,权限校验,限流控制等。springcloud gateway
取代了zuul
网关
工作流程
客户端发送请求,Mapping判断能否处理请求,如果能,发送给Handler进行处理。
6.文件存储
1.单体应用和集群部署的区别
2.在阿里云开通对象存储(OSS)服务
3.上传方式
4.在项目中使用OSS
阿里云教程:https://help.aliyun.com/document_detail/32009.html?spm=a2c4g.11186623.6.924.1f6846a1hIU4Kc
springcloud-alibaba oss教程: https://github.com/alibaba/aliyun-spring-boot/tree/master/aliyun-spring-boot-samples/aliyun-oss-spring-boot-sample
- 导入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alicloud-oss</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
- 之后在application.yml中进行以下配置
- 里面的值 springcloud-alibaba oss 教程里面有详细解释。
- 之后想使用话,直接注入即可
@Autowired
private OSSClient ossClient;
- OSSController
@RestController
public class Osscontroller {
@Autowired
OSS ossClient;
@Value("${spring.cloud.alicloud.oss.endpoint}")
private String endpoint;
@Value("${spring.cloud.alicloud.access-key}")
private String accessId;
@RequestMapping("/oss/policy")
public Map<String,String> policy(){
String bucket = "gulimall-dzsq"; // 请填写您的 bucketname 。
String host = "https://" + bucket + "." + endpoint; // host的格式为 bucketname.endpoint
// callbackUrl为 上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。
// String callbackUrl = "http://88.88.88.88:8888";
String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
String dir = format+"/"; // 用户上传文件时指定的前缀。
// 创建OSSClient实例。
Map<String, String> respMap =null;
try {
long expireTime = 30;
long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
Date expiration = new Date(expireEndTime);
// PostObject请求最大可支持的文件大小为5 GB,即CONTENT_LENGTH_RANGE为5*1024*1024*1024。
PolicyConditions policyConds = new PolicyConditions();
policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);
String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
byte[] binaryData = postPolicy.getBytes("utf-8");
String encodedPolicy = BinaryUtil.toBase64String(binaryData);
String postSignature = ossClient.calculatePostSignature(postPolicy);
respMap = new LinkedHashMap<String, String>();
respMap.put("accessid", accessId);
respMap.put("policy", encodedPolicy);
respMap.put("signature", postSignature);
respMap.put("dir", dir);
respMap.put("host", host);
respMap.put("expire", String.valueOf(expireEndTime / 1000));
// respMap.put("expire", formatISO8601Date(expiration));
} catch (Exception e) {
// Assert.fail(e.getMessage());
System.out.println(e.getMessage());
} finally {
ossClient.shutdown();
}
return respMap;
}
}