B2C网站
一 简介
1.1 分布式基础概念
- 微服务:拒绝大型单体应用,基于业务边界进行服务微化拆分,各个服务独立部署运行。各个微服务进程之间可以用HTTP API通信
1.2 集群&分布式&节点
集群是一个物理形态,分布式是一个工作方式。
只要是一堆机器,就可以叫做集群,但他们是不是一起干活就不知道了;
而分布式系统是若干独立计算机的集合,这些计算机对于用户来说像单个相关系统
分布式:不同业务分布在不同的地方。
集群:几台服务器集中在一起,实现同一业务。
比如对于京东的某个小业务系统一台服务器可能不够,所以部署在多台服务器,
分布式中每一个节点,都可以做集群。但集群不一定就是分布式
节点:集群中的一个服务器
1.3 远程调用
在分布式系统中,各个服务可以在不同主机,但服务之间不可避免的需要互相调用,我们称之为远程调用
springCloud使用HTTP+JSON(跨平台性)完成远程调用;
1.4 负载均衡
比如A服务调用B服务,而B服务在多台机器中存在,A调用任意一个即可。
为了让每台服务器不要太忙或太闲,需要负载均衡的调用每台服务器。
- 常见负载均衡算法:
1)轮询:为第一个请求选择健康池中的第一个后端服务器,然后按顺序往后依次选择,直到最后一个,然后循环。
2)最小连接:优先选择连接数最小,也就是压力最小的服务器,在会话较长的情况下可以考虑这种方式
3)散列:根据请求源的ip地址的散列(hash)选择要转发的服务器,一定尺度长保证特定用户能连接到同一服务器。
1.5 服务注册/发现&注册中心
A服务调用B服务,A服务并不知道B服务当前在哪几台服务器,哪些正常,哪些下线。解决办法就是引入注册中心:
如果某些服务下线,我们其他人可以实时的感知到其他服务的状态,从而避免调用不可用的服务。
1.6 配置中心:用来集中管理微服务的配置信息
每一个服务都有大量的配置,并且每个服务可能部署在多态机器上,我们经常需要变更配置,我们可以让每个服务在配置中心获取自己的配置。
1.7 服务熔断&服务降级
在微服务架构中,微服务之间通过网络进行通信,存在相互依赖,如果其中一个服务不可用时,可能造成雪崩效应。要防止这种情况,必须加入容错机制保护服务。
- 服务熔断:设置服务的超时,但被调用的服务经常失败达到某个阈值,我们可以开启断路保护机制,后来的请求不再去调用这个服务,本地直接返回默认数据
- 服务降级:但系统处于高峰期,系统资源紧张,我们可以让非核心业务降级运行。降级:某些服务不处理,或者简单处理【抛异常,返回null,调用MOck数据,调用Fallback处理逻辑】
1.8 API网关
抽象了微服务中都需要的公共功能,同时提供了客户端负载均衡,服务自动熔断,灰度发布,统一认证,限流流控,日志统计等功能,帮助我们解决api管理难题
二 环境配置
2.1 centos虚拟机
- 安装virtualbox和vagrant
- cmd命令行输入
vagrant init centos/7
vagrant up 启动环境(确保该路径下由vagrant file)
vagrant ssh 连接虚拟机
exit; 退出
vagrant reload 重启
2.2 虚拟机网络设置
在vagrant file中配置ip地址,最后的字段不同即可;
双方都可以ping通对方;
2.3 docker安装
虚拟化容器技术:基于镜像(自动安装)秒级启动各个容器,容器间相互隔离,每个容器都是一个完整的运行环境。
https://docs.docker.com/engine/install/centos/
1)先卸载
sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
2)
$ sudo yum install -y yum-utils
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce docker-ce-cli containerd.io
docker常用命令:
sudo systemctl start docker 启动docker服务
sudo systemctl enable docker 开机自启docker
docker -v
docker images 镜像
docker ps 查看正在运行中的容器
docker restart [name]重启镜像
- 配置docker阿里云镜像加速
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://gxvtiq4e.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2.3安装mysql和redis
sudo docker pull mysql:5.7 从仓库拉取5.7版本;
启动容器:
sudo docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
-p 3306:3306 把容器的3306端口映射到主机的3306;
-v 日志文件夹挂载到主机
-v 数据文件夹挂载到主机
-v 配置文件夹挂载到主机
-e 初始化用户root密码
所以命令容器的3306口需要和虚拟机3306端口映射;
容器内部的sql配置文件挂载到虚拟机,否则每次修改配置文件难道要都进入容器内部的linux环境吗?
修改mysql配置
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysql]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
- 安装redis
docker pull redis;
mkdir -p /mydata/redis/conf
sudo touch /mydata/redis/conf/redis.conf
sudo docker run -p 6379:6379 --name redis -v /mydata/redis/data:/data \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf
配置文件:插入 appendonly yes
进入redis镜像客户端
sudo docker exec -it redis redis-cli
2.4 开发环境配置
maven java vscode配置
2.5 git-ssh配置
2.6 数据库初始化
三 快速开发
3.1 人人前端和后端配置
主要是人人前端,chromedriver报错:
需要执行npm install chromedriver --chromedriver_cdnurl=http://cdn.npm.taobao.org/dist/chromedriver
然后再npm install