微服务架构
微服务
强调是一个服务的大小,关注的是一个点
专注个体,每个个体完成一个具体的任务或功能
微服务架构
一种架构模式,单一应用划分一组小的服务,服务之间相互配合,为用户提供最终价值。
SpringCloud和SpringBoot区别?
-
SpringBoot专注于快速方便的开发单个个体服务;
-
SpringCloud关注全局微服务的协调和整理,它将SpringBoot开发的一个个单体微服务整合起来;
-
SpringBoot可以独立使用开发,但是SpringCloud离不开SpringBoot,属于依赖关系;
-
SpringBoot属于一个科室,SpringCloud是综合医院
Spring boot跨域
Controller 类 加 @CrossOrigin
mybatis-plus配置 mapper xml
mybatis-plus:
mapper-locations: classpath:mybatis/mapper/*.xml mybatis/mapper
前端数组对象传递
使用axios发出跨域请求,跟的参数,不允许是数组的格式
xxx?ids=[7,9]!也就是
不能使用 paramrs: JSON.stringfy(array)
改为xxx?0=7&1=9
解决方案
springmvc /springboot 接收List 入参_xu990128638的专栏-CSDN博客_springboot接收list参数
qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })
// 'a[0]=b&a[1]=c'
qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })
// 'a[]=b&a[]=c'
qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })
// 'a=b&a=c'
方案1
npm install qs
import qs from 'qs'
paramrs: qs.stringfy(array)
// 请求 url,get请求,参数projectIds和 controll方法对应
http://192.168.0.182:8088/Artilce/xxx?projectIds=1,2,3
// controller方法
@RequestMapping("/analysis")
public JsonResult queryList ( @RequestParam("projectIds") List<Long> projectIds) {
...
}
方案二
post方式
// 发出post请求,数据格式 json
{
"projectIds":[2,3]
}
// controller
@RequestMapping("/analysis")
public JsonResult queryList (@RequestBody ReqVo req) {
....
}
@Data
Class ReqVo {
private List<Integer> projectIds;
}
Redis缓存引入
依赖引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</art factId>
</dependency>
配置redis
server:
port: 8002
spring:
application:
name: edu-course-boot
redis:
host: 192.168.204.141
port: 6379
redis放在service层
- redis查询数据
- redis没有,去mysql查询
- 将查询结果缓存在redis中
@Service
public class CourseServiceImpl implements CourseService {
@Autowired
private CourseMapper courseMapper;
@Autowired
private RedisTemplate<Object,Object> redisTemplate;
@Override public List<Course> getAllCourse() {
//将redis内存中的序列化的集合名称用String重新命名(增加可读性)
RedisSerializer rs = new StringRedisSerializer();
redisTemplate.setKeySerializer(rs);
System.out.println("查询redis");
List<Course> list =
(List<Course>)redisTemplate.opsForValue().get("allCourses"); if(list == null){
//去数据库
System.out.println("====MySql数据库====");
list = courseMapper.getAllCourse();
// 把从数据库查询的集合放在redis内存中(key,value,过期秒数,秒的工具类)
redisTemplate.opsForValue().set("allCourses", list,10, TimeUnit.SECONDS);
}
return list;
}
高并发下的双层检测锁
@Override
public List<Course> getAllCourse() {
RedisSerializer rs = new StringRedisSerializer(); redisTemplate.setKeySerializer(rs);
System.out.println("查询redis");
List<Course> list =(List<Course>)redisTemplate.opsForValue().get("allCourses");
// 第一次检测
if(list == null){
//排队,让第一个人进,走一遍流程(后面的人就会走缓存了)
synchronized (this){
list = (List<Course>)redisTemplate.opsForValue().get("allCourses");
// 第二次检测
if(list == null){
//去数据库
System.out.println("====MySql数据库====");
list = courseMapper.getAllCourse();
// 把从数据库查询的集合放在redis内存中
redisTemplate.opsForValue().set("allCourses", list,10,TimeUnit.SECONDS);
}
}
}
return list;
}
保证redis中数据最新
- 如果课程中内容发生变化,更新 ,修改内容的时候,会先将redis中的相关集合删除。
- 然后将最新的数据保存到数据库 而查询数据时,因为redis中的数据已经删除了,所以会第一时间去数据库查询,保证数据是最新 的。
三步解决 IDEA ‘Error:java: 无效的源发行版: 11’
三步解决 IDEA ‘Error:java: 无效的源发行版: 11’_Java持续实践-CSDN博客
IDEA集成Docker部署微服务
docker 安装配置
yum -y install docker
systemctl start docker
vim /lib/systemd/system/docker.service
# 修改
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
systemctl daemon-reload
#重启
service docker restart
# 查看端口是否开启
netstat -nlpt
# 验证端口是否生效
curl http://192.168.204.141:2375/info
idea安装docker插件
Tcp socket :tcp://ip:2375
setting —>docker Registry address :https://owi3yzzk.mirror.aliyuncs.com
连接服务器
docker mavne插件
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<!--镜像名称 laosun/test-docker-demo-->
<imageName>laosun/${project.artifactId}</imageName>
<!--标签版本-->
<imageTags>
<imageTag>latest</imageTag>
</imageTags>
<!--基础镜像,相当于Dockerfile里的from-->
<baseImage>openjdk:11.0.9.1-jdk-buster</baseImage>
<!--标签版本-->
<maintainer>laosun angiersun@lagou.com</maintainer>
<!--入口点,project.build.finalName就是project标签下的build标签下的filename标签内容,test-docker-demo-->
<!--相当于启动容器后,会自动执行java -jar/test-docker-demo.jar-->
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<!--docker地址-->
<dockerHost>http://xxx:2375</dockerHost>
<!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
<resources>
<resource>
<targetPath>/</targetPath>
<!--复制的根目录,target-->
<directory>${project.build.directory}</directory>
<!--把哪个文件上传到docker,相当于Dockerfile里的add test-docker-demo.jar /-->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
对项目进行打包并构建镜像到docker上
mvn clean package docker:build
网友评论