Przeglądaj źródła

添加id生成器,redis,messageController

dev
yeqd 4 lat temu
rodzic
commit
42c9261a99
10 zmienionych plików z 474 dodań i 16 usunięć
  1. +7
    -0
      user-client/src/main/java/com/hp/user/client/service/AccountService.java
  2. +22
    -0
      user-client/src/main/java/com/hp/user/client/service/MessageService.java
  3. +6
    -0
      user-service/pom.xml
  4. +4
    -1
      user-service/src/main/java/com/hp/user/service/UserServiceApplaction.java
  5. +20
    -15
      user-service/src/main/java/com/hp/user/service/controller/AuthenticationController.java
  6. +32
    -0
      user-service/src/main/java/com/hp/user/service/controller/MessageController.java
  7. +21
    -0
      user-service/src/main/java/com/hp/user/service/impl/AccountServiceImpl.java
  8. +28
    -0
      user-service/src/main/java/com/hp/user/service/impl/MessageServiceImpl.java
  9. +178
    -0
      user-service/src/main/java/com/hp/user/service/redis/RedisOperation.java
  10. +156
    -0
      user-service/src/main/java/com/hp/user/util/IdWorker.java

+ 7
- 0
user-client/src/main/java/com/hp/user/client/service/AccountService.java Wyświetl plik

@@ -9,5 +9,12 @@ package com.hp.user.client.service;
* @since 2020-11-20 * @since 2020-11-20
*/ */
public interface AccountService { public interface AccountService {
/**
* 登陆
* @param phone 手机号
* @param verificationCode 验证码
*/
public void login(String phone,String verificationCode);
} }

+ 22
- 0
user-client/src/main/java/com/hp/user/client/service/MessageService.java Wyświetl plik

@@ -0,0 +1,22 @@
package com.hp.user.client.service;

/**
* 信息服务
* @author yeqid
*
*/
public interface MessageService {
/**
* 发送验证码
* @param phone 手机号
*/
public void sendVerificationCode(String phone);
/**
* 获取验证码
* @param phone 手机号
* @return 返回验证码
*/
public String getVerificationCode(String phone);
}

+ 6
- 0
user-service/pom.xml Wyświetl plik

@@ -157,6 +157,12 @@
<artifactId>jackson-databind</artifactId> <artifactId>jackson-databind</artifactId>
<version>2.9.5</version> <version>2.9.5</version>
</dependency> </dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>








+ 4
- 1
user-service/src/main/java/com/hp/user/service/UserServiceApplaction.java Wyświetl plik

@@ -7,6 +7,7 @@ import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan;


import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource; import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
import com.hp.user.service.redis.RedisOperation;


/** /**
* 用户服务启动类 * 用户服务启动类
@@ -18,7 +19,7 @@ import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
@SpringBootApplication @SpringBootApplication
@NacosPropertySource(dataId = "userdatasource", autoRefreshed = true) @NacosPropertySource(dataId = "userdatasource", autoRefreshed = true)
//不能加compentscan,加了 //不能加compentscan,加了
@ComponentScan("com.hp.user.service.dao")//这个地方不能写错,写错的话会出现2个问题,如果写的路径扫描不到swaggerconfig那么页面会报错
//@ComponentScan("com.hp.user.service.dao")//这个地方不能写错,写错的话会出现2个问题,如果写的路径扫描不到swaggerconfig那么页面会报错
//(Unable to infer base url. This is common when using dynamic servlet registration or when the API is behind an API Gateway. //(Unable to infer base url. This is common when using dynamic servlet registration or when the API is behind an API Gateway.
//The base url is the root of where all the swagger resources are served. For e.g. if the api is available at http://example.org/api/v2/api-docs then the base url is http://example.org/api/. Please enter the location manually: ), //The base url is the root of where all the swagger resources are served. For e.g. if the api is available at http://example.org/api/v2/api-docs then the base url is http://example.org/api/. Please enter the location manually: ),
//如果写的路径扫描不到controller那么页面不会有接口信息 //如果写的路径扫描不到controller那么页面不会有接口信息
@@ -26,5 +27,7 @@ import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
public class UserServiceApplaction { public class UserServiceApplaction {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(UserServiceApplaction.class, args); SpringApplication.run(UserServiceApplaction.class, args);
System.out.println(RedisOperation.getRedis().get("tst"));
RedisOperation.getRedis().close();
} }
} }

+ 20
- 15
user-service/src/main/java/com/hp/user/service/controller/AuthenticationController.java Wyświetl plik

@@ -1,28 +1,39 @@
package com.hp.user.service.controller; package com.hp.user.service.controller;




import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;


import com.hp.user.client.service.AccountService;

import io.swagger.annotations.Api;

@RestController @RestController
@RequestMapping("/authentication") @RequestMapping("/authentication")
@Api(value="身份认证")
public class AuthenticationController { public class AuthenticationController {
@Autowired
private AccountService accountService;
/** /**
* 登录 * 登录
* @param account 账号
* @param password 密码
* @param phone 账号
* @param verificationCode 验证
*/ */
@RequestMapping("/login") @RequestMapping("/login")
public void login(String account,String password){
public void login(String phone,String verificationCode) {
accountService.login(phone, verificationCode);
} }


