天天看點

SpringCloud AlibabaSpringCloud Alibaba

SpringCloud Alibaba

1.版本問題

版本對應
SpringCloud AlibabaSpringCloud Alibaba
項目中使用的版本
SpringCloud AlibabaSpringCloud Alibaba

導入的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

  1. 引入nacos依賴
<dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
           
  1. 在application.yml 配置注冊中心的位址
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848  # 注冊中心的位址
    compatibility-verifier:
      enabled: false          # 解決啟動時的版本沖突問題
  application:
    name: gulimall-member    # 設定微服務的名字,否則服務不會被注冊進去
           
  1. 使用@EnableDiscoveryClient 開啟服務注冊發現功能
@SpringBootApplication
@EnableDiscoveryClient
public class GulimallMemberApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallMemberApplication.class, args);
    }
}
           
  1. 啟動服務,觀察nacos服務清單是否已經注冊上服務
SpringCloud AlibabaSpringCloud Alibaba

3.Feign遠端調用

  1. 在調用的一方導入依賴
<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
           
  1. 編寫一個接口,告訴SpringCloud這個接口需要調用遠端服務。
  • 聲明接口的方法都是調用哪個遠端服務的哪一個請求。
@FeignClient("gulimall-coupon")   //調用的服務
public interface CouponFeignService {
    @RequestMapping("/coupon/coupon/member/list")   //調用的方法
    public R memberCoupons();
}
           
  1. 開啟遠端調用功能,在調用方啟動類上加注解
  1. 測試
@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.使用流程

  1. 導入依賴
<dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 </dependency>
           
  1. 在應用的 /src/main/resources/bootstrap.properties 配置檔案中配置 Nacos Config 中繼資料
#目前應用的名字
spring.application.name=gulimall-coupon
#配置中心的伺服器位址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
           
  1. 給配置中心添加一個資料集(Data ID)。 預設規則: 應用名.properties
SpringCloud AlibabaSpringCloud Alibaba
  1. 動态擷取配置
//在類上加   動态擷取并重新整理配置
@RefreshScope   
//擷取配置檔案中的值
@Value("${coupon.user.name}")
private String name;
           

2.細節

命名空間(配置隔離)
  • 作用:開發,測試,生産,利用命名空間來做環境隔離
  • 添加命名空間
SpringCloud AlibabaSpringCloud Alibaba
SpringCloud AlibabaSpringCloud Alibaba
  • 需要使用哪個命名空間,需要在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   
           
SpringCloud AlibabaSpringCloud Alibaba
配置集

所有配置的集合

配置集id

Data ID: gulimall-coupon.properties

配置分組
  • 預設為DEFAULT_GROUP
  • 可以在建立配置時修改分組
SpringCloud AlibabaSpringCloud Alibaba
  • 在配置檔案中修改分組
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進行處理。

SpringCloud AlibabaSpringCloud Alibaba

6.檔案存儲

1.單體應用和叢集部署的差別

SpringCloud AlibabaSpringCloud Alibaba

2.在阿裡雲開通對象存儲(OSS)服務

  1. SpringCloud AlibabaSpringCloud Alibaba
SpringCloud AlibabaSpringCloud Alibaba
SpringCloud AlibabaSpringCloud Alibaba

3.上傳方式

SpringCloud AlibabaSpringCloud Alibaba
SpringCloud AlibabaSpringCloud Alibaba

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

  1. 導入依賴
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alicloud-oss</artifactId>
    <version>2.2.0.RELEASE</version>
</dependency>
           
  1. 之後在application.yml中進行以下配置
  • 裡面的值 springcloud-alibaba oss 教程裡面有詳細解釋。
SpringCloud AlibabaSpringCloud Alibaba
  1. 之後想使用話,直接注入即可
@Autowired
private OSSClient ossClient;
           
  1. 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;
    }
}