Java Base64转换,Java Base64工具类

Base64转换工具类:

1、使用JDK6自带的(不建议使用)

    import sun.misc.BASE64Encoder;   
    import sun.misc.BASE64Decoder;  
    //编码  
    BASE64Encoder encoder = new BASE64Encoder();    
    String imageString = encoder.encode(byteArray);//转换成Base64形式  
      
    //解码  
    BASE64Decoder decoder = new BASE64Decoder();    
    byte[] imageByteArray = decoder.decodeBuffer(imageString);    

但这个性能一般,而且转换出来的base64字符串会有换行符,可能还需要替换换行符,避免在某些场景因为分行导致出错
2、使用Jdk8的Base64工具类(优先考虑使用)

    java.util.Base64  
      
    //编码  
    Base64.getEncoder().encodeToString("aaaaaaaa".getBytes("utf-8"));  
      
    //解码  
    Base64.getDecoder().decode("c29tZSBzdHJpbmc=");  
      
    //URL编码  
    //URL对反斜线“/”有特殊的意义,因此URL编码需要替换掉它,使用下划线替换  
    Base64.getUrlEncoder().encodeToString("test.do?abcd".getBytes("utf-8"));  
      
    //MIME编码  
    //每一行输出不超过76个字符,而且每行以“\r\n”符结束  
    Base64.getMimeEncoder().encodeToString("aaaaaaaa".getBytes("utf-8"));  
      
    //流文件编码、解码  
    Base64.getEncoder().wrap(outputStream);   
    Base64.getDecoder().wrap(inputStream);  

性能超好,如果已经使用JDK8,直接使用这个。
3、使用Spring提供的Base64Utils类

org.springframework.util.Base64Utils;  

4、使用apache中的Base64

org.apache.commons.codec.binary.Base64  

5、使用第三方工具类(附件有相应的jar包)

   net.iharder.Base64;  
     
   Base64.encodeBytes(bytes);  
     
   //直接从文件路径获取base64编码  
   Base64.encodeFromFile("c:/938dcfd836be4e15a225110dc77769d0.jpg");  

文件转成字节

    File file = new File("c:/5110dc77769d0.jpg");  
    InputStream inputStream = new FileInputStream(file);  
    byte[] bytes = new byte[inputStream.available()];  
    inputStream.read(bytes);  
    inputStream.close();  

seata + zookeeper解决分布式事务问题

公司业务需要用到
springboot+dubbo+zookeeper 做分布式服务
但是遇到一个两个系统直接项目调用操成数据不同步问题

所以就开始百度找啊找

最终选用 seata做分布式事务

网上大部分都是nanos+seata
但是我们公司是zookeeper

所以。。。
首先在pom引入

<dependency>
                <groupId>io.seata</groupId>
                <artifactId>seata-spring-boot-starter</artifactId>
                <version>1.5.2</version>
</dependency>

然后下载seata1.5.2的程序

在seata\conf
修改application.yml
这个文件可以仿照 application.example.yml 文件进行修改

server:
  port: 7091

spring:
  application:
    name: seata-server

logging:
  config: classpath:logback-spring.xml
  file:
    path: ${user.home}/logs/seata
  extend:
    logstash-appender:
      destination: 127.0.0.1:4560
    kafka-appender:
      bootstrap-servers: 127.0.0.1:9092
      topic: logback_to_logstash

console:
  user:
    username: seata
    password: seata

seata:
  config:
    # support: nacos, consul, apollo, zk, etcd3
    type: zk
    zk:
      server-addr: 127.0.0.1:2181
      session-timeout: 6000
      connect-timeout: 2000
      username:
      password:
      node-path: /seata/seata.properties
  registry:
    # support: nacos, eureka, redis, zk, consul, etcd3, sofa
    type: zk
    zk:
      cluster: default
      server-addr: 127.0.0.1:2181
      session-timeout: 6000
      connect-timeout: 2000
      username: ""
      password: ""
  store:
    # support: file 、 db 、 redis
    mode: db
    db:
      datasource: druid
      db-type: mysql
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=true
      user: user
      password: password
      min-conn: 5
      max-conn: 100
      global-table: global_table
      branch-table: branch_table
      lock-table: lock_table
      distributed-lock-table: distributed_lock
      query-limit: 100
      max-wait: 5000
#  server:
#    service-port: 8091 #If not configured, the default is '${server.port} + 1000'
  security:
    secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
    tokenValidityInMilliseconds: 1800000
    ignore:
      urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login

然后再项目里面的application.yml
添加

#AT 模式
seata:
  enabled: true
  application-id: kingow-oa-server  ---自己写
  tx-service-group: kingow-oa-server-group ---自己写,这个和下面的service.vgroup-mapping的key要保持一致
  enable-auto-data-source-proxy: true
  client:
    support:
      spring:
        datasource-autoproxy: true
  registry:
    type: zk
    zk:
      server-addr: 127.0.0.1:2181
      connect-timeout: 2000
      session-timeout: 6000
      username: ""
      password: ""
  service:
    grouplist:
      default: 127.0.0.1:8091
    vgroup-mapping:
      kingow-oa-server-group: default  

seata 要导入它自身的数据库 创建一个数据库导入,然后修改seata的yml文件里面的db链接 seata\script\server\db
,然后再业务数据库 自行添加一个表

