# sca_tech2021
**Repository Path**: fafi09/sca_tech2021
## Basic Information
- **Project Name**: sca_tech2021
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-03-29
- **Last Updated**: 2021-07-05
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
wget https://github.com/alibaba/nacos/releases --no-check-certificate
============nancos==============
wget https://github.com/alibaba/nacos/releases/download/1.4.1/nacos-server-1.4.1.tar.gz --no-check-certificate
sh startup.sh -m standalone
http://152.136.122.15:8848/nacos
============jdk==================
rpm -qa |grep java
yum list java*
sudo yum -y install java-1.8.0-openjdk
which java
ls -lrt /usr/bin/java
ls -lrt /etc/alternatives/java
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-1.el7_9.x86_64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
yum install java-devel
==================redis===================
wget http://download.redis.io/releases/redis-6.0.3.tar.gz
tar -zxvf redis-6.0.3.tar.gz
gcc -v
#gcc 4.8.5需要升级
sudo yum -y install centos-release-scl
sudo yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
#临时切换:
scl enable devtoolset-9 bash
#永久切换:
echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
make install
cd src
./redis-server
#关闭服务
./redis-cli shutdown
ps -aux|grep redis
kill -9 xxxx
#把redis.conf 下载到本地进行修改简单方便
#1、更改默认端口
#由port 6379 改为 你自己定义的端口
#2、以后台进程方式启动
#修改daemonize no 为daemonize yes
#3、设置redis远程连接
#(1)、先放行你设置的端口号
#(2)、注释掉bind 127.0.0.1
#(3)、设置redis连接密码:在requirepass foobard改为requirepass mzy1314520
#mzy1314520为设置的密码,这个密码尽量设置复杂些
#4 修改 protect-mode no
tar.gz包提取某个文件
tar ztvf redis-6.0.3.tar.gz |grep redis.conf
tar zxvf redis-6.0.3.tar.gz redis-6.0.3/redis.conf
./redis-server /home/lighthouse/redis-6.0.3/redis.conf
82.156.227.56:6489
152.136.122.15:6379
===================install mysql
sudo rpm -ivh https://repo.mysql.com//mysql57-community-release-el7-11.noarch.rpm
sudo yum install mysql-server
#启动MySQL
systemctl start mysqld.service
#查看MySQL运行状态
systemctl status mysqld.service
#找出密码
grep "password" /var/log/mysqld.log
Z5Cx7k:SrI:A
#登陆
mysql -uroot -p
#修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Fafi_2009';
#开启mysql的远程访问
grant all privileges on *.* to 'root'@'%' identified by 'Fafi_2009' with grant option;
flush privileges;
exit
添加mysql端口3306和Tomcat端口8080
[root@localhost ~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
[root@localhost ~]# firewall-cmd --zone=public --add-port=8080/tcp --permanent
然后再重新载入
[root@localhost ~]# firewall-cmd --reload
==============install seata
1. 下载
> wget https://github.com/seata/seata/releases/download/v1.4.1/seata-server-1.4.1.tar.gz
2. 修改file.conf 如果用nacos-config可以不修改
3. 修改registry.conf
4. 运行脚本nacos-config.sh
5. 后台启动
> nohup ./seata-server.sh --host 152.136.122.15 --port 8091 >log.out 2>1 &
> nohup ./seata-server.sh --host 82.156.227.56 --port 8091 >log.out 2>1 &
6. 启动报错,内存不足
> 将start.sh文件内的虚拟机启动参数xmx,xms参数设小
7. 配置
> 注意tx-service-group名称要和config.txt里面的service.vgroupMapping一样
8. seata-server连接不上
> 云服务器防火墙端口未打开
9. seata参数
> store.db.url中如果db为mysql建议rewriteBatchedStatements=true
---------------------------
--------------install sentinel
1. 下载
> wget https://github.com/alibaba/Sentinel/releases/download/1.8.1/sentinel-dashboard-1.8.1.jar
2. 启动
> nohup java -Dserver.port=8072 -Dcsp.sentinel.dashboard.server=152.136.122.15:8072 -Dcsp.sentinel.api.port=57125 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar &> sentinel.log
访问http://152.136.122.15:8072/
> 最后选择在本地运行,云服务器运行端口不同
> java -Dserver.port=8072 -Dcsp.sentinel.dashboard.server=192.168.8.142:8072 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar
>
3. 问题
> a. sentinelSource的自定义限流失效
> 自定义方法的参数与业务方法的参数不匹配造成的,业务方法参数传有id,自定义的方法中也得传有id。
>[{
"resource": "dealff",
"count": 1,
"grade": 1,
"limitApp": "default",
"strategy": 0,
"controlBehavior": 0
}]
>resource 指定为value ,sentinelSource annotation增加blockhandlerclass
>
>[{
"resource": "/dealf/get/{id}",
"count": 1,
"grade": 1,
"limitApp": "default",
"strategy": 0,
"controlBehavior": 0
}]
>SentinelResource注解的优先级要高于BlockExceptionHandler
>BlockExceptionHandler 上面的resource要配置成 url形式
>
>熔断
> CircuitBreakerStrategy.SLOW_REQUEST_RATIO
### 云服务器 82.156.227.56
1. 先启动nacos,再启动mysql
------------------------------
### gateway
#### 自定义filter
1. 创建类CustomerUrlGatewayFilter实现GatewayFilter
2. 创建类CustomerUrlGatewayFilterFactory
3. 以上类都要注册到spring容器
4. 在yml文件中应用CustomerUrl,必须是类的前缀
#### 整合sentinel
1. 添加依赖
```
com.alibaba.csp
sentinel-spring-cloud-gateway-adapter
1.7.2
```
2. 增加配置yml
```
sentinel:
transport:
port: 57125
dashboard: 192.168.8.142:8072
client-ip: 192.168.8.142
datasource:
ds3:
file:
file: classpath:flowRule.json
data-type: json
rule-type: flow #system authority param-flow
```
3. 增加配置类
> GatewayConfiguration
4. 自定义限流异常处理
``` @Bean
//@Order(-1)
@Order(Ordered.HIGHEST_PRECEDENCE)
public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler(BlockRequestHandler customizeBlockExceptionHandler) {
// Register the block exception handler for Spring Cloud Gateway.
GatewayCallbackManager.setBlockHandler(customizeBlockExceptionHandler);
return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer);
}
```
```
@Bean(name = "customizeBlockExceptionHandler")
public BlockRequestHandler customizeBlockExceptionHandler() {
return new BlockRequestHandler() {
@Override
public Mono handleRequest(ServerWebExchange exchange, Throwable t) {
Map valuemap = new HashMap<>();
valuemap.put("message","服务忙,限流");
return ServerResponse.status(HttpStatus.BAD_GATEWAY)
.contentType(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromValue(valuemap));
}
};
}
```
### druid多数据源配置
1. 在Spring 5.0以后,默认的数据连接池是Hikari
这货的配置参数使用的是jdbc-url,而不是我们平时使用的url
我们在进行配置多数据源的时候可能会报错:jdbcUrl is required with driverClassName
原因就是这个参数名应该使用jdbc-url。或者你可以使用别的连接池
如上面我使用的就是阿里的Druid,我们在构造数据源时可使用:
return DruidDataSourceBuilder.create().build();
也能解决该错误
2. 在mybatis的 sqlsessionfactorybean中把mapper注入进去
3. DataSourceProxy
> http://note.youdao.com/s/SiBXuYLr
---------------------------
### feign配置
1. 出现如下错误:
> Load balancer does not have available server for client
> 解决方法:register-enabled 设置为true 否则feign不拉取服务
>cloud:
nacos:
discovery:
server-addr: 152.136.122.15:8848
register-enabled: true
2. 错误:
> springBoot 启动 If you want an embedded database
> 解决方法:
> 如果启动不需要数据库
> 方案1:@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)//排除自动配置
> 方案2:将pom文件带有数据库相关的删除
---------------------------
### idea同一个服务, 启动多个实例
> 修改app vm options : -Dserver.port=8081
---------------------------
### 添加nacos
1. 添加discovery依赖
org.springframework.cloud
spring-cloud-starter-alibaba-nacos-discovery
2. 在yml文件中配置
> cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
3. 开启
> @EnableDiscoveryClient
# 问题
## mybatis
### 1.@Mapper注解失效,导致service找不到dao,将mybatis.spring.boot.version改为2.1.3
## 测试
### postman
#### 测试create方法出现Required request body is missing
postman选择post body raw json
{
"name":"dfds",
"total":7
}
### nacos
#### 1. java.net.UnknownHostException
> 没有用负载均衡
#### 2. No instances available for
> 服务名写错,复制粘贴变好
>
## 部署
### jar启动 java -jar -Dspring.profiles.active=XXX(配置文件名)(jar包名)
## gateway权限设置成功,测试
1. springsecurity中的oauthtoken取得token
2. teach2021中的gatewayseata插入数据成功
3. 修改了AuthorizationManager中的权限规则
4. 权限的限流也是成功的,flowrule"count": 1 ,改为0