黑马头条学习心得

136 阅读3分钟

垂直拆分表

规则:

  • 把不常用的字段单独拆分出来
  • 把text,blob等大字段单独拆分成一张表里
  • 经常组合查询的字段单独放在一张表里

优势:

减少IO争抢,减少锁表的几率,以及充分发挥高频数据的操作效率。

Minio对象存储使用

部署

通过docker部署在云服务器上,步骤:

1.拉取镜像

docker pull minio/minio

2.运行容器

docker run \
-p 19000:9000 \
-p 9090:9090 \
--net=host \ 
--name minio \
-d --restart=always \
-e "MINIO_ROOT_USER=root" \
-e "MINIO_ROOT_PASSWORD=admin123" \
-v /opt/minio/data:/data \
-v /opt/minio/config:/root/.minio \
minio/minio server \
/data --console-address ":9090" -address ":19000"

注意:如果要通过程序进行上传和下载,可通过如下 docker log containerID查看容器的运行日志,其中API的地址是程序连接需要的网址。文件的直接访问也是通过该网址

3.访问minio的控制台

可查看docker log containerID查看访问地址,或者直接访问所映射的端口号

上传方法样例

 public String uploadImgFile(String prefix, String filename,InputStream inputStream) {
        String filePath = builderFilePath(prefix, filename);
        try {
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .object(filePath)
                    .contentType("image/jpg")
                    .bucket(minIOConfigProperties.getBucket()).stream(inputStream,inputStream.available(),-1)
                    .build();
            //将文件上传至minio
            minioClient.putObject(putObjectArgs);
            StringBuilder urlPath = new StringBuilder(minIOConfigProperties.getReadPath());
            urlPath.append(separator+minIOConfigProperties.getBucket());
            urlPath.append(separator);
            urlPath.append(filePath);
            return urlPath.toString();
        }catch (Exception ex){
            log.error("minio put file error.",ex);
            throw new RuntimeException("上传文件失败");
        }
    }

重新构建request

再原有的request对象上重新构建一个新的request对象,新的对象继承原有对象的属性,且在构建过程中可以新增新的请求头或查询参数等!

{
		ServerHttpRequest userServletRequest = request.mutate().headers(httpHeaders -> {
            httpHeaders.add("userId", userId);
        }).build();
        ServerWebExchange buildExchange = exchange.mutate().request(userServletRequest).build();
        //6.放行
        return chain.filter(buildExchange);
}

aliyun的内容审核

文本审核增强版_内容安全(Content Moderation)-阿里云帮助中心 (aliyun.com)

配置文件

配置文件的access-key和secret到个人账户控制台获取

# 配置aliyunSDK
aliyun:
  access-key-id: XXX
  secret: xxxxx
  scenes: terrorism

示例代码

文本审核接入指南_内容安全(Content Moderation)-阿里云帮助中心 (aliyun.com)

图片审核增强版SDK_内容安全(Content Moderation)-阿里云帮助中心 (aliyun.com)

Feign远程调用服务

通过feign实现不同微服务之间的调用,下面是feign的基本使用

引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

编写调用的接口

通过@FeignClient标注该接口是微服务之间调用的接口,value指定的是调用具体的微服务名称,接口内的方法,是指定请求的url和请求方式等,

package com.heima.apis.article;

import com.heima.model.article.dtos.ArticleDto;
import com.heima.model.common.dtos.ResponseResult;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

import java.io.IOException;


@FeignClient(value = "leadnews-article")
public interface IArticleClient {

    @PostMapping("/api/v1/article/save")
    public ResponseResult saveArticle(@RequestBody ArticleDto dto) ;
}

实现定义的微服务接口

定义一个控制器实现定义的Feign接口

package com.heima.article.feign;

import com.heima.apis.article.IArticleClient;
import com.heima.article.service.ApArticleService;
import com.heima.model.article.dtos.ArticleDto;
import com.heima.model.common.dtos.ResponseResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;

@RestController
public class ArticleClient implements IArticleClient {

    @Autowired
    private ApArticleService apArticleService;

    @Override
    @PostMapping("/api/v1/article/save")
    public ResponseResult saveArticle(@RequestBody ArticleDto dto) {
        return apArticleService.saveArticle(dto);
    }

}

开启Feign远程调用

//在启动类上添加,并指定feign所需要扫描的根路径(包路径)
@EnableFeignClients(basePackages = "com.heima.apis")

熔断降级处理

feign:
  # 开启feign对hystrix熔断降级的支持
  hystrix:
    enabled: true
  # 修改调用超时时间
  client:
    config:
      default:
      	# 连接超时时间
        connectTimeout: 2000
        # 读取超时时间
        readTimeout: 2000