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();
}
- 開啟遠端調用功能,在調用方啟動類上加注解
- 測試
@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;
}
}