# scf
**Repository Path**: hly_hly/scf
## Basic Information
- **Project Name**: scf
- **Description**: mybatis plus
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-01-30
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# scf
#### 介绍
mybatis plus
#### 软件架构
软件架构说明
#### 安装教程11
1. xxxx
2. xxxx
3. xxxx
#### 使用说明
1. xxxx
2. xxxx
3. xxxx
#### 参与贡献
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request
#### 码云特技
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com)
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目
4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目
5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
# 2020-02-21
## 1.使用openssl生成rsa密钥对
### 1.当使用java api生成rsa密钥对时,公钥以:X.509格式编码,私钥以PKCS#8格式编码
### 2.第一步,生成rsa私钥
1. openssl genrsa -out ../mycerts/20200221/rsa_private_key.pem 2048
生成rsa私钥,文本存储格式,长度2048
../mycerts/20200221/rsa_private_key.pem -> 上级目录的/mycerts/20200221/rsa_private_key.pem文件夹下
### 3.第二步,根据私钥生成公钥
2. openssl rsa -in ../mycerts/20200221/rsa_private_key.pem -pubout -out ../mycerts/20200221/rsa_public_key_2048.pub
根据私钥生成对应的公钥
### 4.第三步,私钥转为pkcs8格式
3. openssl pkcs8 -topk8 -inform PEM -in ../mycerts/20200221/rsa_private_key.pem -outform PEM -nocrypt > ../mycerts/20200221/rsa_private_key_pkcs8.pem
私钥转化成pkcs8格式
## 2.要用到spring cloud的网关和eruka,就要在父工程的,就要
### 1.pom文件中添加springcloud的依赖

```java
org.springframework.cloud
spring-cloud-dependencies
Greenwich.SR1
pom
import
```
### 2.创建eureka微服务
步骤:
1.加依赖
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
2.加配置文件
server:
port: 6868
spring:
application:
name: tensquare-eureka
eureka:
client:
#是否将自己注册到Eureka中,这里就是Eureka自己,不需要注册
register-with-eureka: false
#是否从Eureka中获取信息,这里也不需要
fetch-registry: false
service-url:
defaultZone: http://127.0.0.1:/${server.port}/eureka/
3.写一个引导类启动即可
### 3.修改文章微服务,让文章微服务能注册到eureka中.
1.在文章微服务(目标),中添加eureka的客户端依赖
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
2.修改文章微服务的配置文件,添加eureka的配置信息
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:6868/eureka/
instance:
prefer-ip-address: true
3.在启动类上添加,@EnableEurekaClient注解,即完成
### 4.创建网关微服务,进行参数解密的工作.并将解密后的参数转发到对应的微服务.
1.微服务要想注册到eureka中,就要添加eureka的客户端依赖;网关微服务也要首先引入eureka的客户端依赖;然后引入网关的依赖
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.cloud
spring-cloud-starter-netflix-zuul
2.编写配置文件
server:
port: 9013
spring:
application:
name: tensquare-encrypt
zuul:
routes:
tensquare-article: # 文章
path: /article/** # 配置请求URL的请求规则
serviceId: tensquare-article #指定Eureka注册中心的服务id
strip-prefix: true #所有的article的请求都进行转发
sentiviteHeaders:
customSensitiveHeaders: true #让zuul网关处理cookie和重定向
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:6868/eureka/
instance:
prefer-ip-address: true
# 2020-02-23
## 1.消息通知分类
### 1.全员消息:系统通知
### 2.订阅类消息:微信公众号
### 3.点对点消息:点赞/发红包

## 2.存储id,代表的真实值的写法,是可以这样的

## 3.以后像别人这样,写接口注释的时候,给注释加上数字编号


## 4.通过pathvariable传page/size,通过map接收其他不确定的条件;或者条件所在的实体类接收;实体类可接收一部分属性值,只传递该实体类属性的,其中一个或几个属性,通过@RequestBody,也是可以顺利接收到值的。
## 5.不要忘记配置mybatisplus的包扫描,和分页助手
## 6.创建时间,在后台通过new Date()获取

发布方发一条消息的同时,待推送消息数据库表,就要增加一条数据,用户已读的话,这个待推送消息,就要被清空。
## 7.id值都可以通过url传递,用pathvariable接收,不用封装pagebean

## 8.在数据库设计时,为了提高数据库性能,不保存人物昵称等文字描述类的东西,而是只保存主键id,查询时,把id对应的真实值查出来。
## 9.要使用feign
### 1.引入依赖:openfeign
### 2.添加注解:启动类上@EnableFeignClients,client接口@FeignClient(value = "tensquare-article"),value值为,对应的微服务名
# 2020-02-25
## 1.获取新消息通知的两种模式
1.上线登录后向系统主动索取
2.在线时,系统向接收者主动推送新消息
## 2.微服务整合rabbitmq的步骤
### 1.在对应微服务中,引入rabbitmq的依赖
org.springframework.boot
spring‐boot‐starter‐amqp
### 2.在配置文件中,进行rabbitmq相关的配置
rabbitmq:
host: 192.168.200.128
以上两步即可完成!!
让每一个消息,都有自己的一个队列。
## 3.思路
### 1.创建交换机
### 2.创建队列
### 3.将队列,通过路由键绑定队列(或者解绑)
## 4.io编程与nio编程的区别

1.传统id编程,每个连接创建成功之后,都需要一个线程进行维护,每个线程中包含一个while死循环
用户量较少时,没有问题,创建的线程也少 ;当用户量较多时,就不合适了。1万个连接,就对应着1万个线程
同一时间,有大量的线程处于阻塞状态,是非常严重的资源浪费
2.nio,也叫非阻塞式io;nio中新来一个连接,不在创建一个新的线程,而是可以把这条连接直接绑定到某个固定的线程
然后这条连接所有的读写,都有这条固定的线程进行负责;
## 5.使用while(true){}可实现持续监听或者持续发送消息。
# 2020-02-26
## 1.nio的三大核心组件
### 1.通道channel
是传统io,stream流的升级版,stream是单向的,读写分离(outputstream/inputstream)
channel是双向的,我们即可进行读操作,又能进行写操作
### 2.缓冲buffer
可以理解为一块内存区域,可以写入数据,并且在之后读取他
### 3.选择器selector
选择器可以实现,一个单独的线程,来监控注册在他上面的通道channel,通过一定的选择机制,实现多路复用效果。
## 2.netty封装了jdk的nio,用起来更简单
## 3.使用netty的步骤
### 1.添加netty的依赖
### 2.netty的事件驱动机制,如onclick事件
## 4.整合netty和websocket,使用netty对接websocket实现双向通讯;这一步需要服务端的netty程序,来处理客户端的websocket连接操作。
### 1.引入依赖,netty已经整合了websocket
## 5.整合步骤如下,实际开发也是按照下图所示步骤,进行代码编写

# 2020-02-27
## 1.spring自带的json解析的工具类
import com.fasterxml.jackson.databind.ObjectMapper;
private static ObjectMapper MAPPER = new ObjectMapper();
### 1.具体用法
//约定用户第一次请求携带的数据:{"userId":"1"}
//获取用户请求数据并解析
String json = msg.text();
//解析json数据,获取用户id
String userId = MAPPER.readTree(json).get("userId").asText();
MAPPER又有一个readTree方法,把json字符串传进去,会得到一个jsonnode,
get方法,可根据索引获取,可根据字段名获取
asText,可以拿到string类型的数据
### 2.用法2:
Student student = mapper.readValue(jsonString, Student.class);
是将string串转化为对象
jsonString = mapper.writeValueAsString(student);
是将对象转化为json格式的字符串
## 2.注入rabbitmq的两种方式
### 1.直接注入
@Autowired
private RabbitTemplate rabbitTemplate;
### 2.通过自定义工具类,从spring容器中获取
//从Spring容器中获取RabbitTemplate
//通过ApplicationContextProvider,获取RabbitTemplate
RabbitTemplate rabbitTemplate = ApplicationContextProvider.getApplicationContext()
.getBean(RabbitTemplate.class);
## 3.redis-benchmark,是官方自带的redis性能测试工具,单机redis读写速度非常快,但是对于大型网站是不够的。用来测试redis在当前环境下的性能。
使用语法:
redis‐benchmark [参数] [参数值]
参数说明:
选项 描述 默认值
-h 指定服务器主机名 127.0.0.1
-p 指定服务器端口 6379
-s 指定服务器 socket
-c 指定并发连接数 50
-n 指定请求数 10000
-d 以字节的形式指定 SET/GET 值的数据大小 2
-k 1=keep alive 0=reconnect 1
-r SET/GET/INCR 使用随机 key, SADD 使用随机值
-P 通过管道传输 请求 1
-q 强制退出 redis。仅显示 query/sec 值
--csv 以 CSV 格式输出
-l 生成循环,永久执行测试
-t 仅运行以逗号分隔的测试命令列表。
-I Idle 模式。仅打开 N 个 idle 连接并等待。
## 4.描述系统的高并发能力时,主要通过以下三个方面进行描述:
### 1.响应时间RT
系统对请求做出响应的时间,通常指如下两个时间:
1.指系统所有功能的平均时间
2.所有功能的最大响应时间
### 2.吞吐量TPS
系统在单位时间内处理请求的数量
### 3.每秒查询率QPS
即每秒可以处理的请求数量,一般可达到5万,或者10万

## 5.redis自身已经实现了读写分离,只需要在redis的配置文件中加入如下配置;因为实际环境中,读的操作远远大于写的操作
主库进行写操作,并且可以配置多个从库,进行读的操作。实现了读写分离。
* slaveof host port
* cp -R复制整个文件夹
要准备一个空的,干净的redis,把多余的".rdb"或者".aof"文件都删掉,如下:
### 1复制redis
cd /usr/local/redis/bin
cp bin redis01 ‐R
### 2修改配置
vi redis.conf
修改 port 为 6380
添加 slaveof 192.168.200.129 6379
(修改从库的port端口号:6380,因为主库是6379会冲突
在从库conf文件中,添加:
slaveof 192.168.200.129 6379)
实现,从库可以去找主库,同步数据;
从库,只能读,不能做写操作!!!这样就避免了数据的不一致性,只要保证从库与主库,进行数据同步。
同理,可以配置多个从库,都同步6379这一个主库的数据。就实现了一主多从,一写多读。
### 3清空持久化文件
rm ‐rf dump.rdb
rm ‐rf appendonly.aof
### 4启动
./redis‐server redis.conf
## 6.redis的Sentinel(哨兵),用来解决高可用。
### 1.高可用是分布式系统架构中,必须考虑的因素之一。通过架构设计,减少系统不能提供服务的时间。高可用要遵循以下几点:
1. 尽量避免单点
2. 冗余。设置多台服务器,同时提供服务。
3. 实现自动故障转移。避免人工介入恢复。
### 2.手动实现主从切换。
1. 执行命令,将6380升级为主服务。
slaveof no one
2. 修改6381对应的主服务器,执行命令
slaveof 192.168.200.129 6380
## 7.hashmap是无序的,要想做到先进先出,要使用LinkedHashmap,或treemap
要用 LinkedHashMap 或TreeMap
## 8.改为:0.0.0.0,表示对访问地址不做限制

## 9.sentinel的三大工作任务
### 1.监控
### 2.提醒
### 3.自动故障迁移
## 10.设置redis的密码
### 设置密码
requirepass 123456
### 设置访问主服务器密码
masterauth 123456
还可以通过 bind 127.0.0.1 => bind 0.0.0.0来限制redis的访问ip;或者设置redis的访问密码;增强安全。防止恶意访问。
## 11.在Sentinel哨兵的配置文件sentinel01.conf中添加以下设置:
sentinel auth‐pass mymaster 123456
# 2020-03-01
## 1.sentinel整合springboot步骤
### 1.添加依赖
org.springframework.boot
spring-boot-starter-parent
2.1.4.RELEASE
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-starter-data-redis
### 2.编写配置文件
spring:
redis:
password: 123456
sentinel:
master: mymaster
nodes: 192.168.200.129:26379
# 2020-03-03
## 1.直接访问微服务,与通过网关代理转发到微服务


value = HxServiceList.PROJECT_UCENTER//ucenter/getUser