1 F:\programme\Java\jdk1.8.0_201\bin>keytool.exe -genkeypair -alias boot -keyalg RSA -keystore e:/boot/boot.key
pwd :boot11 库密码和boot对应的密码
2
F:\programme\Java\jdk1.8.0_201\bin>keytool -importkeystore -srckeystore e:/boot/boot.key -destkeystore e:/boot/boot.key -deststoretype pkcs12
3 springboot 的https的使用:
4 iconfont.cn 阿里矢量图集
用第二部转码后的无法使用,只能用第一次生成的旧的,
在4 启动类配置 链接的跳转方法
springboot2的写法和 1不一样,下面是正确的
// springboot2 写法
@Bean
public TomcatServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint constraint = new SecurityConstraint();
constraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
constraint.addCollection(collection);
context.addConstraint(constraint);
}
};
tomcat.addAdditionalTomcatConnectors(httpConnector());
return tomcat;
}
@Bean
public Connector httpConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
//Connector监听的http的端口号
connector.setPort(8080);
connector.setSecure(false);
//监听到http的端口号后转向到的https的端口号
connector.setRedirectPort(8443);
return connector;
}
3 Minor GC 和 Full GC有什么区别?
Minor GC:新生代 GC,指发生在新生代的垃圾收集动作,因为 Java 对象大多死亡频繁,所以 Minor GC 非常频繁,一般回收速度较快。
Full GC:老年代 GC,也叫 Major GC,速度一般比 Minor GC 慢 10 倍以上。
4 Java 内存
为什么要将堆内存分区?
对于一个大型的系统,当创建的对象及方法变量比较多时,即堆内存中的对象比较多,如果逐一分析对象是否该回收,效率很低。分区是为了进行模块化管理,管理不同的对象及变量,以提高 JVM 的执
行效率。
分代收集算法
内存分配有哪些原则?
对象优先分配在 Eden
大对象直接进入老年代
长期存活的对象将进入老年代
动态对象年龄判定
空间分配担保
Young Generation Space (采用复制算法)
主要用来存储新创建的对象,内存较小,垃圾回收频繁。这个区又分为三个区域:一个 Eden Space 和两个 Survivor Space。
当对象在堆创建时,将进入年轻代的Eden Space。
垃圾回收器进行垃圾回收时,扫描Eden Space和A Suvivor Space,如果对象仍然存活,则复制到B Suvivor Space,如果B Suvivor Space已经满,则复制 Old Gen
扫描A Suvivor Space时,如果对象已经经过了几次的扫描仍然存活,JVM认为其为一个Old对象,则将其移到Old Gen。
扫描完毕后,JVM将Eden Space和A Suvivor Space清空,然后交换A和B的角色(即下次垃圾回收时会扫描Eden Space和B Suvivor Space。
Tenure Generation Space(采用标记-整理算法)
主要用来存储长时间被引用的对象。它里面存放的是经过几次在 Young Generation Space 进行扫描判断过仍存活的对象,内存较大,垃圾回收频率较小。
Permanent Space
存储不变的类定义、字节码和常量等。
5 一个类展示内存结构模型
package com.example.springbootdemo; //对象分配原则 //对象优先分配在 Eden //大对象直接进入老年代 //长期存活的对象将进入老年代 public class JVMModule { public static void main(String[] args) { } } class Memory{ //永久区 PemanentSpace pemanentSpace; //堆内存区 HeapSpace heapSpace; } class PemanentSpace{ //字节码 Object bytecode; //constants常量 Object constants; // Object classDefine; } //堆内存 class HeapSpace{ //新生代, YoungGenerateSpace youngGenerateSpace; //旧生代,也叫old 老年代 TenureGenerateSpace tenureGenerateSpace; } class YoungGenerateSpace{ //eden 伊甸园 Object edenSpace; //幸存者0 Object suvivor0space; //幸存者1 Object suvivor1space; } //新生代 class TenureGenerateSpace{ }
6 jvm参数调优
根据web (可以中断)gui 不可中断 ,
根据 内存和cpu个数
来调整
7 内存参数调优的例子
-XX:+PrintCommandLineFlags 或者jmx 查询 $ java -XX:InitialHeapSize=128m -XX:MaxHeapSize=2g MyApp 缩写是 Xms Xmx 下面是内存溢出时 保持内存快照,并保存路径,因为很大,所以需要指定位置, 第三个参数内存溢出时直线shell脚本 cleanup,例如可以发送邮件 java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -XX:OnOutOfMemoryError ="sh ~/cleanup.sh" MyApp
8 -XX:+PrintCommandLineFlags 或者jmx 查询
$ java -XX:InitialHeapSize=128m -XX:MaxHeapSize=2g MyApp 缩写是 Xms Xmx
下面是内存溢出时 保持内存快照,并保存路径,因为很大,所以需要指定位置, 第三个参数内存溢出时直线shell脚本 cleanup,例如可以发送邮件
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -XX:OnOutOfMemoryError ="sh ~/cleanup.sh" MyApp'''
设置永久区会独立于 上面 的 maxheap size ,另外再占内存
java -XX:PermSize=128m -XX:MaxPermSize=256m MyApp
初始缓存,如果发生问题,字节码会不编译,速度降低了数量级,
-XX:InitialCodeCacheSize and -XX:ReservedCodeCacheSize
代码缓存被填满时让JVM放弃一些编译代码。通过使用-XX:+UseCodeCacheFlushing 这个参数
9 阿里和网易开源镜像站
你可以使用阿里或者网易的镜像服务器上面的。阿里:https://opsx.alibaba.com/mirror,网易:http://mirrors.163.com/
10 测试用抓包工具 fiddler
1 swagger
2 @data lombok的用法
1
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.4</version> <scope>provided</scope> </dependency>
2 plugin ,browser response , search lombok, (新版本只有marketplace),install
3 解决编译问题
build,compile, annonation process,default enable
4 直接开始使用
3 bean验证 完整
4 mongodb
5 分页 pagehelper-spring-boot-starter
6 shiro
7 jpush
8 quartz distribute
9 miaodi demo
10 email spring boot
11 springboot 配置 lockback 日志
12 aop 打印日志方法
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
@Aspect
@Component
@Slf4j
public class LogAspectServiceApi {
@Pointcut("execution(public * com.xxxxxx.controller.*.*(..))")
private void controllerAspect() {
}
@Before(value = "controllerAspect()")
public void methodBefore(JoinPoint joinPoint) {
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder
.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();
log.info("===============请求内容===============");
try {
log.info("请求地址:" + request.getRequestURL().toString());
log.info("请求方式:" + request.getMethod());
log.info("请求类方法:" + joinPoint.getSignature());
log.info("请求类方法参数:" + Arrays.toString(joinPoint.getArgs()));
} catch (Exception e) {
log.error("ERROR:", e);
}
log.info("===============请求内容===============");
}
@AfterReturning(returning = "o", pointcut = "controllerAspect()")
public void methodAfterReturing(Object o) {
log.info("--------------返回内容----------------");
try {
log.info("Response内容:" + JSONObject.toJSONString(o));
} catch (Exception e) {
log.error("### ERROR:", e);
}
log.info("--------------返回内容----------------");
}
}
13 配置忽略ssl https证书的 resttemplate
import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.TrustStrategy; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClients; import org.apache.http.ssl.SSLContexts; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; import javax.net.ssl.SSLContext; import java.security.KeyManagementException; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; @Configuration public class SSLNoUseRestConfig { /** * 配置忽略 SSL证书的 resttemplate */ @Bean public RestTemplate restTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException { RestTemplate restTemplate = new RestTemplate(getFactory()); return restTemplate; } private HttpComponentsClientHttpRequestFactory getFactory() { HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); try { TrustStrategy acceptingTrustStrategy = (x509Certificates, authType) -> true; SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build(); SSLConnectionSocketFactory connectionSocketFactory = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier()); HttpClientBuilder httpClientBuilder = HttpClients.custom(); httpClientBuilder.setSSLSocketFactory(connectionSocketFactory); CloseableHttpClient httpClient = httpClientBuilder.build(); factory.setHttpClient(httpClient); } catch (Exception e) { e.printStackTrace(); } return factory; } }
14 mongodb
save对象时移除 _class属性的配置
/** * 移除 mongo _class 属性字段 */ @Configuration public class MongoDBConfig { @Autowired MongoDbFactory mongoDbFactory; @Autowired MongoMappingContext mongoMappingContext; @Bean public MappingMongoConverter mappingMongoConverter() { DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory); MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext); converter.setTypeMapper(new DefaultMongoTypeMapper(null)); return converter; } }
15 开启swagger
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; @Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.xxxxxxxx.controller")) .paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("my manager") .description("mydesc") .termsOfServiceUrl("http://www.ityouknow.com/") //servide network .version("1.0") .contact(new Contact("mycompany", "url", "imydata")) .build(); } }
15 极光推送
import cn.jiguang.common.ClientConfig;
import cn.jiguang.common.resp.APIConnectionException;
import cn.jiguang.common.resp.APIRequestException;
import cn.jpush.api.JPushClient;
import cn.jpush.api.push.PushResult;
import cn.jpush.api.push.model.Options;
import cn.jpush.api.push.model.Platform;
import cn.jpush.api.push.model.PushPayload;
import cn.jpush.api.push.model.audience.Audience;
import cn.jpush.api.push.model.notification.AndroidNotification;
import cn.jpush.api.push.model.notification.IosNotification;
import cn.jpush.api.push.model.notification.Notification;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class JigPushUtil {
private static final Logger log = LoggerFactory.getLogger(JigPushUtil.class);
private static String masterSecret = "abc";
private static String appKey = "def";
public static void jiguangPush(String alias, String message){
try {
PushResult result = push(String.valueOf(alias),message);
log.info("result?"成功":"失败"));
} catch (Exception e) {
log.error("发生错误:"+e.toString());
}
}
private static PushPayload buildPushObject_android_ios_alias_alert(String alias,String message){
return PushPayload.newBuilder()
.setPlatform(Platform.all())
.setAudience(Audience.alias(alias))
.setNotification(Notification.newBuilder()
.addPlatformNotification(AndroidNotification.newBuilder()
.addExtra("type", "infomation")
.setAlert(message)
.build())
.addPlatformNotification(IosNotification.newBuilder()
.addExtra("type", "infomation")
.setAlert(message)
.build())
.build())
.setOptions(Options.newBuilder()
.setApnsProduction(true)//true-推送生产环境 false-推送开发环境(测试使用参数)
.setTimeToLive(90)//消息在JPush服务器的失效时间
.build())
.build();
}
private static PushResult push(String alias,String message){
try {
ClientConfig clientConfig = ClientConfig.getInstance();
JPushClient jpushClient = new JPushClient(masterSecret, appKey, null, clientConfig);
PushPayload payload = buildPushObject_android_ios_alias_alert(alias,message);
PushResult result = jpushClient.sendPush(payload);
jpushClient.close();
return result;
} catch (APIConnectionException e) {
log.error("Connection error. Should retry later. ", e);
return null;
} catch (APIRequestException e) {
log.error("Error response from JPush server. Should review and fix it. ", e);
return null;
}catch (Exception e) {
log.error("Failed to send push to app ",e);
return null;
}
}
public static void main(String[] args) {
jiguangPush("123","mysesssge");
}