乐优商城(二) |
您所在的位置:网站首页 › 乐优商城部署资料 › 乐优商城(二) |
乐优商城(二):
本人写这个博客很大原因是为了加深印象,回忆知识点,有些地方可能会有问题,如果有朋友想跟着我的进度一起写,用我的代码发现问题也请指出来,我会改正。由于本人正在实习,可能进度不是很快,可能每次发的内容不多,知识要一点一点啃才有味道 商品服务预热 包的创建:在原父工程下创建一个子工程ly-item 将ly-item作为作为父工程再在它的的下面创建两个子工程ly-item-interface,ly-item-service (注:聚合工程的父工程pom.xml文件中记得把打包方式改为pom,"< packaging>pom< /packaging>" 要注意的地方 DataSource没有driver-class-name驱动,springboot会根据url判断所需要的驱动自动配置,我们就不用写了url username password记得用自己的把服务注册到eureka在gateway网关中注册一下,不写会使用默认形式(图在下方) server: port: 8081 spring: application: name: item-service datasource: url: jdbc:mysql://localhost:3306/yun6 username: root password: **** eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka instance: prefer-ip-address: true ip-address: 127.0.0.1 routes配置:ps:这些是提供好的工具类,没有啥好解释的,可以自己看看里面的方法,依赖我放在下面了 名称:IdWorker.java *描述:分布式自增长ID * * Twitter的 Snowflake JAVA实现方案 * * 核心代码为其IdWorker这个类实现,其原理结构如下,我分别用一个0表示一位,用—分割开部分的作用: * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 ** 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) * * @author Polim */ public class IdWorker { // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) private final static long twepoch = 1288834974657L; // 机器标识位数 private final static long workerIdBits = 5L; // 数据中心标识位数 private final static long datacenterIdBits = 5L; // 机器ID最大值 private final static long maxWorkerId = -1L ^ (-1L if (workerId > maxWorkerId || workerId throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); } this.workerId = workerId; this.datacenterId = datacenterId; } /** * 获取下一个ID * * @return */ public synchronized long nextId() { long timestamp = timeGen(); if (timestamp // 当前毫秒内,则+1 sequence = (sequence + 1) & sequenceMask; if (sequence == 0) { // 当前毫秒内计数满了,则等待下一秒 timestamp = tilNextMillis(lastTimestamp); } } else { sequence = 0L; } lastTimestamp = timestamp; // ID偏移组合生成最终的ID,并返回ID long nextId = ((timestamp - twepoch) timestamp = this.timeGen(); } return timestamp; } private long timeGen() { return System.currentTimeMillis(); } /** * * 获取 maxWorkerId * */ protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { StringBuffer mpid = new StringBuffer(); mpid.append(datacenterId); String name = ManagementFactory.getRuntimeMXBean().getName(); if (!name.isEmpty()) { /* * GET jvmPid */ mpid.append(name.split("@")[0]); } /* * MAC + PID 的 hashcode 获取16个低位 */ return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); } /** ** 数据标识id部分 * */ protected static long getDatacenterId(long maxDatacenterId) { long id = 0L; try { InetAddress ip = InetAddress.getLocalHost(); NetworkInterface network = NetworkInterface.getByInetAddress(ip); if (network == null) { id = 1L; } else { byte[] mac = network.getHardwareAddress(); id = ((0x000000FF & (long) mac[mac.length - 1]) | (0x0000FF00 & (((long) mac[mac.length - 2]) 6; id = id % (maxDatacenterId + 1); } } catch (Exception e) { System.out.println(" getDatacenterId: " + e.getMessage()); } return id; } } package com.leyou.common.utils; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.lang.Nullable; import java.io.IOException; import java.util.List; import java.util.Map; /** * @author: HuYi.Zhang * @create: 2018-04-24 17:20 **/ public class JsonUtils { public static final ObjectMapper mapper = new ObjectMapper(); private static final Logger logger = LoggerFactory.getLogger(JsonUtils.class); @Nullable public static String toString(Object obj) { if (obj == null) { return null; } if (obj.getClass() == String.class) { return (String) obj; } try { return mapper.writeValueAsString(obj); } catch (JsonProcessingException e) { logger.error("json序列化出错:" + obj, e); return null; } } @Nullable public static T toBean(String json, Class tClass) { try { return mapper.readValue(json, tClass); } catch (IOException e) { logger.error("json解析出错:" + json, e); return null; } } @Nullable public static List toList(String json, Class eClass) { try { return mapper.readValue(json, mapper.getTypeFactory().constructCollectionType(List.class, eClass)); } catch (IOException e) { logger.error("json解析出错:" + json, e); return null; } } @Nullable public static Map toMap(String json, Class kClass, Class vClass) { try { return mapper.readValue(json, mapper.getTypeFactory().constructMapType(Map.class, kClass, vClass)); } catch (IOException e) { logger.error("json解析出错:" + json, e); return null; } } @Nullable public static T nativeRead(String json, TypeReference type) { try { return mapper.readValue(json, type); } catch (IOException e) { logger.error("json解析出错:" + json, e); return null; } } } package com.leyou.common.utils; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.regex.MatchResult; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author: HuYi.Zhang * @create: 2018-04-25 09:13 **/ public class NumberUtils { public static boolean isInt(Double num) { return num.intValue() == num; } /** * 判断字符串是否是数值格式 * @param str * @return */ public static boolean isDigit(String str){ if(str == null || str.trim().equals("")){ return false; } return str.matches("^\\d+$"); } /** * 将一个小数精确到指定位数 * @param num * @param scale * @return */ public static double scale(double num, int scale) { BigDecimal bd = new BigDecimal(num); return bd.setScale(scale, RoundingMode.HALF_UP).doubleValue(); } // 从字符串中根据正则表达式寻找,返回找到的数字数组 public static Double[] searchNumber(String value, String regex){ List doubles = new ArrayList(); Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(value); if(matcher.find()) { MatchResult result = matcher.toMatchResult(); for (int i = 1; i len = Math.min(len, 8); int min = Double.valueOf(Math.pow(10, len - 1)).intValue(); int num = new Random().nextInt(Double.valueOf(Math.pow(10, len + 1)).intValue() - 1) + min; return String.valueOf(num).substring(0,len); } } pom.xml: leyou com.leyou.parent 1.0.0-SNAPSHOT 4.0.0 com.leyou.common ly-common 8 8 org.apache.tomcat.embed tomcat-embed-core org.springframework.boot spring-boot-starter-logging com.fasterxml.jackson.core jackson-databind 2.9.6 org.springframework spring-core 5.2.9.RELEASE 总结:刚学习cloud,不敢进度太快,每写一点就停下来,脑子里过一遍流程,加深印象。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |