# 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的依赖 ![](README_files/1.jpg) ```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.点对点消息:点赞/发红包 ![](README_files/2.jpg) ## 2.存储id,代表的真实值的写法,是可以这样的 ![](README_files/3.jpg) ## 3.以后像别人这样,写接口注释的时候,给注释加上数字编号 ![](README_files/4.jpg) ![](README_files/5.jpg) ## 4.通过pathvariable传page/size,通过map接收其他不确定的条件;或者条件所在的实体类接收;实体类可接收一部分属性值,只传递该实体类属性的,其中一个或几个属性,通过@RequestBody,也是可以顺利接收到值的。 ## 5.不要忘记配置mybatisplus的包扫描,和分页助手 ## 6.创建时间,在后台通过new Date()获取 ![](README_files/6.jpg) 发布方发一条消息的同时,待推送消息数据库表,就要增加一条数据,用户已读的话,这个待推送消息,就要被清空。 ## 7.id值都可以通过url传递,用pathvariable接收,不用封装pagebean ![](README_files/7.jpg) ## 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编程的区别 ![](README_files/8.jpg) 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.整合步骤如下,实际开发也是按照下图所示步骤,进行代码编写 ![](README_files/9.jpg) # 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万 ![](README_files/10.jpg) ## 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,表示对访问地址不做限制 ![](README_files/11.jpg) ## 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.直接访问微服务,与通过网关代理转发到微服务 ![](README_files/12.jpg) ![](README_files/13.jpg) value = HxServiceList.PROJECT_UCENTER//ucenter/getUser