nacos基础
微服务介绍
系统架构演变
随着互联网的发展,网站应用的规模也在不断的扩大,进而导致系统架构也在不断的进行变化。 从互联网早起到现在,系统架构大体经历了下面几个过程: 单体应用架构--->垂直应用架构--->分布 式架构--->SOA架构--->微服务架构,当然还有悄然兴起的Service Mesh(服务网格化)。 接下来我们就来了解一下每种系统架构是什么样子的, 以及各有什么优缺点。
单体应用架构
互联网早期,一般的网站应用流量较小,只需一个应用,将所有功能代码都部署在一起就可以,这 样可以减少开发、部署和维护的成本。 比如说一个电商系统,里面会包含很多用户管理,商品管理,订单管理,物流管理等等很多模块, 我们会把它们做成一个web项目,然后部署到一台tomcat服务器上。
优点:
-
项目架构简单,小型项目的话, 开发成本低
-
项目部署在一个节点上, 维护方便
缺点:
-
全部功能集成在一个工程中,对于大型项目来讲不易开发和维护
-
项目模块之间紧密耦合,单点容错率低
-
无法针对不同模块进行针对性优化和水平扩展
垂直应用架构
随着访问量的逐渐增大,单一应用只能依靠增加节点来应对,但是这时候会发现并不是所有的模块 都会有比较大的访问量. 还是以上面的电商为例子, 用户访问量的增加可能影响的只是用户和订单模块, 但是对消息模块 的影响就比较小. 那么此时我们希望只多增加几个订单模块, 而不增加消息模块. 此时单体应用就做不 到了, 垂直应用就应运而生了. 所谓的垂直应用架构,就是将原来的一个应用拆成互不相干的几个应用,以提升效率。比如我们可 以将上面电商的单体应用拆分成:
-
电商系统(用户管理 商品管理 订单管理)
-
后台系统(用户管理 订单管理 客户管理)
-
CMS系统(广告管理 营销管理)
这样拆分完毕之后,一旦用户访问量变大,只需要增加电商系统的节点就可以了,而无需增加后台 和CMS的节点。
优点:
-
系统拆分实现了流量分担,解决了并发问题,而且可以针对不同模块进行优化和水平扩展
-
一个系统的问题不会影响到其他系统,提高容错率
缺点:
-
系统之间相互独立, 无法进行相互调用
-
系统之间相互独立, 会有重复的开发任务
分布式架构
当垂直应用越来越多,重复的业务代码就会越来越多。这时候,我们就思考可不可以将重复的代码 抽取出来,做成统一的业务层作为独立的服务,然后由前端控制层调用不同的业务层服务呢? 这就产生了新的分布式系统架构。它将把工程拆分成表现层和服务层两个部分,服务层中包含业务 逻辑。表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。
优点:
-
抽取公共的功能为服务层,提高代码复用性
缺点:
-
系统间耦合度变高,调用关系错综复杂,难以维护
SOA架构
在分布式架构下,当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加 一个调度中心对集群进行实时管理。此时,用于资源调度和治理中心(SOA Service Oriented Architecture,面向服务的架构)是关键。
优点:
-
使用注册中心解决了服务间调用关系的自动调节
缺点:
-
服务间会有依赖关系,一旦某个环节出错会影响较大( 服务雪崩 )
-
服务关系复杂,运维、测试部署困难
微服务架构
微服务架构在某种程度上是面向服务的架构SOA继续发展的下一步,它更加强调服务的"彻底拆分"。
优点:
-
服务原子化拆分,独立打包、部署和升级,保证每个微服务清晰的任务划分,利于扩展
-
微服务之间采用Restful等轻量级http协议相互调用
缺点:
-
分布式系统开发的技术成本高(容错、分布式事务等)
微服务架构介绍
微服务架构, 简单的说就是将单体应用进一步拆分,拆分成更小的服务,每个服务都是一个可以独 立运行的项目。
微服务架构的常见问题
一旦采用微服务系统架构,就势必会遇到这样几个问题:
-
这么多小服务,如何管理他们?(服务治理 注册中心[服务注册 发现 剔除]) nacos
-
这么多小服务,他们之间如何通讯?(restful rpc)
-
这么多小服务,客户端怎么访问他们?(网关)
-
这么多小服务,一旦出现问题了,应该如何自处理?(容错)
-
这么多小服务,一旦出现问题了,应该如何排错? (链路追踪)
对于上面的问题,是任何一个微服务设计者都不能绕过去的,因此大部分的微服务产品都针对每一 个问题提供了相应的组件来解决它们。
微服务架构的常见概念
服务治理
服务治理就是进行服务的自动化管理,其核心是服务的自动注册与发现。
服务注册:服务实例将自身服务信息注册到注册中心。
服务发现:服务实例通过注册中心,获取到注册到其中的服务实例的信息,通过这些信息去请求它们提 供的服务。
服务剔除:服务注册中心将出问题的服务自动剔除到可用列表之外,使其不会被调用到。
服务调用
在微服务架构中,通常存在多个服务之间的远程调用的需求。目前主流的远程调用技术有基于 HTTP的RESTful接口以及基于TCP的RPC协议。
-
REST(Representational State Transfer) 这是一种HTTP调用的格式,更标准,更通用,无论哪种语言都支持http协议
-
RPC(Remote Promote Call) 一种进程间通信方式。允许像调用本地服务一样调用远程服务。RPC框架的主要目标就是让远程服务调用更简单、透明。RPC框架负责屏蔽底层的传输方式、序列化方式和通信细节。开发人员在使用的时候只需要了解谁在什么位置提供了什么样的远程服务接口即可,并不需要关心底层通信细节和调用过程。
区别与联系
比较项 | RESTful | RPC |
---|---|---|
通讯协议 | HTTP | 一般使用TCP |
性能 | 略低 | 较高 |
灵活度 | 高 | 低 |
应用 | 微服务架构 | SOA架构 |
服务网关
随着微服务的不断增多,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个 服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信可能出现:
-
客户端需要调用不同的url地址,增加难度
-
在一定的场景下,存在跨域请求的问题
-
每个微服务都需要进行单独的身份认证
-
针对这些问题,API网关顺势而生。
API网关直面意思是将所有API调用统一接入到API网关层,由网关层统一接入和输出。一个网关的 基本功能有:统一接入、安全防护、协议适配、流量管控、长短链接支持、容错能力。有了网关之后,各个API服务提供团队可以专注于自己的的业务逻辑处理,而API网关更专注于安全、流量、路由等问题。
服务容错
在微服务当中,一个请求经常会涉及到调用几个服务,如果其中某个服务不可用,没有做服务容错 的话,极有可能会造成一连串的服务不可用,这就是雪崩效应。 我们没法预防雪崩效应的发生,只能尽可能去做好容错。服务容错的三个核心思想是:
-
不被外界环境影响
-
不被上游请求压垮
-
不被下游响应拖垮
链路追踪
随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务。互联 网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器,横跨多个不同的数据中心。因此,就需要对一次请求涉及的多个服务链路进行日志记录,性能监控即链路追踪
nacos
nacos官网: Redirecting to: https://nacos.io/
-
服务发现和服务健康监测
Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。
Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。
-
动态配置服务
动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。
-
动态 DNS 服务
动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。
Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.
-
服务及其元数据管理
Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。
-
下载(github)
-
nacos-server1.4.2.zip( windows部署版)
-
nacos1.4.2.zip (windows源码)
-
nacos-windows单机版
-
将nacos-server1.4.2.zip解压
-
在nacos/bin运行cmd
-
执行startup.cmd -m standalone
-
-
standalone单机版
-
cluster集群版
-
说明:可以直接修改startup.cmd文件中
set MODE="cluster"
-
#nacos启动方式为:standalone
"nacos is starting with standalone"
#nacos监听端口8848,web应用根是/nacos
2023-02-27 08:58:27,174 INFO Tomcat started on port(s): 8848 (http) with context path '/nacos'
#embedded storage:内置数据库
2023-02-27 08:58:27,178 INFO Nacos started successfully in stand alone mode. use embedded storage
4. 测试
http://localhost:8848/nacos
用户名和密码都是:nacos
nacos-docker单机版
https://hub.docker.com/
-
运行容器
docker run --name n1 -e MODE=standalone -p 8848:8848 -d nacos/nacos-server:1.4.2
2.测试
http://192.168.19.8:8848/nacos
nacos-docker-mysql单机版
-
安装mysql
docker run -d --name zking-mysql --network net-ry \
-v /data/mysql/conf/my.cnf:/etc/my.cnf \
-v /data/mysql/data:/var/lib/mysql \
--privileged=true --restart=always \
-e MYSQL_ROOT_PASSWORD=sasa -p 3306:3306 \
mysql/mysql-server:5.7
参考上节内容,需要net-ry网络
2.mysql充许远程连接
# 进入容器
docker exec -it zking-mysql /bin/bash
# 登录
mysql -u root -p;
# 添加用户并授权
grant all privileges on *.* to root@'%' identified by 'sasa' with grant option;
# 刷新权限
flush privileges;
3.创建数据库nacos-config
create database nacos_config;
4.执行nacos源码中nacos-1.4.2\distribution\conf中的nacos-mysql脚本
5.运行nacos容器
docker run -d \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=zking-mysql \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=sasa \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_DATABASE_NUM=1 \
-e NACOS_APPLICATION_PORT=8848 \
--restart=always \
--network net-ry \
--name n2 \
-p 8849:8848 \
nacos/nacos-server:1.4.2
mysql与nacos在一网络中net-ry中
nacos-docker-mysql集群版
为2与3
准备
环境准备
-
虚拟机内存为2G或更高
-
进入虚拟机之后,使用free查看内存使用情况
-
-
虚拟机处理器
mysql安装
-
下载镜像
docker pull mysql/mysql-server:5.7
不同镜像配置环境可能不同
-
在宿主机中相关目录,用于挂载容器的相关数据
mkdir -p /data/mysql/{conf,data}
-
编写my.cnf配置文件,在/data/mysql/conf目录中 (课件中有该文件,直接上传即可)
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
##官方的配置
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
secure-file-priv=/var/lib/mysql-files
user=mysql# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
##下面为添加的自定义配置
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
# default: sql_mode= STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
# modeified:
sql_mode= STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
max_allowed_packet=10M
default-time_zone='+8:00'
default_authentication_plugin=mysql_native_password
-
创建并启动mysql容器
#格式一
docker run -p 3306:3306 --name zking-mysql -d mysql/mysql-server:5.7
docker logs zking-mysql
#格式二
docker run -p 3306:3306 --name zking-mysql -e MYSQL_ROOT_PASSWORD=sasa -d mysql/mysql-server:5.7
了解mysql目录结构
docker run -p 3306:3306 \
--name zking-mysql \
-v /data/mysql/conf/my.cnf:/etc/my.cnf \
-v /data/mysql/data:/var/lib/mysql \
--net=net-test \
--privileged=true \
--restart=always \
-e MYSQL_ROOT_PASSWORD=sasa \
-d mysql/mysql-server:5.7
参数说明: -p 3306:3306:宿主机端口:容器端口
--name mysql:容器名字
-v:挂载宿主机的一个目录, 持久化存储的关键所在,将主机目录挂载到容器对应目录,分别是:配置文件、日志文件、数据文件
-v /data/mysql/conf:/etc/mysql/conf.d -v /data/mysql/logs:/logs -v /data/mysql/data:/var/lib/mysql
--privileged=true:使用该参数,container内的root拥有真正的root权限, 否则,container内的root只是外部的一个普通用户权限
--restart=always:容器自动启动参数,其值可以为[no,on-failure,always] no为默认值,表示容器退出时,docker不自动重启容器 on-failure表示,若容器的退出状态非0,则docker自动重启容器,还可以指定重启次数,若超过指定次数未能启动容器则放弃 always表示,只要容器退出,则docker将自动重启容器
-e MYSQL_ROOT_PASSWORD=sasa:设置root的密码 -d mysql/mysql-server:5.7:后台启动模式及使用的镜像
-
修改mysql允许Navicat远程连接
# 进入容器
docker exec -it zking-mysql /bin/bash# 登录
mysql -u root -p;# 授权
grant all privileges on *.* to root@'%' identified by 'sasa';# 刷新权限
flush privileges;
创建nacos需要的数据库
-
将3306端口加入防火墙,使用mysql客户端链接数据库
-
创建数据库
CREATE DATABASE IF NOT EXISTS nacos_config
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
-
导入nacos数据(nacos安装目录下 conf目录中有脚本nacos-mysql.sql)
下载nacos镜像
docker pull nacos/nacos-server:1.4.2
创建自定义网络
docker network create mynet --subnet=192.168.0.0/16
获取nginx镜像
docker pull nginx
nacos集群部署
在真实环境下,为了便于主节点选举,通常集群机器通常为奇数台。
将mysql连接到mynet网络
docker network connect mynet zking-mysql --ip 192.168.0.11
此时可以查看mynet网络的具体配置:
docker network inspect mynet
注: 如果mysql容器还没有创建,也可以创建mysql容器时指定网络配置,(上面已经将mysql连接到mynet,所以不用执行此步):
docker run \
--name zking-mysql \
--net mynet \
--ip 192.168.0.11 \
-v /data/mysql/conf/my.cnf:/etc/my.cnf \
-v /data/mysql/data:/var/lib/mysql \
--privileged=true \
--restart=always \
-e MYSQL_ROOT_PASSWORD=sasa \
-d mysql/mysql-server:5.7
nacos集群
-
启动第一个节点nacos节点
docker run -d \
--net net-test \
--name nacos01 \
--hostname nacos01 \
-e PREFER_HOST_MODE=hostname \
-e MODE=cluster \
-e NACOS_SERVERS="nacos01:8848 nacos02:8848 nacos03:8848" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=zking-mysql \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=sasa \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_DATABASE_NUM=1 \
-e NACOS_APPLICATION_PORT=8848 \
--restart=always \
nacos/nacos-server:1.4.2
配置参考:
name | description | option |
---|---|---|
MODE | cluster模式/standalone模式 | cluster/standalone default cluster |
NACOS_SERVERS | nacos cluster地址 | eg. ip1,ip2,ip3 |
PREFER_HOST_MODE | 是否支持hostname | hostname/ip default ip |
NACOS_SERVER_PORT | nacos服务器端口 | default 8848 |
NACOS_SERVER_IP | 多网卡下的自定义nacos服务器IP | |
SPRING_DATASOURCE_PLATFORM | standalone 支持 mysql | mysql / empty default empty |
MYSQL_MASTER_SERVICE_HOST | mysql 主节点host | |
MYSQL_MASTER_SERVICE_PORT | mysql 主节点端口 | default : 3306 |
MYSQL_MASTER_SERVICE_DB_NAME | mysql 主节点数据库 | |
MYSQL_MASTER_SERVICE_USER | 数据库用户名 | |
MYSQL_MASTER_SERVICE_PASSWORD | 数据库密码 | |
MYSQL_SLAVE_SERVICE_HOST | mysql从节点host | |
MYSQL_SLAVE_SERVICE_PORT | mysql从节点端口 | default :3306 |
MYSQL_DATABASE_NUM | 数据库数量 | default :2 |
JVM_XMS | -Xms | default :2g |
JVM_XMX | -Xmx | default :2g |
JVM_XMN | -Xmn | default :1g |
JVM_MS | -XX:MetaspaceSize | default :128m |
JVM_MMS | -XX:MaxMetaspaceSize | default :320m |
NACOS_DEBUG | 开启远程调试 | y/n default :n |
TOMCAT_ACCESSLOG_ENABLED | server.tomcat.accesslog.enabled | default :false |
-
启动第二个第三个 nacos节点
docker run -d \
--net net-test \
--name nacos02 \
--hostname nacos02 \
-e PREFER_HOST_MODE=hostname \
-e MODE=cluster \
-e NACOS_SERVERS="nacos01:8848 nacos02:8848 nacos03:8848" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=zking-mysql \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=sasa \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_DATABASE_NUM=1 \
-e NACOS_APPLICATION_PORT=8848 \
--restart=always \
nacos/nacos-server:1.4.2
docker run -d \
--net net-test \
--name nacos03 \
--hostname nacos03 \
-e PREFER_HOST_MODE=hostname \
-e MODE=cluster \
-e NACOS_SERVERS="nacos01:8848 nacos02:8848 nacos03:8848" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=zking-mysql \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=sasa \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_DATABASE_NUM=1 \
-e NACOS_APPLICATION_PORT=8848 \
--restart=always \
nacos/nacos-server:1.4.2
查看nacos启动信息
docker exec -it nacos01 cat /home/nacos/logs/nacos.log
使用nginx访问集群
-
创建宿主机挂载目录
[root@localhost data]# mkdir -p /data/nginx/{conf,log,html}
-
上传nginx.conf配置文件(在课件中已准备,上传到/data/nginx/conf目录即可)
配置文件内容如下:
worker_processes 1;
events {
worker_connections 1024;
}http {
include mime.types;
default_type application/octet-stream;
sendfile on;keepalive_timeout 65;
gzip on;
upstream nacos-cluster {
server nacos01:8848 weight=1;
server nacos02:8848 weight=1;
server nacos03:8848 weight=1;
}
server {
listen 80;#监听80端口,可以改成其他端口
server_name localhost;#当前服务的域名#新增2:用于重定向至nacos集群
location /nacos {
proxy_pass http://nacos-cluster;
}
location / {
root /usr/share/nginx/html;#将要访问的网站的目录
try_files $uri $uri/ /index.html;#该句代码是为解决history路由不能跳转的问题,在vue-router官网有介绍
}#location ^~/api/ {
#^~/api/表示匹配前缀是api的请求,proxy_pass的结尾有/, 则会把/api/*后面的路径直接拼接到后面,即移除api
#proxy_pass http://tomcats/;
#}
}
}
-
启动nginx容器:
docker run \
--name mynginx \
--net mynet \
-d -p 80:80 \
-v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /data/nginx/html:/usr/share/nginx/html \
--privileged=true \
nginx:latest
-
将mynginx同时连接到bridge网络,用于与宿主机通讯
[root@localhost ~]# docker network connect bridge mynginx
-
访问控制台确认部署:
http://192.168.72.38/nacos
出现如下界面说明集群正常:、
部署微服务测试
将微服务注册地址改为虚拟机主机地址