不迈出实践永远都不会知道结果,就像我如果不当面告诉你我喜欢你,我就不知道你不喜欢我一样,哈哈
到dockerhub上面下载docker,似乎要翻墙登录才能下载,请大家自备梯子。下载链接 https://hub.docker.com/editions/community/docker-ce-desktop-windows?tab=description
在日常的开发中,为了方便化,怎么快速怎么来,我们需要安装可视化工具,方便快速的进行镜像的下载,docker的管理。
我的电脑是win10家庭版,不能直接安装docker for windows,只能下载docker toolbox 然后进行安装。
http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/
下载完软件之后,安装就行了。出现了两个问题,第一是github的问题,由于docker去请求版本是请求的 api.github.com,会出现说镜像版本out of date。所以最好的办法就是去下载一个iso,https://github.com/boot2docker/boot2docker/releases, 放在C:\Users\junlin.docker\machine\cache,打开的时候断网就好了。直接断网如果觉得不优雅的话可以考虑用别的一大堆办法。
卸载自动安装的visual box,自己手动下载一个最新的,我的办法是点开那个自动安装的,会有安装更新的提示,然后直接下载那一个就行了,在安装新的之前,必要的措施是卸载掉那一个旧的。
出现大鲸鱼
下面说一下我的个人设计,项目无状态化,分布式存储,分布式缓存,分布式消息中间件。
在docker hub 里面搜索我需要的docker image,我分别需要
zookeeper-redis
zookeeper-hbase
和rabbitmq的容器
用来分别完成上面的工作。打开可视化工具进行搜索。打开 Kitematic (Alpha) ,然后我是家庭版的系统所以选择visualbox打开,输入dockerhub的账号密码就可以登录然后进行想要的image的搜索了。
用 Kitematic (Alpha) 打开的dockerhub的界面。
打开redis的镜像
这里我重新安装了docker for windows,以下内容适合于安装了docker for windows,如果是安装的docker toolbox的朋友,下面内容仅供参考。
redis主要是用于缓存各种临时数据,在分布式环境下,帮助服务无状态化
设置本机的10000端口与容器中的6379端口对应起来,这样就可以使用本机的10000号端口访问容器中的6379端口提供的redis服务了。完整的打开方式:
docker run --name redis-test -p 6379:6379 -d --restart=always redis:latest redis-server --appendonly yes --requirepass "your passwd"
在spring boot引入redis
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
然后在spring boot的配置文件中加上对redis的配置
#redis相关
spring.redis.host=127.0.0.1
spring.redis.port=10000
spring.redis.password=kexuejia123
spring.redis.database=0
创建一个redis数据库访问对象(DAO)
@Repository
public class RedisDao {
@Autowired
private StringRedisTemplate template;
public void setKey(String key,String value){
ValueOperations<String, String> ops = template.opsForValue();
ops.set(key,value);
}
public String getValue(String key){
ValueOperations<String, String> ops = this.template.opsForValue();
return ops.get(key);
}
}
修改原来的controller:
@RequestMapping(value = Path.LOGIN, method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> userLogin(@RequestParam("phone") final String phone,
@RequestParam("password") final String password,
@RequestParam("ip") final String ip){
Map<String, Object> ans = new HashMap<>();
// TODO: 2018/12/18 验证该phone是否已经登录
String token = redisService.getTokenFromRedis(phone);
if (token != ""){
ans.put("code", 300);
ans.put("info", "用户已经登录,请半小时后重新尝试");
return ans;
}
UserInfoDto dto = userInfoService.getUser(phone);
if (!dto.isRegister()){
dto.setPassword(password);
UserInfoDto dto1 = userInfoService.checkPassword(dto);
if (dto1.isVoladate()){
ans.put("code", 200);
ans.put("info", "成功");
String key = jwtService.getJwtsString(ip);
ans.put("key", key);
// TODO: 2018/12/18 将key放入redis
redisService.insertTokenTORedis(key,phone);
return ans;
}
}
ans.put("code", 400);
ans.put("info", "用户名或密码错误");
return ans;
}
然后编写RedisService
public interface RedisService {
boolean insertTokenTORedis(String key, String phone);
String getTokenFromRedis(String key);
}
//实现
@Service
public class RedisServiceImpl implements RedisService {
private RedisDao redisDao;
public RedisServiceImpl(RedisDao dao){
this.redisDao = dao;
}
@Override
public boolean insertTokenTORedis(String key, String phone) {
try {
redisDao.setKey(phone, key);
return true;
}catch (Exception e){
return false;
}
}
@Override
public String getTokenFromRedis(String key) {
String check = redisDao.getValue(key);
if (check == null){
return "";
}
return check;
}
}
用postman请求,查看效果
在docker中的redis
再次发起请求,返回结果
{
"code": 300,
"info": "用户已经登录,请半小时后重新尝试"
}