RabbitMQ初步学习
服务异步通讯(RabbitMQ)
性能下降,吞吐量下降
实际操作
RabbitMQ安装
导入tar包
启动容器
docker run \-e RABBITMQ_DEFAULT_USER=itcast \ 这是用户名-e RABBITMQ_DEFAULT_PASS=123321 \ 用户密码--name mq \ 容器名--hostname mq1 \ 主机名,集群部署的时候需要-p 15672:15672 \ 注册中心-p 5672:5672 \ 消息处理端口-d \rabbitmq:3-management
访问 192.168.81.131:15672
成功
实际操作
定义多个消费者,从而避免消息的堆积
实践开始
Work Queue 一个队列绑定多个消费者
Publisher
在1s内发送50条消息,每条消息间隔20ms避免消息发送过快
Consumer
定义了2个消费者,这2个消费者都从同一个消费队列simple.queue中拿取消息, ...
Docker基本概念
Docker
微服务的模块非常多,部署起来非常麻烦,Docker可以解决这个问题
Docker的定义
DockerFile内容
最后的 . 表示dockerfile所在的目录
构建中
构建完成
成功访问
DockerCompose 基于Compose文件进行一个集群的构建
docker-compose命令中的参数 up 代表创建并且初始化容器
使用docker-compose up -d 一键构建并且部署容器
搭建图形化docker镜像仓库
使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:
version: '3.0'services: registry: image: registry volumes: - ./registry-data:/var/lib/registry ui: image: joxit/docker-registry-ui:static ports: - 8080:80 ...
分布式注册中心和服务通信
Ribbon的加载策略
饥饿加载
初次部署微服务后,第一次访问的时候,请求的周期会较长
第一次获取数据响应时间高达546ms
第二次只需要20ms
这种现象的原因是因为riobbon的懒加载机制
Nacos
首先需要导入依赖
其中父工程的依赖是为了管理子工程的依赖的版本
然后需要修改配置文件
部署成功
这样配置实现集群的划分
一切配置就绪,但是我本地上运行的时候出现了一些问题
报错 No instances available for userservice
检查错误原因
Nacos确实获取到了注册的信息,ResrTemplate也确实加入了LoadBalance注解
http://ip:8848/nacos/v1/ns/instance/list?serviceName=user-service使用该开放api访问发现cluster为空
检查发现Nacos中服务的Ip地址不是localhost/127.0.0.1,服务注册的ip使用了VMware的虚拟网络,相当于多块网卡,在进行服务注册时候,选中了VMware虚拟网络。
这个地址是我虚拟机的虚拟网卡地 ...
微服务技术栈
微服务技术栈
自动部署(持续集成)
完整的微服务技术栈
微服务本质是分布式架构方案的一种,旨在实现项目各个模块的高内聚低耦合,降低服务之间的影响,避免出现集群故障
可以通过RestTemplate来实现跨服务的远程调用(实际上就是发起一次远程的http请求)
一个服务既可以是提供者,也可以是消费者,一个服务,相对于不同服务,角色会发生变化
Eureka注册中心
编写Application启动类
编写配置文件
负载均衡
解耦合
Ribbon负载均衡
负载均衡原理
调整负载均衡策略
第一种调整方式是针对全体微服务
第二种调整方式是针对某个微服务
Java基础(一)
数据存储Java程序运行期间,有5个地方可以存储数据
寄存器:速度最快,Java没有直接控制器,根据需求进行分配
栈内存:存在于常规内存RAM中,仅次于寄存器,Java必须知道存在于栈内存中数据的生命周期,通常用于存储一些数据的引用(对象引用)
堆内存:通用的内存池,存在于RAM中,所有的Java对象都存在其中。Java不知道数据必须在堆内存中停留多长的时间,用new实例化对象的时候,会自动在堆中分配(分配与清理堆内存要比栈花费更多的时间)
常量存储:存在于程序代码中,如果需要严格保护,可以存在于ROM中
非RAM存储:数据完全存在于程序之外,在程序未运行或者脱离程序控制后依然存在。例子:① 序列化对象。② 持久化对象 。这种存储方式将对象存放于另一个介质中,并在需要时恢复成常规的,基于RAM的对象。Java 为轻量级持久化提供了支持。而诸如 JDBC 和 Hibernate 这些类库为使用数据库存储和检索对象信息提供了更复杂的支持。
基本类型存储基本类型不通过new来创建,而是使用一个自动的变量值,这个变量自动存储值,并且置于栈内存中。
基本类型
大小
最小值
最大值
包装 ...
Simply MVC FrameWork
使用反射简单模拟MVC对请求的处理过程
@WebServlet("/")public class DispatcherServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); resp.setContentType("application/json;charset=utf-8"); String path = req.getServletPath(); System.out.println("path:"+p ...
Java8新特性
Lambda表达式Lambda 表达式,也可称为闭包
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)
使用 Lambda 表达式可以使代码变的更加简洁紧凑
语法
(parameters) -> expression或者(parameters) -> { statements }
重要特征
可选类型声明:不需要声明参数类型,编译器可以统一识别参数值
可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号
可选的大括号:如果主体包含了一个语句,就不需要使用大括号
可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值
// 1. 不需要参数,返回值为 5 () -> 5 // 2. 接收一个参数(数字类型),返回其2倍的值 x -> 2 * x // 3. 接受2个参数(数字),并返回他们的差值 (x, y) -> x – y // 4. 接收2个int型整数,返回他们的和 (int x, int y) -> x + y ...
Redis(三)
Redis.conf 详解启动的时候,就通过配置文件启动
行家有没有,出手就知道
单位
配置文件表示unit单位,对于大小写不敏感
包含
可以用来添加redis的配置文件
网络配置
bind 127.0.0.1 绑定的ip目前运行本机访问,可以设置其他ip来允许其他访问
保护模式
端口设置
通用配置GENERAL
以守护进程的模式运行,默认是no 需要设置为yes
如果以守护进程(后台)运行,就需要设置一个pid文件
日志级别
notice是生产环境使用
logfile 生成的日志文件名,需要手动配置
默认数据库的数量 默认 16个数据库
always-show-logo 是否显示logo
快照
在规定的时间内,执行了多少次操作,则会持久化到文件.rdb .aof
redis是内存数据库,如果没有持久化,那么数据断电即失
如果 3600s 之类,修改了一个key 300s内 修改了100个key 60s内,修改了10000个key 就进行持久化
持久化出错了,是否还继续工作
是否压缩rdb文件,需要消化一些cpu的资源
保存rdb的时候,进行错误的校验
r ...
Redis(2)
SpringBoot整合RedisSpringBoot操作数据层:Spring-data jpa jdbc mongodb redis!!!
说明:在SpringBoot2.x之后,原来使用的jedis被替换为了lettuce?
jedis:采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全,使用Jedis pool连接池! BIO
lettuce:采用netty,实例可以在多个线程中进行共享,不存在线程不安全的情况!可以减少线程数据了,更像NIO模式
SpringBoot所有的配置类都有一个自动配置类,自动配置类都会绑定一个properties 配置文件
源码分析
@Bean @ConditionalOnMissingBean( name = {"redisTemplate"} ) public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws Unkno ...
SpringBoot中Controller层的传参及用法
GET请求传参
GET请求传参都是通过在url之后拼接进行传参的吗,在请求的路径后面?表示参数 ,多个参数用&进行连接,参数采取键值对的形式 eg name=zhangsan&age=18
对应的方法的参数
可以直接使用与路径参数相同的变量名来接收参数 (String name, Interage age)
可以使用一个javabean来接受参数,要求javabean里面的属性名必须要和参数名相同,并且要有get和set方法,属性的类型要使用包装类,不要使用基本数据类型,会出现一些不必要的错误,比如使用boolean的时候,如果不传入参数,会导致对应属性的默认值为false,而不是null,在配合数据库的默认值的时候会导致,对应字段默认变为false
可以使用@RequestParam(value = “参数字段名”,required = false/true,defaultValue = “”) 来灵活的接收参数
POST与其他请求传参
使用JSON来传参,使用对应的实体类来接收参数,请求头需要有Con ...