typora
markdown编写软件之一
观察者模式
监听者
实现 implements ApplicationListener<Observable>
重写 public void onApplicationEvent(Observable event)
被监听者
继承 extends ApplicationEvent
调用
applicationContext.publishEvent(event);
使用观察者模式可以让修改后的状态,通知同一模块中的其他部分进行处理数据。
kafka
zookeeper,依赖注册中心,
消费
@KafkaListener(topics = {"message"})
public void listen(ConsumerRecord<?, ?> record)
生产
kafkaTemplate.send("uap_test", "test_key",message)
fegin
调用
@FeignClient("test-messagereceiver")//服务名
启动类
@EnableFeignClients
微服务之间调用,基于注册中心,
redis
es
使用场景,日志,文件库,查询,
继承extends UnsynchronizedAppenderBase<LoggingEvent>
重写配置config
log添加es
eureka
注册中心
配置即可
seata
分布式事务
需要有服务端
docker
仓库,镜像,容器,分区域运行,互不干扰
运维部署快速,
mybaties plus
jdbc
generator
代码自动生成
swagger
maven配置
@Api(tags = {"账号"})
@ApiOperation("查询").
1、接口的文档在线自动生成
2、功能测试
正式环境设置开关关闭
项目代码中通过注解添加注释后,能自动生成api文档,以及前端控制器,能测试功能。
zuul
zipkin
redis 分布式事务锁
/**
* 加锁
* @param key seckillId
* @param value 当前时间+超时时间
* @return
*/
public boolean lock(String key, String value) {
// 可以设置返回true
Boolean isLock = redisTemplate.opsForValue().setIfAbsent(key, value);
if (isLock) {
return true;
}
String currentValue = redisTemplate.opsForValue().get(key);
// 如果锁已经过期
if (!StringUtils.isEmpty(currentValue)
&& Long.valueOf(currentValue) < System.currentTimeMillis()) {
// 获取上一个锁的时间,并设置新锁的时间
String oldValue = redisTemplate.opsForValue().getAndSet(key, value);
if (!StringUtils.isEmpty(oldValue)
&& oldValue.equals(currentValue)) {
log.info("锁过期并返回true");
return true;
}
}
return false;
}
/**
* 解锁
* @param key
* @return
*/
public void unlock(String key, String value) {
try {
String currentValue = redisTemplate.opsForValue().get(key);
if (!StringUtils.isEmpty(currentValue)
&& currentValue.equals(value)) {
redisTemplate.opsForValue().getOperations().delete(key);
}
} catch (Exception e) {
log.error("redis分布式锁,解锁异常:"+e.getMessage());
}
}
测试锁
long currentTimeMills = System.currentTimeMillis();
String redisLockValue = String.valueOf(currentTimeMills + 20000);
if(lock.lock("redisTest", redisLockValue)){
Thread.sleep(10000);
lock.unlock("redisTest",redisLockValue);
return true;
}else
{
return false;
}