/** /**
* 登出 * 登出
*/ */
@RequestMapping("/loginOut") @RequestMapping("/loginOut")
public void loginOut(){
public void loginOut() {
} }


/** /**
@@ -30,16 +41,10 @@ public class AuthenticationController {
* 需要用户信息 * 需要用户信息
*/ */
@RequestMapping("/register") @RequestMapping("/register")
public void register(){
public void register() {


} }


/**
* 找回密码
* @param account 账号
*/
@RequestMapping("findPassword")
public void findPassword(String account){

}
} }

+ 32
- 0
user-service/src/main/java/com/hp/user/service/controller/MessageController.java Wyświetl plik

@@ -0,0 +1,32 @@
package com.hp.user.service.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.hp.user.client.service.MessageService;

import io.swagger.annotations.Api;

/**
* 短信
* @author yeqid
*
*/
@Api(value="短信")
@RestController
@RequestMapping("/area")
public class MessageController {
@Autowired
private MessageService messageService;
/**
* 发送验证码
* @param phoneNumber
*/
@RequestMapping("/sendVerificationCode")
public void sendVerificationCode(String phoneNumber) {
messageService.sendVerificationCode(phoneNumber);
}
}

+ 21
- 0
user-service/src/main/java/com/hp/user/service/impl/AccountServiceImpl.java Wyświetl plik

@@ -1,6 +1,10 @@
package com.hp.user.service.impl; package com.hp.user.service.impl;
import com.hp.user.client.service.AccountService; import com.hp.user.client.service.AccountService;
import com.hp.user.client.service.MessageService;
import org.apache.commons.codec.binary.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
/** /**
@@ -13,5 +17,22 @@ import org.springframework.stereotype.Service;
*/ */
@Service @Service
public class AccountServiceImpl implements AccountService { public class AccountServiceImpl implements AccountService {
@Autowired
private MessageService messageService;
@Override
public void login(String phone, String verificationCode) {
try {
String code = messageService.getVerificationCode(phone);
if(StringUtils.equals(verificationCode, code)) {
//登陆成功
}else {
//登陆失败,返回验证码
}
}catch(Exception e) {
}
}
} }

+ 28
- 0
user-service/src/main/java/com/hp/user/service/impl/MessageServiceImpl.java Wyświetl plik

@@ -0,0 +1,28 @@
package com.hp.user.service.impl;

import org.springframework.stereotype.Service;

import com.hp.user.client.service.MessageService;

/**
* 信息服务实现类
* @author yeqid
* @since 2020/11/26
*
*/
@Service
public class MessageServiceImpl implements MessageService {

@Override
public void sendVerificationCode(String phone) {
// TODO Auto-generated method stub
}

@Override
public String getVerificationCode(String phone) {
// TODO Auto-generated method stub
return null;
}

}

+ 178
- 0
user-service/src/main/java/com/hp/user/service/redis/RedisOperation.java Wyświetl plik

@@ -0,0 +1,178 @@
package com.hp.user.service.redis;

import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

