8月份因为没有被安排具体的项目,就是个打下手的。导致我八月份其实比较闲。工作内容就是写了个测试工具。但是其实很快就写好。然后对系统进行测试(其实我是开发岗啊)
然后大部分知识点都是自己再看书。但是没有应用的,影映像不够深刻。很多东西很快就忘记了。同样的,没有应用可以把知识点研究的更深入些。不像应用的时候,就只关注浅浅的表面。
1. 动态代理
代理的目的是为了增强方法。同时为了避免直接访问方法。
动态代理有两种方式:CGLIB和JDK
前者不需要实现某个接口。但是本质是继承,需要被代理的方法不能被final修饰。后者需要实现某一个接口
写法都是固定的。重要的理解代理的思想。考虑好做什么
CGLIB方式:
/**
* @Author: wbdengtt
* @Date: 2020/8/6 17:54
*/
//测试类
public class ProxyTest {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(CaiXuKun.class);
enhancer.setCallback(new MyMethodInterceptor());
CaiXuKun caiXuKun = (CaiXuKun) enhancer.create();
caiXuKun.dance();
caiXuKun.sing();
}
}
// 增强
class MyMethodInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("我是经济人,收钱的");
return methodProxy.invokeSuper(o, objects);
}
}
// 被代理的类
class CaiXuKun {
/**
* 唱歌
* @return 返回结果
*/
public String sing() {
System.out.println("这是在唱歌");
return null;
}
/**
* 跳舞
* @return 返回结果
*/
public String dance() {
System.out.println("这是在打篮球");
return null;
}
}
JDK
/**
* @Author: wbdengtt
* @Date: 2020/8/6 17:20
*/
// 测试类
public class ProxyTest {
public static void main(String[] args) {
Star liuDeHua = new LiuDeHua();
StarFactory starFactory = new StarFactory();
System.out.println("代理前:");
liuDeHua.dance();
liuDeHua.sing();
System.out.println("代理后:");
Star starProxy = (Star)starFactory.getProxy(liuDeHua);
starProxy.dance();
starProxy.sing();
Star cxkProxy = (Star) starFactory.getProxy(new CaiXuKun());
cxkProxy.sing();
cxkProxy.dance();
}
}
// 代理工厂
class StarFactory implements InvocationHandler {
private Object target;
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("经纪人收钱");
return method.invoke(target,args);
}
/**
* 获取代理对象
* @param target
* @return
*/
public Object getProxy(Object target) {
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
}
// 声明接口
interface Star {
/**
* 唱歌
* @return 返回结果
*/
String sing();
/**
* 跳舞
* @return 返回结果
*/
String dance();
}
// 接口实现类。也是被代理的类
class LiuDeHua implements Star{
/**
* 唱歌
* @return 返回结果
*/
@Override
public String sing() {
System.out.println("这是:刘德华正在唱《请给我一杯忘情水》");
return "唱完";
}
/**
* 跳舞
* @return 返回结果
*/
@Override
public String dance() {
System.out.println("这是:刘德华正在跳《开心的马骝》");
return "跳完";
}
}
2. spring-boot-starter-actuator 监控
这个可以看到当前服务器的一些状态。但是这个我后面发现并不使用。因为仅可以看到点,而无法看到一个连续的状态。不如其他的监控平台好用。例如pinpiont,就能看到一个时间段相关的信息
稍微介绍下:
使用需要导包:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
在属性文件application.properties声明启用
# 监控actuator 配置
# 默认只有health和info,下面的配置是开启所有节点的监控配置
management.endpoints.web.exposure.include=*
再通过访问
http://localhost:9001/actuator
能够访问各种服务器信息
3. pinpoint
pinpoint是我司使用的监控平台。相对于actuator好用很多。能够看到一段时间机器的数据变化。对应找出生产环境的瓶颈用处很大
客户端使用方式
pinpoint是什么?
一款监控工具,,,,,,
pinpoint客户端配置:
1. 下载pinpoint包:https://static.centanet.com/pinpoint/pinpoint-agent-2.0.3.tar.gz
2. 解压出文件夹pinpoint-agent-2.0.3
3. 修改pinpoint-agent-2.0.3\profiles\release下pinpoint-env.config配置文件
a. (这个配置文件有3个地方:一个是上面那个,还有两个分别在pinpoint-agent-2.0.3\pinpoint.config 和pinpoint-agent-2.0.3\profiles\local\pinpoint-env.config) 其实只改变release下面的配置就可以用了。
b. 修改内容: 1.
i. profiler.transport.grpc.collector.ip=10.69.1.126 ##这个是pinpiont服务器的IP
ii. profiler.collector.ip=10.69.1.126
iii. profiler.sampling.rate=1 ## 1代表100%捕捉请求 20 代表5%捕捉请求
4. 修改程序启动命令:-javaagent:D:\pinpoint-agent-2.0.3\pinpoint-bootstrap-2.0.3.jar -Dpinpoint.agentId=10.104.10.48 -Dpinpoint.applicationName=news_dtt ## 【Dpinpoint.agentId是一个唯一的id,应该可以随便取,我用的是我本机IP。Dpinpoint.applicationName是接入服务器的名字。路径根据自己及其进行修改 到时候怎么再服务器找到 这句话加到idea -Edit Configurations 配置的Environment-VM options里面】
5. 结束
查看效果:这个ip是服务器的地址
进入pinpiont服务端网址,http://10.69.1.126:8079/main/ 找到自己的应用就能看到效果了
4. 对多线程获取远程结果进行了优化
之前虽然也是用了多线程,暗示线程里面干的事情太多了。导致我后序想修改功能得改很多代码。后面进行的优化。线程仅做获取接口内容。其他的任何处理交给其他地方做。
这样设计符合单一职责原则。每个方法只负责处理一件事
5. SpringBoot的启动类
(最近SpringBoot用的比较多,我都忘记很多Spring的配置了。SpringBoot用的还是比较爽的)
package com.deng.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Author: wbdengtt
* @Date: 2020/8/11 9:21
*/
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
6. 《Spring揭秘》阅读
一回想,我已经不记得这本书讲了什么。,,,,,,
7. 《高效能人士的七个习惯》阅读
- 积极主动 : 主动去做一切事情。动用主观能力
- 以终为始:以结果为导向,先想着结果为什么。认可会成功,或者说有验收机制
- 要事第一: 重要的不紧急优先于紧急不重要
- 双赢思维
- 知彼解己
- 统合综效
- 不断更新
从依赖走向独立—从独立走向互赖
8. MyBatis相关知识点阅读
https://download.csdn.net/download/m0_37628958/12787947
9. JVM
10. 利用二级缓存对生产环境进行优化
<!--开启二级缓存-->
<!--缓存 采用先进先出的方式,每120S刷新一次,最多存储256个引用,缓存只读 -->
<cache eviction="FIFO" flushInterval="120000" size="256" readOnly="true"/>
11. MySQL执行计划,权限分配
https://blog.csdn.net/m0_37628958/article/details/108239941
https://blog.csdn.net/m0_37628958/article/details/108236328
12. windows下Redis的安装
https://blog.csdn.net/m0_37628958/article/details/108017262
13. Redis作为二级缓存使用
yml属性文件配置
# Redis配置
redis:
host: 127.0.0.1
port: 6379
导包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
使用方式:在service层的方法上添加@Cacheable(value = "userinfo")
这就是最简单的使用的。比想象中简单很多