尚硅谷——谷粒商城项目开发记录——2021.11.13
概念:
1.微服务:
- 微服务架构风格,就像是把一个单独的应用程序开发为一套小服务,每个小服务运行在自己的进程中,并使用轻量级机制通信,通常是 HTTP API。这些服务围绕业务能力来构建,并通过完全自动化部署机制来独立部署。这些服务使用不同的编程语言书写,以及不同数据 存储技术,并保持最低限度的集中式管理。
- 简而言之:拒绝大型单体应用,基于业务边界进行服务微化拆分,各个服务独立部署运行。
2.集群&分布式&节点:
- 集群是个物理形态,分布式是个工作方式。
- 只要是一堆机器,就可以叫集群,他们是不是一起协作着干活,这个谁也不知道;
- 分布式是指将不同的业务分布在不同的地方。
- 集群指的是将几台服务器集中在一起,实现同一业务。
- 分布式中的每一个节点,都可以做集群。 而集群并不一定就是分布式的。
- 节点:集群中的一个服务器
3.远程调用:
- 在分布式系统中,各个服务可能处于不同主机,但是服务之间不可避免的需要互相调用,我们称为远程调用。
- SpringCloud 中使用 HTTP+JSON 的方式完成远程调用
4.负载均衡:
- 分布式系统中,A服务需要调用B服务,B服务在多台机器中都存在,A调用任意一个服务器均可完成功能。
- 为了使每一个服务器都不要太忙或者太闲,我们可以负载均衡的调用每一个服务器,提升网站的健壮性。
- 常见的负载均衡算法:
- 轮询:
- 为第一个请求选择健康池中的第一个后端服务器,然后按顺序往后依次选择,直到最后一个,然后循环。
- 最小连接:
- 优先选择连接数最少,也就是压力最小的后端服务器,在会话较长的情况下
可以考虑采取这种方式。
- 优先选择连接数最少,也就是压力最小的后端服务器,在会话较长的情况下
- 散列:
- 根据请求源的IP的散列(hash)来选择要转发的服务器。这种方式可以一定程度上保证特定用户能连接到相同的服务器。如果你的应用需要处理状态而要求用户能连接到和之前相同的服务器,可以考虑采取这种方式。
- 根据请求源的IP的散列(hash)来选择要转发的服务器。这种方式可以一定程度上保证特定用户能连接到相同的服务器。如果你的应用需要处理状态而要求用户能连接到和之前相同的服务器,可以考虑采取这种方式。
- 轮询:
5.服务注册/发现&注册中心:
- A服务调用B服务,A服务并不知道B服务当前在哪几台服务器有,哪些正常的,哪些服务已经下线。
- 解决这个问题可以引入注册中心;如果某些服务下线,我们其他人可以实时的感知到其他服务的状态,从而避免调用不可用的服务。
6.配置中心:
- 每一个服务最终都有大量的配置,并且每个服务都可能部署在多台机器上。我们经常需要变更配置,我们可以让每个服务在配置中心获取自己的配置。
- 配置中心用来集中管理微服务的配置信息
7.服务熔断&服务降级:
- 在微服务架构中,微服务之间通过网络进行通信,存在相互依赖,当其中一个服务不可用时,配置中心用来集中管理微服务的配置信息有可能会造成雪崩效应。要防止这样的情况,必须要有容错机制来保护服务。
- 服务熔断:
- 设置服务的超时,当被调用的服务经常失败到达某个阈值,我们可以开启断路保护机制,后来的请求不再去调用这个服务。本地直接返回默认的数据
- 服务降级:
- 在运维期间,当系统处于高峰期,系统资源紧张,我们可以让非核心业务降级运行。
- 降级:
- 某些服务不处理,或者简单处理【抛异常、返回 NULL、调用 Mock 数据、调用 Fallback 处理逻辑】。
- 某些服务不处理,或者简单处理【抛异常、返回 NULL、调用 Mock 数据、调用 Fallback 处理逻辑】。
8.API 网关:
- 在微服务架构中,API Gateway 作为整体架构的重要组件,它抽象了微服务中都需要的公共功能,同时提供了客户端负载均衡,服务自动熔断,灰度发布,统一认证,限流流控,日志统计等丰富的功能,帮助我们解决很多 API 管理难题。
9.项目组件和服务:
10.配置虚拟机环境VMware
-
安装CentOS7.0:
-
找到下载的镜像站:
- https://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso
-
下载系统镜像
-
打开VMware -> 新建虚拟机(典型) -> 稍后安装操作系统 -> 客户机操作系统选择Linux -> 版本选择Read Hat Enterprise Linux 7 64位 -> 分配CPU(本机的一半) -> 分配硬盘(推荐20G) -> 分配内存(推荐2G) -> 挂载iso镜像文件
-
启动虚拟机,并安装CentOS7.0
-
软件选择 -> 安装GNOME桌面 -> 选择开发工具、传统Windows的兼容性、开发工具三个选项
-
安装位置 -> 手动配置分区 -> /boot分区(设备类型选择标准分区,文件系统选择ext4) -> swap分区(设备类型选择标准分区,文件系统swap) -> /根分区(设备类型选择标准分区,文件系统选择ext4)
-
设置root用户名和密码
-
新建一个xxx(非管理员)用户,设置密码
-
等待安装完成,重启
-
配置语言和输入法
-
配置固定ip地址
- ifconfig -> 找到网络配置文件 -> 输入自定义的固定的ip地址
#设置ip地址 IPADDR=x.x.x.x #网关 GATEWAY=x.x.x.x #域名解析器 DNS1=x.x.x.x
-
重启服务:
- service network restart
11.Docker
- Docker安装MySQL5.7
- 打开镜像官网:
- 找到标签(Tags):
- 注意:如果需要的版本没有标签,则拉下来的镜像可能有问题
- 卸载镜像的方法(仅供参考):
- 用 docker pull mysql:5.7 命令下载镜像
- 创建实例并启动:
docker run -p 3306:3306 --name mysql \ > -e MYSQL_ROOT_PASSWORD=root \ > -v /mydata/mysql/log:/var/log/mysql \ > -v /mydata/mysql/data:/var/lib/mysql \ > -v /mydata/mysql/conf:/etc/mysql \ > -d mysql:5.7
- 参数说明:
- -p 3306:3306:
- 将容器的 3306 端口映射到主机的 3306 端口
- -v /mydata/mysql/conf:/etc/mysql:
- 将配置文件夹挂载到主机
- -v /mydata/mysql/log:/var/log/mysql:
- 将日志文件夹挂载到主机
- -v /mydata/mysql/data:/var/lib/mysql/:
- 将配置文件夹挂载到主机
- -e MYSQL_ROOT_PASSWORD=root:
- 初始化 root 用户的密码
- -p 3306:3306:
- 用docker logs mysql命令查看日志,可查看报错信息
- 用docker exec -it mysql /bin/bash命令进入容器文件系统
- 用ls -l命令查看完整的目录
- 用whereis mysql查看与MySQL相关的目录(验证MySQL是一个完整的容器)
- 用exit命令退出容器
- 修改MySQL的配置文件
# 打开配置文件 vim /mydata/mysql/conf/my.cnf # 以下是修改的配置 [client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] 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 # 重启docker容器 docker restart mysql
- 注意: 解决MySQL连接慢的问题
- 在配置文件中加入如下,并重启 mysql
[mysqld] skip-name-resolve
- 解释:
- skip-name-resolve: 跳过域名解析
- 在配置文件中加入如下,并重启 mysql
- 通过容器的 mysql 命令行工具连接
docker exec -it mysql mysql -uroot -proot
- 设置 root 远程访问
grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option; flush privileges;
-