@Component
public class RedisOperation implements ApplicationRunner{

@Value("${redis-cluster.redisUrlList}")
private String hostAndPort;
@Value("${redis-cluster.password}")
private String password;
//10.1.170.207:17000,10.1.170.207:17001,10.1.170.207:17002,10.1.170.207:17003,10.1.170.207:17004,10.1.170.207:17005
private static JedisPool pool = null;
public static Jedis getRedis() {
return pool.getResource();
}
// public RedisOperation() {
// jedis = pool.getResource();
// jedis.close();
// System.out.println(jedis);
// }

// @PostConstruct
// public void init() {
//
// }
/**
* 从redis中获取数据
* @param key
* @return
*/
// public String get(String key) {
//
// return jedis.get(key);
// }
//
// /**
// * 往redis中set数据
// * @param key
// * @param value
// */
// public void set(String key,String value) {
// jedis.set(key, value);
// }
//
// /**
// * 往redis中hset数据
// * @param key
// * @param field
// * @param value
// */
// public void hset(String key,String field,String value) {
// jedis.hset(key, field, value);
// }
//
// /**
// * 从redis中hgetAll数据
// * @param key
// * @return
// */
// public Map<String,String> hgetAll(String key) {
// return jedis.hgetAll(key);
// }
//
// public String hget(String key,String filed) {
// return jedis.hget(key,filed);
// }
//
// public void hmset(String key,Map<String,String> hash) {
// jedis.hmset(key, hash);
// }
// /**
// * 设置有效时间
// * @param key
// * @param second
// */
// public void expire(String key,int second) {
// jedis.expire(key, second);
// }
//
// /**
// * 往redis中存数据并且设置失效时间
// * @param key
// * @param seconds
// * @param value
// */
// public void setex(String key,int seconds,String value) {
// jedis.setex(key, seconds, value);
// }
//
// /**
// * 批量获取指定的多个key的数据
// * @param keys
// * @return
// */
// public List<String> mget(String ...keys) {
// return jedis.mget(keys);
// }
//
// /**
// * 删除key
// * @param key
// */
// public void del(String key) {
// jedis.del(key);
// }
// /**
// * 判断key
// * @param key
// * @return
// */
// public boolean exists(String key) {
// return jedis.exists(key);
// }
// /**
// * 释放资源
// */
// public void close() {
// try {
// if(jedis != null) {
// jedis.close();
// }
//
// } catch (Exception e) {
//// LOGGER.error("redis close fail={}",e.getMessage());
// }
// }

@Override
public void run(ApplicationArguments args) throws Exception {
System.out.print("redis");
// JedisPool pool = null;
// common-pool配置
if (pool == null) {
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxTotal(GenericObjectPoolConfig.DEFAULT_MAX_TOTAL * 10);
poolConfig.setMaxIdle(GenericObjectPoolConfig.DEFAULT_MAX_IDLE * 4);
poolConfig.setMinIdle(GenericObjectPoolConfig.DEFAULT_MAX_IDLE * 2);
// JedisPool.borrowObject最大等待时间
poolConfig.setMaxWaitMillis(1000L);
try {
// Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
// String[] singleUrl = hostAndPort.trim().split(",");
String[] single = hostAndPort.split(":");
// for (int i = 0; i < singleUrl.length; i++) {
// String[] single = singleUrl[i].split(":");
// jedisClusterNodes.add(new HostAndPort(single[0],Integer.parseInt(single[1])));
//// jedisClusterNodes.add(new HostAndPort(single[0], Integer.parseInt(single[1]), false));
// }
// jedis = new JedisCluster(jedisClusterNodes,2000,20);
// jedis = new JedisCluster(jedisClusterNodes,1000,10,4,password,poolConfig);
// new JedisPool(poolConfig, singleUrl[0], singleUrl[1],1000, password);
pool= new JedisPool(poolConfig, single[0], Integer.parseInt(single[1]),1000, password);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

+ 156
- 0
user-service/src/main/java/com/hp/user/util/IdWorker.java Wyświetl plik

@@ -0,0 +1,156 @@
package com.hp.user.util;

/**
* Id生成器
* @author yeqid
*
*/
public class IdWorker{

//下面两个每个5位,加起来就是10位的工作机器id
private long workerId; //工作id
private long datacenterId; //数据id
//12位的序列号
private long sequence;
public static IdWorker worker = null;

public IdWorker(long workerId, long datacenterId, long sequence){
// sanity check for workerId
if (workerId > maxWorkerId || workerId < 0) {
throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0",maxWorkerId));
}
if (datacenterId > maxDatacenterId || datacenterId < 0) {
throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0",maxDatacenterId));
}
System.out.printf("worker starting. timestamp left shift %d, datacenter id bits %d, worker id bits %d, sequence bits %d, workerid %d",
timestampLeftShift, datacenterIdBits, workerIdBits, sequenceBits, workerId);

this.workerId = workerId;
this.datacenterId = datacenterId;
this.sequence = sequence;
}

//初始时间戳
private long twepoch = 1525705533000l;

//长度为5位
private long workerIdBits = 5L;
private long datacenterIdBits = 5L;
//最大值
private long maxWorkerId = -1L ^ (-1L << workerIdBits);
private long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
//序列号id长度
private long sequenceBits = 12L;
//序列号最大值
private long sequenceMask = -1L ^ (-1L << sequenceBits);
//工作id需要左移的位数,12位
private long workerIdShift = sequenceBits;
//数据id需要左移位数 12+5=17位
private long datacenterIdShift = sequenceBits + workerIdBits;
//时间戳需要左移位数 12+5+5=22位
private long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
//上次时间戳,初始值为负数
private long lastTimestamp = -1L;

public long getWorkerId(){
return workerId;
}

public long getDatacenterId(){
return datacenterId;
}

public long getTimestamp(){
return System.currentTimeMillis();
}

//下一个ID生成算法
public synchronized long nextId() {
long timestamp = timeGen();

//获取当前时间戳如果小于上次时间戳,则表示时间戳获取出现异常
if (timestamp < lastTimestamp) {
System.err.printf("clock is moving backwards. Rejecting requests until %d.", lastTimestamp);
throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds",
lastTimestamp - timestamp));
}

//获取当前时间戳如果等于上次时间戳(同一毫秒内),则在序列号加一;否则序列号赋值为0,从0开始。
if (lastTimestamp == timestamp) {
sequence = (sequence + 1) & sequenceMask;
if (sequence == 0) {
timestamp = tilNextMillis(lastTimestamp);
}
} else {
sequence = 0;
}
//将上次时间戳值刷新
lastTimestamp = timestamp;

/**
* 返回结果:
* (timestamp - twepoch) << timestampLeftShift) 表示将时间戳减去初始时间戳,再左移相应位数
* (datacenterId << datacenterIdShift) 表示将数据id左移相应位数
* (workerId << workerIdShift) 表示将工作id左移相应位数
* | 是按位或运算符,例如:x | y,只有当x,y都为0的时候结果才为0,其它情况结果都为1。
* 因为个部分只有相应位上的值有意义,其它位上都是0,所以将各部分的值进行 | 运算就能得到最终拼接好的id
*/
return ((timestamp - twepoch) << timestampLeftShift) |
(datacenterId << datacenterIdShift) |
(workerId << workerIdShift) |
sequence;
}

//获取时间戳,并与上次时间戳比较
private long tilNextMillis(long lastTimestamp) {
long timestamp = timeGen();
while (timestamp <= lastTimestamp) {
timestamp = timeGen();
}
return timestamp;
}

//获取系统时间戳
private long timeGen(){
return System.currentTimeMillis();
}
public static Long generactorId() {
if(worker == null) {
synchronized(IdWorker.class) {
if(worker == null) {
worker = new IdWorker(1,1,1);
}
}
}
return worker.nextId();
}

//---------------测试---------------
// public static void main(String[] args) throws InterruptedException {
//// IdWorker worker = new IdWorker(1,1,1);
// Thread t1 = new Thread( new Runnable() {public void run() { for (int i = 0; i < 30; i++) {
//
// System.out.println(IdWorker.generactorId());
//
// };} }, "t1");
// Thread t2 = new Thread( new Runnable() {public void run() { for (int i = 0; i < 30; i++) {
//
// System.out.println(IdWorker.generactorId());
// };} }, "t2");
// Thread t3 = new Thread( new Runnable() {public void run() { for (int i = 0; i < 30; i++) {
//
// System.out.println(IdWorker.generactorId());
// };} }, "t3");
// t2.start();
// t1.start();
// t3.start();
// t1.join();
// t2.join();
// }

}

Ładowanie…
Anuluj
Zapisz