天天看点

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;
    }
}