微服务生态全景图
Linux命令
cd / 进入根目录
pwd 查看当前所在目录
cd 文件夹 进入文件夹
cd .. 返回上一层
ls 显示当前目录的所有文件
mkdir 文件夹 创建文件夹
touch 文件 创建文件
rm -rf 文件 删除文件或文件夹
文件编辑
vi xx.txt 编辑文件
输入i 只读状态->编辑状态
按esc 编辑状态->只读状态
只读状态下:
:wq 保存并退出
:q! 不保存退出
cat xx.txt 查看文件
cp xx.txt xx.txt.bak 备份
准备工作
首先,你要安装VMware、xshell和xftp等工具才能进行下面的操作,具体怎么安装网上很多,对症下药。
静态文件配置
vi /etc/sysconfig/network-scripts/ifcfg-ens33
先进入配置文件里面,记得先备份
然后再虚拟网络编辑器中查看
修改
BOOTPROTO="static"
ONBOOT="yes"
增加
IPADDR=192.168..198 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=8.8.8.8 DNS2=221.7.128.68 DNS3=221.7.136.68
reboot
重启服务器
poweroff
关机
权限
cd home/
查看有几个用户(用户在home文件夹下)
su 用户名
切换到某个用户==========》高向低,不需要密码,低向高,需要密码普通用户无法操作root创建的文件(只读),只能root给赋予权限
在进入到文件夹后
输入
ls -al
可以查看文件夹内 文件的所有信息,包括权限===========权限 三位二进制形式 777表示任何用户都有对文件的任何权限
卡头 字母为d 表示是一个文件夹
chmod 777 b.txt
赋权命令
ll
查看文件夹文件全部信息
部署项目
[Linux环境(CentOS7)下使用yum安装JDK1.8_linuxyum安装jdk1.8-CSDN博客]:
利用 yum安装 jdk环境
yum install -y java-1.8.0-openjdk-devel.x86_64
安装Tomcat 这个图标也就是关联着xftp
找到apache-tomcat-8.5.75.tar.gz然后把文件拖拽进去(注意后缀)
从虚拟机下载文件 就是从右边往左边拖
首先要对Tomcat的压缩包解压缩
tar -zxvf apache-tomcat-8.5.75.tar.gz
对压缩包解压
重命名
mv apache-tomcat-8.5.75.tar.gz tomcat8.5
接下来 要把项目部署到 Tomcat文件的webapps文件夹下
继续利用xftp 来拖进去
接下来启动tomcat
进入到Tomcat文件夹的bin目录下
sh结尾的是可执行程序 然后startup.sh是启动 shutdown.sh是关闭服务
然后启动启动程序
sh startup.sh
这时候还不能 通过ip+路径 访问项目 因为 防火墙会阻止
此时需要关闭防火墙
systemctl stop firewalld
此时就可以访问项目了,成功的将项目部署在Linux上
Docker安装
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
也就是相当于一个管理工具,类似于git,可以从服务器上拉取各种环境的压缩包进行下载,方便多个虚拟机的环境部署
-
镜像 ---->windows中的安装包 容器:等同于windows的软件
remove docker
卸载docker
sudo xxx xxx
可以把普通用户的权限等级提升至管理员级别 进行一些操作就不用进行授权
-
首先先安装docker需要的yum 环境
yum install -y yum-utils device-mapper-persistent-data lvm2
-
配置软件下载源头为国内的
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
更新yum缓存 相当于重启
yum makecache fast
-
安装docker
yum -y install docker-ce
-
启动docker
systemctl start docker
-
查看docker中下载了哪些镜像(安装包)
docker images
docker安装MySQL
安装最新的MySQL
docker pull mysql
安装MySQL8
docker pull mysql:8.0.16
安装并运行
#创建数据存储目录
mkdir -p /data/docker_volumn/mysql/conf
mkdir -p /data/docker_volumn/mysql/data
mkdir -p /data/docker_volumn/mysql/mysql-files
#设置忽略大小写
docker run -di --name=mysql \
-v /usr/local/src/mysql/data:/var/lib/mysql \
-v /usr/local/src/mysql/conf/my.cnf:/etc/mysql/my.cnf \
--privileged=true \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 mysql \
--lower_case_table_names=1
-
-
参数说明
-
run run 是运行一个容器
-
-d 表示后台运行
-
-p 表示容器内部端口和服务器端口映射关联
-
–privileged=true 设值MySQL 的root用户权限, 否则外部不能使用root用户登陆。
-
忽略大小写:lower-case-table-names=2
-
-v /docker/mysql/conf/my.cnf:/etc/my.cnf 将服务器中的my.cnf配置映射到docker中的/docker/mysql/conf/my.cnf配置
-
-v /docker/mysql/data:/var/lib/mysql 同上,映射数据库的数据目录, 避免以后docker删除重新运行MySQL容器时数据丢失
-
-e MYSQL_ROOT_PASSWORD=_Admin123 设置MySQL数据库root用户的密码
-
–name mysql 设值容器名称为mysql mysql:8.0.16 表示从docker镜像mysql:8.0.16中启动一个容器
-
–character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci 设值数据库默认编码
-
查看docker中正在运行的容器
docker ps
-
暂停容器
docker stop 加上CONTAINER ID
-
查看docker上左右服务(包括未运行的)
docker ps -a
-
启动容器
docker start 加上CONTAINER ID
-
重启容器
docker restart 加上CONTAINER ID
docker 安装redis
-
先下载镜像(安装包)
docker pull redis:latest
-
-
启动容器
docker run -d --privileged=true -p 6379:6379 --restart always -v /opt/redis/conf/redis.conf:/etc/redis/redis.conf -v /opt/redis/data:/data --name redis-test redis:latest redis-server /etc/redis/redis.conf --appendonly yes --requirepass 123456
-
删除安装包
docker rmi 加上CONTAINER ID
-
删除软件(需要先暂停运行的容器服务)
docker rm 加上CONTAINER ID
docker rmi + 服务全名称:版本号
-
-
-
-
-
-
-
-
-
-
-
服务治理中心nacos环境搭建
先将nacos文件拉取到虚拟机的usr/local下
然后进入到nacos的bin目录下
cd usr/local/nacos/bin
然后启动服务
sh startup.sh
在后面追加-m standalone
为单机模式 不加为集群模式
然后关闭防火墙
systemctl stop firewalld
然后通过浏览器访问192.168.91.188:8848/nacos
nacos默认端口为8848,然后通过账号和密码都是nacos登录进去
微服务模块注册nacos服务中心
相关开源网址
[Nacos discovery · alibaba/spring-cloud-alibaba Wiki · GitHub]:
添加依赖
<!-- nacos服务客户端 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
配置yml文件
spring cloud: nacos: discovery: server-addr: 192.168.91.188:8848
在启动类上添加注解
@EnableDiscoveryClient
然后在服务中心就可以看到相关信息
不同服务模块之间的调用
A(order)调用B(product)===A就是消费者,就要把配置加在A上
pox.xml
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
在启动类上加入注解
@EnableFeignClients
在消费者中新加一个feign的调用服务包,里面写调用服务接口
然后把被调用者controller层的你要用的方法以接口的形式写在调用服务里======
-
一定注意不要漏了被调用者controller上面的统一路径
public interface ProductServiceFeign { @GetMapping("/product/hello") public Result getResult(); }
然后在调用接口上加注解
@FeignClient("shop-product")
后面的名字是注册在nacos上的服务名,也就是yml里面配置的名字
然后在消费者你要调用的地方先实例化调用对象
然后就可以使用被调用者的方法
@RestController @RequestMapping("/orders") public class HelloController { @Autowired private ProductServiceFeign productServiceFeign; @GetMapping("/hello") public Result getName() { Result result = productServiceFeign.getResult(); return new Result(true,"你好啊",result.getData()+result.getMsg()); } }
这样就可以通过order的controller层方法也能调用到product模块的方法
模拟集群时ribbon负载均衡
此时要操作B---被调用者
首先先复制几份 服务运行
然后在弹窗中配置
-Dserver.port=8201
配置一个没有使用的端口号
然后在被调用者的controller层添加
@Value("${server.port}") private String port;
在下方方法中打印一下port
@GetMapping("/hello") public Result getResult(){ return new Result(true,"我是product",port+"布偶仙女"); } }
然后重启该被调用者服务和新复制的服务
在窗口中测试
在访问同一个端口三次时,分别调用了三个不同的端口(8200、8201、8202),减轻了每台服务器高并发压力。
nacos统一设置所有服务器的配置文件
首先进入网站点击配置管理-配置列表,再点击添加
首先这里命名的shop-order要与服务名对应
其次dev要与等会的后缀一致,还有文件格式为yaml
接下来屏蔽application.yml的配置,新建一个bootstrap.yml
因为springboot会优先读bootstrap.yml的配置
把公共配置文件添加到nacos并发布
下面在服务调用者处添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
下面在bootstrap.yml中加入配置
spring: application: name: shop-order cloud: nacos: config: server-addr: 192.168.91.188:8848 file-extension: yaml profiles: active: dev
对应的dev 和yaml还有shop-order与发布中一一对应
接下来重启所有服务,就能访问对应的页面,说明我们的配置文件统一配置在了nacos
动态的获取nacos服务中心配置文件
@RefreshScope // 动态的获取配置文件(配置在controller层)
nacos配置网关
先新建子模块shop-gateway
加入依赖
<!-- nacos服务客户端 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
然后gateway依赖会与MVC的web依赖冲突
这时候就要把父web依赖去掉,然后配置到除了gateway的其他模块中
然后写配置文件
server: port: 8000 spring: application: name: shop-gateway devtools: restart: enabled: true cloud: nacos: discovery: server-addr: 192.168.91.188:8848 gateway: discovery: locator: enabled: true
最后在访问时要注意访问的URL
http://127.0.0.1:8000/shop-product/product/query/1
ip+网关端口号+服务名+controller层地址(+参数)
sentinel
配置
先拉取sentinel压缩包到Linux下
然后在该文件夹运行,输入命令
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar
其中8080是你要配置的端口,一定要空闲的
导入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
配置yml
spring: sentinel: transport: port: 8719 dashboard: 192.168.91.188:8080
打开sentinel对feign支持
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
配置
feign: sentinel: enabled: true
重启项目
然后打开sentinel官网(你配置的端口)192.168.91.188:8080
账号密码都为sentinel
进入之后,现在外面多访问几次你配置服务中的controller方法
127.0.0.1:8000/shop-person/person/query/1
然后就会出现你的服务
限流
点击簇点链路,在点击流控,输入流控数,就可以实现流量管控
降级
首先在order中引入sentinel依赖
然后在yml中添加sentinel配置信息
然后写一个xxxFeugnFallback的降级类继承该服务的Feign接口的class(字节码)
并且编辑降级方案
然后在feign接口上配置fallback属性
然后再停止配置了降级的服务就能看到降级方案触发
seata分布式事务
API文档官网
[Apache Seata]:
TC (Transaction Coordinator) - 事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器
定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - 资源管理器
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
配置
附件中的文件
首先导入seata文件夹的表到名为seata的数据库下
-
seata数据库必须在Linux的数据库中
SQL文件在seata文件夹下的script/server/db下的mysql.sql
然后在自己业务的数据库中导入
seata\script\client\at\db文件架下的mysql.sql表
然后编辑conf下的registry.conf文件
有两处要改为自己的端口
然后保存
下面修改seata\script\config-center文件夹下的config.txt文件
地址以及账号密码
下面把seata文件夹拉到Linux的usr/local文件夹下
然后不要停止sentine新开个Linux窗口
进入seata\script\config-center\nacos文件夹下
运行
sh nacos-config.sh
将seata相关配置上传到nacos服务器,这时在nacos服务端会有9页配置文件
下面进入seata文件夹的bin目录下
启动seata服务
sh seata-server.sh -h 192.168.91.188
然后出现这个就是启动成功了
在你要配置业务的每个模块都导入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
在每个模块中加入配置
seata: tx-service-group: beijing config: type: nacos nacos: server-addr: 192.168.91.188:8848 group: "SEATA_GROUP" namespace: "" username: "nacos" password: "nacos" registry: type: nacos nacos: application: seata-server server-addr: 192.168.91.188:8848 group: "SEATA_GROUP" namespace: "" username: "nacos" password: "nacos"
注意两个端口地址
还有 tx-service-group: beijing要与上方对应
然后要在你要进行分布式管理的事务的ServiceImpl层的方法上(也就是业务的总调用接口的实现类)加入注解
@GlobalTransactional
就可以对该业务进行分布式管理
rabbitMQ 消息队列
首先下载镜像
docker pull rabbitmq:3.8.2-management
然后安装容器
docker run -d --hostname rabbitMQ --name my-rabbitMQ -p 15672:15672 -p 5672:5672 rabbitmq:3.8.2-management
关闭防火墙
systemctl stop firewalld
访问网址
自己虚拟机的IP:15672
在项目中应用
首先搞清消费者与生产者
生产者发送消息到消息队列,消费者立即拿出来
也就是生产者把消息推送给交换机,交换机储存在消息队列,然后消费者取消息
导入依赖
<!-- rabbitmq -->
<dependency> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
添加配置文件
spring: rabbitmq: host: 192.168.91.188 port: 5672 username: guest password: guest
在controller层生产者推送消息到消息队列
直连交换机(点对点)
@Autowired private RabbitTemplate rabbitTemplate;
rabbitTemplate.convertAndSend("aaa","hello mq!");
前面为消息队列名称(这是在一对一情况下)后面为消息
消费者在service层接收消息=-===订阅消息队列
@Component @RabbitListener(queues = "aaa") public class ConsumerService { @RabbitHandler public void getMsg(String msg){ System.out.println("接收到的消息:"+msg); } }
广播交换机(点对多)
先在网站新建一个广播交换机
下面进入新创的广播交换机
关联消息队列
消息发送
rabbitTemplate.convertAndSend("j2302","","hello java!");
第二个参数为匹配规则
@RabbitListener(queues = "aaa")@RabbitListener(queues = "bbb")@RabbitListener(queues = "ccc")
然后分别用ABC接收
主题交换机(匹配规则)
首先删除上面的广播交换机
因为消息队列只能绑定一个交换机
创建一个主题交换机
然后 在交换机里添加 消息队列和对应的规则
主要以 . 和 # 为主 #可以认为是通配符
然后进行测试
然后结果为