垂直拆分表
规则:
- 把不常用的字段单独拆分出来
- 把text,blob等大字段单独拆分成一张表里
- 经常组合查询的字段单独放在一张表里
优势:
减少IO争抢,减少锁表的几率,以及充分发挥高频数据的操作效率。
Minio对象存储使用
部署
通过docker部署在云服务器上,步骤:
1.拉取镜像
docker pull minio/minio2.运行容器
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的内容审核
配置文件
配置文件的access-key和secret到个人账户控制台获取
# 配置aliyunSDK
aliyun:
access-key-id: XXX
secret: xxxxx
scenes: terrorism
示例代码
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