为什么要做tomcat集群
一个tomcat允许的用户最大连接数(游览器访问数量是有限的),大概在500~2000之内,要扩容的话就需要tomcat集群。
集群了之后通过nginx网关来访问tomcat
tomcat集群时候需要解决的问题
1、权限
判断用户是否有权限
2、分布式锁
在集群了之后,同步块、同步方法已经不能解决分布式的并发问题
3、性能
加锁之后会带来性能提升的问题
解决方案:
1、分布式锁:
通过redis的redissonClient添加分布式锁,在手动开启和结束锁。
配置文件:
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
redissonClient配置类(将其通过容器进行管理):
package com.config;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class Redislockconfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private String port;
@Value("${spring.redis.password}")
private String password;
@Bean
public RedissonClient redissonClient(){
String url="redis://"+host+":"+port;
Config config=new Config();
if (password!=null&&password.trim().length()>0){
config.useSingleServer().setAddress(url).setPassword(password);
}
else {
config.useSingleServer().setAddress(url);
}
return Redisson.create(config);
}
}
控制器;
package com.action;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class miaosha {
@Autowired
RedisTemplate redisTemplate;
@Autowired
RedissonClient redissonClient;
@RequestMapping("/miao")
public String miao(){
// redisTemplate.boundValueOps("ku").set(3);
RLock rLock=redissonClient.getLock("miaosha");
//加锁
rLock.lock();
Integer kuncun=(Integer)redisTemplate.boundValueOps("ku").get();
if (kuncun>0){
kuncun--;
redisTemplate.boundValueOps("ku").set(kuncun);
}
//解锁
rLock.unlock();
System.out.println(kuncun);
return "success";
}
}
注意点:
通过redis客户端进行添加数据,用Java工具客户端取的时候牵涉到序列化的问题。