Intercept all methods in the controller through the Aspect
- Unified verification of incoming parameters
- Resolve-request repeated submission
- Log TODO: specify the method to send Kafka, console print
- Time-consuming statistics interface
- Unified exception handling
- Unified parameter output format
1. Add the annotation @EnableEncryptableProperties to Application.java;
2. Add the configuration file jasypt.encryptor.password = encodepawd, which is the encryption key;
3. Replace all plaintext passwords with ENC (encrypted string), for example ENC (XW2daxuaTftQ+F2iYPQu0g==);
The method of generating the encrypted string in the third step is
 
encryption
java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="dbpassword" password=encodepawd algorithm=PBEWithMD5AndDES
 
Decrypt
java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input="BRn0kKO3x7NVaziI1f2/8ovMh+0IhZ2P" password=dqbusi123456 algorithm=PBEWithMD5AndDES
 Two ways
The frontId in the request body is set at the front-end value, and a different value is passed in each request. The back-end sets the frontId according to the deduplication or the request header.
Or request body to pass value hash
Then perform redis reset for ip+frontId or ip+hash
The back-end is designed to the request level, and the controller adds the annotation @DisableDuplicateSubmit
    
easy.dup.open: true
experiment
@PostMapping("/testDup")
@DisableDuplicateSubmit(type = DupEnum.REQUEST_HASH, timeout = 2000)
@ResponseBody
public Object testDup(@RequestBody OrderBean orderBean){
    return orderBean.getOrderId();
}eg:
Jingdong background>
         WeChat payment gateway
Meituan Backstage>
The merchant backend encrypts the input parameters of the interface requesting WeChat payment gateway, and decrypts WeChat
So if you want to safely expose your service interface to other callers, you can use encryption
Support @RequestBody post method application/json
    
encrypt-request:
     enable: true
      
The front-end passes parameters public key encryption, background private key decryption, and the private key is stored in resources/key/private_key.txt
test
Start the example, visit http://localhost:8080/easybuild/okay/testEncrypt
@PostMapping("/testEncrypt")
@EncryptRequest
@ResponseBody
public Object testEncrypt(@RequestBody OrderBean orderBean){
}
curl -X POST "http://localhost:8081/easybuild/okay/testEncrypt" -H "accept: */*" -H "Content-Type: application/json" -d "IHXX1i8IGuy211ecqsE9X3kpKXbbTwUUNz5wuFkkbUFUDCDzf69t243wEyS9VZ951aR85zYeLiMzHr8gmcYhuGZwNq9/seAyFrxPd4EvNXGrZmcHN/klJoibYIJYW6usIMg5ceNSQeAMK6jFUjIv02fYK7aCjOmJ6LwxWfsKn7dnAC86FzV0zCnWTGQSKnoz52/ghX7tU5Q+66V5SihZKM7s7LTKICQPmwZ/H1NRbzUHR1pLzox/kRTkx46LnNYKLRuaswEC8PGq4dnxL36WPH3kMe+ELXOa1Az7U1jGVSFBrPN/3Ts1C6npea9BzF2LvX7pQsOavjOhctgW6QNh3A=="
return
{
  "success": true,
  "data": "1231",
  "code": "0",
  "message": "success"
}easy.lock.open: true
easy:
  redis:
    redisson:
      file: classpath:redisson.yaml
      config:
        singleServerConfig:
          idleConnectionTimeout: 10000
          connectTimeout: 10000
          timeout: 3000
          retryAttempts: 3
          retryInterval: 1500
          subscriptionsPerConnection: 5
          address: "redis://127.0.0.1:6379"
          subscriptionConnectionMinimumIdleSize: 1
          subscriptionConnectionPoolSize: 50
          connectionMinimumIdleSize: 24
          connectionPoolSize: 64
          database: 0
          dnsMonitoringInterval: 5000使用restTemplate
easy:
  http:
    connect-timeout: 30000
    connection-request-timeout: 30000
    socket-timeout: 60000
    max-total: 200
    default-max-per-route: 200
easy:
   cors:
     enable: true
     allowOrigin: localhost:8080
easy:
   swagger:
     enable: true
     profile: test
easy:
   context:
     debug: true
     pretty: false
Global login verification, open open, customize login implementation logic, implement LoginService interface, and declare it as a component
easy:
   login:
     open: true
     path-patterns:
       -/**
     exclude-path-patterns:
       -/*/*.html
       -/*/*.js
       -/*/*.css
       -/*/*.woff
       -/*/*.ttf
Using snowflake algorithm snowFlake, 64bit
Automatically open after configuration
easy:
   seq:
     workerId: 1
     datacenterId: 1
rocketmq configuration
easy:
  rocketmq:
    producer:
      transaction:
        enable: true
      nameSrvAddr: localhost:9876
      group: ProducerGroup
      topic: default_topic
      tag:'*'
    consumer:
      nameSrvAddr: localhost:9876
      group: ConsumerGroup
      topic: default_topic
      tag:'*'
      
Production
Open the transaction, inject TransactionMQProducer, otherwise inject
     
@Autowired
private TransactionMQProducer transactionMQProducer;
     
@Autowired
private DefaultMQProducer defaultMQProducer;
     Consumption> pull and push two ways, the code is as follows
1. Pull, just inherit PullConsumerJob, and consume in run
     
@Component
@Consumer(consumerGroup = "test_consumer_group", topic = "test_topic", namesrvAddr = "")
public class TestPullConsumerJob extends AbstractPullConsumerJob {
    @Override
    public void run(String... args) {
        // DO your business, with consumer
        //consumer.fetchConsumeOffset();
    }
}
     
2. Push, inherit PushConsumerJob, create processing listener
     
@Component
@Consumer(consumerGroup = "test_consumer_group1", topic = "test_topic", namesrvAddr = "", listener = TestPushMessageListener.class)
public class TestPushConsumer extends AbstractPushConsumerJob {
}
     
@Component
public class TestPushMessageListener implements MessageListenerConcurrently {
    @Override
    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
        // DO you business
        return null;
    }
}
     
     @Component
public class ServiceImpl extends AbstractImageCode{}
Inherit the abstract class, saveCode, getCode to realize the storage/withdrawal of the verification code