CREATE TABLE `undo_log` (
  `branch_id` bigint NOT NULL COMMENT 'branch transaction id',
  `xid` varchar(100) NOT NULL COMMENT 'global transaction id',
  `context` varchar(128) NOT NULL COMMENT 'undo_log context,such as serialization',
  `rollback_info` longblob NOT NULL COMMENT 'rollback info',
  `log_status` int NOT NULL COMMENT '0:normal status,1:defense status',
  `log_created` datetime(6) NOT NULL COMMENT 'create datetime',
  `log_modified` datetime(6) NOT NULL COMMENT 'modify datetime',
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='AT transaction mode undo table';

然后如果要使用 就在service层添加注解

@GlobalTransactional

目录:seata\bin
linux启动方式:

./seata-server.sh -h 127.0.0.1 -p 8091 &

window直接双击

seata-server.bat

如果一闪而过可以在bat文件最后里面添加一行

pause

seata启动后有个前端页面:
http://127.0.0.1:7091/#/
可以查看全局事务情况
,debug模块打断点可以表undo_log里面的数据,回滚成功后就会删除记录

Dubbo 泛化引用简介

使用方式

在这里我们主要介绍两种使用方式:
1.通过 Spring 使用泛化引用
配置 XML 文件中的服务引用为generic="true"

  <dubbo:reference id="barService" interface="com.muke.dubbocourse.common.api.BookFacade" generic="true" />
<!--more-->
在代码中使用泛化调用
  GenericService barService = (GenericService) applicationContext.getBean("bookFacade");
  Object result = barService.$invoke("queryAll", null, null);

2.通过 Java API 方式使用

// 引用远程服务 
ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>(); 
// 弱类型接口名
reference.setInterface("com.muke.dubbocourse.common.api.BookFacade");  
reference.setVersion("0.0.1");
// 声明为泛化接口 
reference.setGeneric(true);  

// 用org.apache.dubbo.rpc.service.GenericService可以替代所有接口引用  
GenericService genericService = reference.get(); 

// 如果返回实体对象将自动转成Map 
Object result = genericService.$invoke("queryByName",new String[]
{"com.muke.dubbocourse.common.api.RequestParameter"}, new Object[]{parameter}); 

DUBBO泛化调用原理与设计思想

1 泛化调用实例
对于JAVA服务端开发者而言在使用Dubbo时并不经常使用泛化调用,通常方法是在生产者发布服务之后,消费者可以通过引入生产者提供的client进行调用。那么泛化调用使用场景是什么呢?

第一种场景是消费者不希望引入生产者提供的client依赖,只希望关注调用哪个方法,需要传什么参数即可。第二种场景是消费者不是使用Java语言,而是使用例如Python语言,那么如何调用使用Java语言生产者提供的服务呢?这时我们可以选择泛化调用。

泛化调用使用方法并不复杂,下面我们编写一个泛化调用实例。首先生产者发布服务,这与普通服务发布没有任何区别。

package com.java.front.dubbo.demo.provider;
<!--more-->
public interface HelloService {
    public String sayHelloGeneric(Person person, String message);
}

public class HelloServiceImpl implements HelloService {
    @Override
    public String sayHelloGeneric(Person person, String message) throws Exception {
        String result = "hello[" + person + "],message=" + message;
        return result;
    }
}

Person类声明:

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans        
    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        
    http://code.alibabatech.com/schema/dubbo        
    http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

 <!-- 提供方应用信息,用于计算依赖关系 -->
 <dubbo:application name="java-front-provider" />

 <!-- 连接注册中心 -->
 <dubbo:registry address="zookeeper://127.0.0.1:2181" />

 <!-- 生产者9999在端口暴露服务 -->
 <dubbo:protocol name="dubbo" port="9999" />
 
 <!-- Bean -->
 <bean id="helloService" class="com.java.front.dubbo.demo.provider.HelloServiceImpl" />
 
 <!-- 暴露服务 -->
 <dubbo:service interface="com.java.front.dubbo.demo.provider.HelloService" ref="helloService" />
</beans>

消费者代码有所不同:

import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ReferenceConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.rpc.RpcContext;
import org.apache.dubbo.rpc.service.GenericService;

public class Consumer {
    public static void testGeneric() {
        ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();
        reference.setApplication(new ApplicationConfig("java-front-consumer"));
        reference.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
        reference.setInterface("com.java.front.dubbo.demo.provider.HelloService");
        reference.setGeneric(true);
        GenericService genericService = reference.get();
        Map<String, Object> person = new HashMap<String, Object>();
        person.put("name", "微信公众号「JAVA前线」");
        String message = "你好";
        Object result = genericService.$invoke("sayHelloGeneric", new String[] { "com.java.front.dubbo.demo.provider.model.Person", "java.lang.String" }, new Object[] { person, message });
        System.out.println(result);
    }
}

Save Action 忽略格式化指定文件

添加文件路径排除正则表达式

添加排除表达式时,只有不匹配的文件会受到保存操作的影响。(使用区分大小写的 Java 正则表达式,匹配完整文件路径的结尾)

Ignore\.java(排除所有文件夹中的文件 ‘Ignore.java’)
.*\.properties(排除所有文件夹中的所有 “.properties”)
src/Ignore\.java(在’src’ 文件夹中排除文件 ‘Ignore.java’)
Ignore /.*(递归排除文件夹 “忽略”)
myProject/Ignore.md(在项目 “myProject” 中排除文件 “Ignore.md”)

所以只要按照所给的例子添加就行,如: