Linux 一些命令


categories: linux

Linux 一些命令

jar 重命名

1
rename jar jar.back xx.jar

查看防火墙状态

1
systemctl status  firewalld
1
service firewalld stop
1
firewall-cmd --permanent --add-port=3306/tcp

# 查询端口是否开放

1
firewall-cmd --query-port=3306/tcp

#重启防火墙(修改配置后要重启防火墙)

1
firewall-cmd --reload

查看centos版本

1
cat /etc/centos-release

该目录是系统是可执行二进制文件的默认目录 /usr/local/bin/

如果需要命令将直接在控制台使用 可以 建立个软链接

如下 :

1
ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/
1
update user set host = '%' where user = 'root';
1
flush privileges;

masterha_check_ssh -conf=/etc/mha_master/mha.cnf

masterha_check_repl –conf==/etc/mha_master/mha.cnf

1
2
3
4
5
6
ssh-keygen
cd ~
cd .ssh/
cat id_rsa.pub

ssh-copy-id username@host

查看 java 进程 占用的端口

1
netstat -anp|grep java

change master to master_host=’39.106.214.114’,master_port=3306,master_user=’root’,master_password=’root’,master_log_file=’mysql-bin.000014’,master_log_pos=154;

start slave;
STOP SLAVE;
show slave status

INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;

show VARIABLES LIKE ‘%semi%’

set GLOBAL rpl_semi_sync_slave_enabled=1

change master to master_host=’39.106.214.114’,master_port=3306,master_user=’root’,master_password=’root’,master_log_file=’mysql-bin.000016’,master_log_pos=759;

start slave;
STOP SLAVE;

slave reset;

INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;

show VARIABLES LIKE ‘%semi%’

set GLOBAL rpl_semi_sync_slave_enabled=1

//批量替换文件中的内容
sed -i “s/查找字段/替换字段/g” grep 查找字段 -rl 路径 文件名
示例:sed -i “s/shan/hua/g” lishan.txt
把当前目录下lishan.txt里的shan都替换为hua

Spring Cloud Alibaba 学习笔记

​ Spring Cloud Alibaba 学习笔记

第⼀代 Spring Cloud (主要是 SCN)很多组件已经进⼊停更维护模式。

Spring Cloud:Netflflix,Spring官⽅,SCA(被Spring官⽅认可)

注意:市场上主要使⽤的还是SCN,SCA⼀套框架的集合。

Alibaba 更进⼀步,搞出了Spring Cloud Alibaba(SCA),SCA 是由⼀些阿⾥巴巴的开源组件和云产品组成的,2018年,Spring Cloud Alibaba 正式⼊住了 SpringCloud 官⽅孵化器。

各个组件

Nacos(服务注册中⼼、配置中⼼)

Sentinel哨兵(服务的熔断、限流等)

Dubbo RPC/LB

Seata分布式事务解决⽅案

SpringCloudAlibaba 编程题

##  SpringCloudAlibaba 编程题 ## 

1 、提供资料:代码工程、验证及讲解视频。

2、讲解内容包含:题目分析、实现思路、代码讲解。

3、效果展示:

1)Eureka注册中心 替换为 Nacos注册中心

2)Config+Bus配置中心 替换为 Nacos配置中心

3)Feign调用 替换为 Dubbo RPC调用

4)使用Sentinel对GateWay网关的入口资源进行限流(限流参数自定义并完成测试即可)

作业效果同springcloud1

​ 接下来 展示效果

  1. 先看Nacos 注册的服务列表

    image-20201204100918828

说明服务已经注册成功。

  1. 在看Nacos 中 GateWay 的配置信息

image-20201204101223335

GateWay的成功启动说明已经从Nacos中拿到配置信息了。

  1. 接下来显示页面操作

image-20201204101613688

image-20201204101627304

  1. 在Sentinel Dashboard 中配置流控规则 如下图 说明 (配置Gateway 和具体服务的菜单会有不同 ,网关会显示下面箭头的部分)

image-20201204101825430

image-20201204102044478

可以配置两种类型的api 一种是整个服务 一种对接口

我们对已api/user 为前缀的接口进行流控

image-20201204102404149

这个页面会调用 api/user/info 这个接口 在没有添加流控规则多次刷新页面正常拿到数据。

  1. 添加流控规则

image-20201204102627667

image-20201204102708740

说明 每秒超过1个QPS 会进行60s的快速失败。

image-20201204102838188

页面显示限流信息 成功。

整体思路 : 根据需要依赖进行整合SpringCloudAlibaba 。

Spring Cloud 学习笔记

Spring Cloud 学习笔记

微服务架构

SpringCloud 简称 SCN

各个组件说明

  • 1 Eureka 注册中心

  • 2 Ribbon 负载均衡

  • 3 Hystrix 熔断保护

  • 4 Feign 远程调用

  • 5 GateWay 网关

  • 6 Config 配置中心

  • 7 Stream 消息驱动组件

    总结:各个组件组成一个体系 构成了SpringCloud 体系。

SpringCloud 作业编程题

​ SpringCloud 作业编程题

整体架构如下图:

实现效果如下:

接下来(Show Time

效果如下

首先先准备配置项

  • 1 将 本地Host www.test.com 指向本地 (说明 防止静态页面访问跨域)
  • 2 启动需要的项目 效果如下:

image-20201127160519706

  • 3 接下来 访问静态页面 测试

image-20201127160756723

当输入不存在邮箱时 弹窗提示

image-20201127160910249

进入注册页面

image-20201127161128142

收到邮箱验证码

image-20201127161455123

输入错误的验证码

image-20201127161522896

输入正确的验证码 提示并跳转登录界面

image-20201127161557408

登录界面输入错误的密码时

image-20201127161728051

登录界面输入正确的密码时

image-20201127161815852

接下来 看看 ip暴力测试

​ 码云的配置1分钟 限制3次

image-20201127162115878

image-20201127162126670

页面显示 请求拒绝 成功!

整体思路: 其实是在原来基础上进行增加 对应的操作 实现逻辑。

Dubbo介绍

Dubbo 学习笔记

Dubbo介绍

官网参考资料

什么是Dubbo

Apache Dubbo是 一款高性能的Java RPC框架。其前身是阿里巴巴公司开源的一个高性能、轻量级的开源Java RPC框架,可以和Spring框架无缝集成。

Dubbo特性

  • 面向接口代理的高性能RPC调用

  • 智能负载均衡

  • 服务自动注册和发现

  • 高度可扩展能力 SPI

  • 可视化服务治理与运维

    Dubbo处理流程

下载

图解:

节点 描述
Provider 服务提供者
Consumer 服务消费者
Registry 服务注册与发现的注册中心
Monitor 监控中心,统计服务调用次数调用时间
Container 服务运行容器,负责启动加载运行生产者
线条 描述
蓝色虚线 服务启动后的初始化过程
红色虚线 异步过程
红色实现 同步调用过程

Dubbo高级进阶

扩展点配置 SPI

SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。

目前有不少框架用它来做服务的扩展发现,简单来说,它就是一种动态替换发现的机制。

使用SPI机制的优势是实现解耦,使得第三方服务模块的装配控制逻辑与调用者的业务代码分离。

JDK-SPI

Java中如果想要使用SPI功能,先提供标准服务接口,然后再提供相关接口实现和调用者。这样就可以通过SPI机制中约定好的信息进行查询相应的接口实现。

SPI遵循如下约定:

  1. 当服务提供者提供了接口的一种具体实现后,在META-INF/services目录下创建一个以“接口全限定名”为命名的文件,内容为实现类的全限定名;

  2. 接口实现类所在的jar包放在主程序的classpath中;

  3. 主程序通过java.util.ServiceLoader动态装载实现模块。

    它通过扫描META-INF/services目录下的配置文件找到实现类的全限定名,把类加载到JVM;

  4. SPI的实现类必须携带一个无参构造方法

扩展点-Dubbo中的SPI

来源

Dubbo 的扩展点加载从 JDK 标准的 SPI (Service Provider Interface) 扩展点发现机制加强而来。

Dubbo 改进了 JDK 标准的 SPI 的以下问题:

  • JDK 标准的 SPI 会一次性实例化扩展点所有实现,如果有扩展实现初始化很耗时,但如果没用上也加载,会很浪费资源。
  • 如果扩展点加载失败,连扩展点的名称都拿不到了。比如:JDK 标准的 ScriptEngine,通过getName() 获取脚本类型的名称,但如果 RubyScriptEngine 因为所依赖的 jruby.jar 不存在,导致 RubyScriptEngine 类加载失败,这个失败原因被吃掉了,和 ruby 对应不起来,当用户执行 ruby 脚本时,会报不支持 ruby,而不是真正失败的原因。
  • 增加了对扩展点 IoC 和 AOP 的支持,一个扩展点可以直接 setter 注入其它扩展点。
约定
  1. 当服务提供者提供了接口的一种具体实现后,在`META-INF/dubbo/目录下创建一个以“接口全限定名”为命名的文件,内容为实现类的全限定名
  2. 内容为:配置名=扩展实现类全限定名,多个实现类用换行符分隔

Dubbo习题说明


categories: 习题

Dubbo编程题      

项目结构说明

  • dubbo-web 测试Consumer
  • dubbo-server-monitor TP90 TP99性能监听Filter
  • dubbo_spi_filter IP透传Filter
  • service-api 通用RPC接口
  • service-provider 服务端
  • service-provider-1 服务端1号

编程题一:将Web请求IP透传到Dubbo服务中

先看 实现效果 上图

image-20201111171252402

image-20201111171314121

image-20201111171343847 实现步骤:

1、service-api 中定义RPC测试接口 HelloService#sayHello方法

2、采用不同配置端口实现启动两个Dubbo服务端

3、dubbo_spi_filter 利用dubbo的spi机制定义Filter,从RPCContext中读取Consumer中传递的IP,两个Dubbo服务端皆依赖该模块 TransportIPFilter

服务端

1
2
3
4
5
6
7
8
9
10
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
String ip = RpcContext.getContext().getAttachment("IP");
if(StringUtils.isNoneBlank(ip)){
log.info("当前请求IP:{}",ip);
}
// 执行方法
return invoker.invoke(invocation);

}

客户端image-20201111171512526

编程题二:简易版Dubbo方法级性能监控

测试结果 (5秒钟打印一次记录)

image-20201111172954789

实现步骤

1、 server-api定义了RPC接口,接口中定义了三个方法

  • HelloService#sayHello
  • HelloService#sayHello1
  • HelloService#sayHello2

2 、 server-provider 中提供Dubbo服务实现api中定义的HelloService接口

3 、 dubbo-server-monitor中定义Filter拦截RPC请求并将请求时间(KEY)和请求耗时(VALUE)存储到Map中 核心代码: TPMonitor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
@Slf4j
public class TPMonitor implements Runnable{

public static final long VALID_TIME = 1000*60;
private Map<Long, Long> useTimeMaps= new ConcurrentHashMap<>();

// 对外暴露调用接口存储耗时
public void request(Long requestTime,Long useTime){
useTimeMaps.put(requestTime,useTime);
}

// 清除过期数据
private void clearOld(){
long valid = System.currentTimeMillis()-VALID_TIME;
Set<Long> requestTimes = useTimeMaps.keySet();
for (Long r:requestTimes){
if(r<valid){
useTimeMaps.remove(r);
}
}
}

@Override
public void run() {
while (true){
try {
Thread.sleep(5000);
// 执行前先清除过期数据
clearOld();
final Map<Long,Long> temp = Maps.newHashMap(useTimeMaps);
int total = temp.size();
if (total == 0){
continue;
}
int tp90 = (int) (total*0.9);
int tp99 = (int) (total*0.99);
final Collection<Long> requestTimes = temp.values();

Object[] sortedRequestTimes = requestTimes.stream().sorted().toArray();
log.info("=====>>>>> tp90:{}ms",sortedRequestTimes[tp90]);
log.info("=====>>>>> tp99:{}ms",sortedRequestTimes[tp99]);
} catch (Exception e) {
e.printStackTrace();
}
}

}
}

TPMonitorFilter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

private final TPMonitor tpMonitor = new TPMonitor();

//注意此构造必须是公有的 不然 拦截器会失效
public TPMonitorFilter() {
ExecutorService executorService = Executors.newFixedThreadPool(1);
executorService.submit(tpMonitor);
}

@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
log.info("请求过来了----------");
long start = System.currentTimeMillis();
Result result = invoker.invoke(invocation);
long useTime = System.currentTimeMillis() - start;
tpMonitor.request(System.currentTimeMillis(), useTime);
return result;

}

Zookeeper

Zookeeper

1 定义

它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。

2 结构

1、文件系统

Zookeeper维护一个类似文件系统的数据结构:

201807121434154

每个子目录项如 NameService 都被称作为 znode(目录节点),和文件系统一样,我们能够自由的增加、删除znode,在一个znode下增加、删除子znode,唯一的不同在于znode是可以存储数据的

  • PERSISTENT-持久化目录节点

    客户端与zookeeper断开连接后,该节点依旧存在

  • PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点

    客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号

  • EPHEMERAL-临时目录节点

    客户端与zookeeper断开连接后,该节点被删除

  • EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点

    客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

2、 监听通知机制

客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。

img

基于netty 实现自定义RPC

​ 基于netty 实现自定义RPC

1.ConsumerBoot类: 启动客户端,并调用ConsumerBoot.createProxy()方法

2.RPCConsumer类: 初始化客户端配置,并加入UserClientHandler客户端处理器,并生成代理对象执行sayHello()方法,即发送请求, 实际是交给UserClientHandler处理,主要有以下几步: (1)执行channelActive()方法,创建事件处理器上下文对象; (2)执行setParam()方法,设置请求对象,作为传递参数; (3)执行call()方法,将客户端数据写到服务端; …服务端处理… (4)执行channelRead(),获得服务端返回数据;

3.RpcProviderApplication类: 启动服务端,并把需要的组件加载到spring容器中,初始化调用NettyServer.startServer()方法

4.NettyServer类: 初始化服务端配置,并加入UserServiceHandler服务端处理器,当监听到客户端有数据写入时, UserServiceHandler服务端处理器进行处理,主要有以下几步: (1)执行channelRead()方法,这里使用CGLIB动态代理生成服务端代理对象,并执行请求对象中要执行的方法, 实际执行的是由UserServiceImpl实现类处理; (2)UserServiceImpl实现类执行sayHello()方法,返回”success”;

效果如下

image-20201019133638037

关键过程:(服务端)

image-20201019134021209

image-20201019134137663

image-20201019134154823

(客户端)

image-20201019134238399

image-20201019134259294

image-20201019134323332

分布式调度

分布式调度

含义:

  1. 运行在分布式集群环境下的调度任务(同一个定时任务程序部署多份,只应该有一个定时任务在执行)
  2. 分布式调度一>定时任务的分布式一>定时任务的拆分(即为把一个大的作业任务拆分为多个小的作
    任务,同时执行)

image-20201010142035844

定时任务和消息队列的区别

  1. 共同点:

    异步处理
    比如注册、下单事件
    应用解耦
    不管定时任务作业还是MQ都可以作为两个应用之间的齿轮实现应用解耦,这个齿轮可以中转
    数据,当然单体服务不需要考虑这些,服务拆分的时候往往都会考虑
    流量削峰
    双十一的时候,任务作业和MQ都可以用来扛流量,后端系统根据服务能力定时处理订单或者
    从MQ抓取订单抓取到一个订单到来事件的话触发处理,对于前端用户来说看到的结果是已经
    单成功了,下单是不受任何影响的。

  2. 本质不同
    定时任务作业是时间驱动,而MQ是事件驱动
    时间驱动是不可代替的,比如金融系统每日的利息结算,不是说利息来一条(利息到来事件)就算
    而往往是通过定时任务批量计算
    所以,定时任务作业更倾向于批处理,MQ傾向于逐条处理

分布式调度框架 Elastic-Job

Elastic-Job是当当网在2015年开源的一个分布式调度解决方案,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。在这里,主要对Elastic-Job-Lite技术做分析

null

如上图所示,elastic-job-lite通过zk实现各服务的注册、控制及协调:

  • 第一台服务器上线触发主服务器选举。主服务器一旦下线,则重新触发选举,选举过程中阻塞,只有主服务器选举完成,才会执行其他任务。
  • 某服务节点(引入elastic-job-lite-jar包)上线时会自动将服务器信息注册到注册中心,下线时会自动更新服务器状态。
  • 主节点选举,服务器上下线,分片总数变更均更新重新分片标记。
  • 定时任务触发时,如需重新分片,则通过主服务器分片,分片过程中阻塞,分片结束后才可执行任务。如分片过程中主服务器下线,则先选举主服务器,再分片。
  • 通过上一项说明可知,为了维持作业运行时的稳定性,运行过程中只会标记分片状态,不会重新分片。分片仅可能发生在下次任务触发前。
  • 每次分片都会按服务器IP排序,保证分片结果不会产生较大波动。
  • 实现失效转移功能,在某台服务器执行完毕后主动抓取未分配的分片,并且在某台服务器下线后主动寻找可用的服务器执行任务

调度问题的复杂性

  • 弹性扩容
    每个业务服务节点同时也是一个定时任务执行者, 各任务执行者之间不会直接通信,而是通过zookeeper协调, 定时任务状态存储在zk, 去中心化部署。
    因此可以很方便地增加或者减少服务节点。

  • 失效转移
    如果在任务执行过程中有一个执行实例挂了,那么之前被分配到这个实例的任务(或者分片)会在下次任务执行之前被重新分配到其他正常节点实例上执行。

  • 任务分片
    elastic-job-lite并不直接提供数据处理的功能,框架只会将分片项分配至各个运行中的服务节点,开发者需要自行处理分片项与真实数据的对应关系。