1.service方式
UpdateWrapper updateWrapper = new UpdateWrapper<>();
updateWrapper.lambda()
.in(字段名, ids);
val xxxteEntity = new xxxteEntity();
xxxteEntity.set字段名(字段值);
//xxxteEntity 修改后的实体
int num= xxxMapper.update(xxxteEntity,updateWrapper);
2.mapper方式
UpdateWrapper updateWrapper = new UpdateWrapper<>();
updateWrapper.lambda()
.in(xxxEntity::getId, ids);
.set(xxxEntity::字段名,修改的值);
boolean res= xxService.update(updateWrapper);
过滤发包校验
feign调用
@Component
public class CollectionShopCompareFallbackFactory implements FallbackFactory {
@Override
public ICollectionShopCompareRemoteService create(Throwable throwable) {
return null;
}
}
@FeignClient(contextId = "collectionShopCompareRemoteService", name = "saas-collect-server",
url = "${feign.server.collect-url}", fallbackFactory = CollectionTemplateServiceFallbackFactory.class)
public interface ICollectionShopCompareRemoteService {
}
collect-url: http://localhost:31514
日志:切面
/**
@description: 系統操作日志切面,用户对系统操作进行记录
**/
@Slf4j
//作用是把当前类标识为一个切面供容器读取
@Aspect
@Component
public class SysOperatorLogAspect extends CommonController {
@Resource
private ISysOperatorLogRemoteService sysOperatorLogService;
@Resource
private EncodeDecodeService encodeDecodeService;
@Resource
private Environment environment;
/**
* Advice(通知、切面): 某个连接点所采用的处理逻辑,也就是向连接点注入的代码, AOP在特定的切入点上执行的增强处理。
* @Before: 标识一个前置增强方法,相当于BeforeAdvice的功能.
* @After: final增强,不管是抛出异常或者正常退出都会执行.
* @AfterReturning: 后置增强,似于AfterReturningAdvice, 方法正常退出时执行.
* @AfterThrowing: 异常抛出增强,相当于ThrowsAdvice.
* @Around: 环绕增强,相当于MethodInterceptor.
* JointPoint(连接点):程序运行中的某个阶段点,比如方法的调用、异常的抛出等。
* Pointcut(切入点): JoinPoint的集合,是程序中需要注入Advice的位置的集合,指明Advice要在什么样的条件下才能被触发,在程序中主要体现为书写切入点表达式。
* Advisor(增强): 是PointCut和Advice的综合体,完整描述了一个advice将会在pointcut所定义的位置被触发。
* @Aspect(切面): 通常是一个类的注解,里面可以定义切入点和通知
* AOP Proxy:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类。
*/
@Pointcut(value = "@annotation(com.shuwei.sscm.saas.admin.annotate.SysLogAnnotate)")
public void annotateCut() {
}
//标识一个前置增强方法,相当于BeforeAdvice的功能,相似功能的还有
@Before(value = "annotateCut()")
public void before(JoinPoint joinPoint) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
SysLog sysOperatorLog = new SysLog();
String argsStr = Arrays.toString(joinPoint.getArgs());
if (StringUtils.isNotBlank(argsStr) && argsStr.length() > 2000) {
argsStr = argsStr.substring(0, 2000);
}
// 自定义注解
/**
* @Target({ElementType.TYPE, ElementType.METHOD})
* @Retention(RetentionPolicy.RUNTIME)
* @Inherited
* @Documented
* public @interface SysLogAnnotate {
*
* String title() default "";
*
* String action() default "";
*
* ClientEnum client() default ClientEnum.PC;
*
* }
*/
SysLogAnnotate sysLogAnnotate = method.getAnnotation(SysLogAnnotate.class);
HttpServletRequest request = attributes.getRequest();
sysOperatorLog.setTitle(sysLogAnnotate.title());
sysOperatorLog.setAction(sysLogAnnotate.action());
sysOperatorLog.setClient(sysLogAnnotate.client().getType());
sysOperatorLog.setRequestParam(argsStr);
sysOperatorLog.setRequestUri(request.getRequestURI());
sysOperatorLog.setGmtCreate(DateUtils.getNow());
String token = request.getHeader("Authorization");
// 用户信息
MchUser user = getCurrentUser();
if (null != user && StringUtils.isNotEmpty(token)) {
sysOperatorLog.setMerchantId(user.getBelongId());
sysOperatorLog.setUserId(user.getId());
sysOperatorLog.setUserName(user.getName());
String telPhone = user.getTelphone();
String env = environment.getProperty("spring.profiles.active");
String profile = "dev,local";
if (StringUtils.isNotBlank(telPhone) && env != null && !profile.contains(env)) {
telPhone = encodeDecodeService.encodeData(telPhone);
}
sysOperatorLog.setUserPhone(telPhone);
}
log.info("sysOperatorLog:{}", sysOperatorLog);
try {
sysOperatorLogService.saveSysLog(sysOperatorLog);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}
Broker:消息中转角色,负责存储消息,转发消息。Broker是具体提供业务的服务器,单个Broker节点与所有的NameServer节点保持长连接及心跳,并会定时将Topic信息注册到NameServer,顺带一提底层的通信和连接都是基于Netty实现的。Broker负责消息存储,以Topic为纬度支持轻量级的队列,单机可以支撑上万队列规模,支持消息推拉模型。官网上有数据显示:具有上亿级消息堆积能力,同时可严格保证消息的有序性
Topic:主题!它是消息的第一级类型。比如一个电商系统可以分为:交易消息、物流消息等,一条消息必须有一个 Topic 。Topic与生产者和消费者的关系非常松散,一个 Topic 可以有0个、1个、多个生产者向其发送消息,一个生产者也可以同时向不同的 Topic 发送消息。一个 Topic 也可以被 0个、1个、多个消费者订阅。
Tag:标签!可以看作子主题,它是消息的第二级类型,用于为用户提供额外的灵活性。使用标签,同一业务模块不同目的的消息就可以用相同Topic而不同的Tag来标识。比如交易消息又可以分为:交易创建消息、交易完成消息等,一条消息可以没有Tag。标签有助于保持您的代码干净和连贯,并且还可以为RabbitMQ提供的查询系统提供帮助。
MessageQueue:一个Topic下可以设置多个消息队列,发送消息时执行该消息的Topic,RocketMQ会轮询该Topic下的所有队列将消息发出去。消息的物理管理单位。一个Topic下可以有多个Queue,Queue的引入使得消息的存储可以分布式集群化,具有了水平扩展能力。
NameServer:类似Kafka中的ZooKeeper,但NameServer集群之间是没有通信的,相对ZK来说更加轻量。它主要负责对于源数据的管理,包括了对于Topic和路由信息的管理。每个Broker在启动的时候会到NameServer注册,Producer在发送消息前会根据Topic去NameServer获取对应Broker的路由信息,Consumer也会定时获取 Topic 的路由信息。
Producer:生产者,支持三种方式发送消息:同步、异步和单向单向发送 :消息发出去后,可以继续发送下一条消息或执行业务代码,不等待服务器回应,且没有回调函数。异步发送 :消息发出去后,可以继续发送下一条消息或执行业务代码,不等待服务器回应,有回调函数。同步发送 :消息发出去后,等待服务器响应成功或失败,才能继续后面的操作。
Consumer:消费者,支持 PUSH 和 PULL 两种消费模式,支持集群消费和广播消费集群消费 :该模式下一个消费者集群共同消费一个主题的多个队列,一个队列只会被一个消费者消费,如果某个消费者挂掉,分组内其它消费者会接替挂掉的消费者继续消费。广播消费 :会发给消费者组中的每一个消费者进行消费。相当于RabbitMQ的发布订阅模式。
Group:分组,一个组可以订阅多个Topic。分为ProducerGroup,ConsumerGroup,代表某一类的生产者和消费者,一般来说同一个服务可以作为Group,同一个Group一般来说发送和消费的消息都是一样的
Offset:在RocketMQ中,所有消息队列都是持久化,长度无限的数据结构,所谓长度无限是指队列中的每个存储单元都是定长,访问其中的存储单元使用Offset来访问,Offset为Java Long类型,64位,理论上在 100年内不会溢出,所以认为是长度无限。也可以认为Message Queue是一个长度无限的数组,Offset就是下标。