1 Spring cloud config 配置中心
集中地管理和维护配置文件
微服务启动时,从服务器获取配置文件
1.1 准备 git 仓库
现在本地准备一个文件夹存放2,3,4的配置文件,再把文件夹放到 git 仓库
-
在 gitee 创建仓库
- springcloud1
- 开源
-
在 springcloud1 工程目录下,新建一个文件夹:config
-
把 2,3,4 的 application.yml 复制到 config 目录,并改名
- item-service-dev.yml
- user-service-dev.yml
- order-service-dev.yml
-
创建本地仓库
-
double shift – 搜索 create git repository(有中文插件用汉字搜索)
-
选择 springcloud1 工程目录,设置成本地仓库
-
double shift – 搜索 commit
-
勾选所有文件、填写提交信息,然后点提交按钮
-
-
把本地仓库推送到远程仓库
-
double shift – 搜索 push
-
点 define remote 链接
-
粘贴远程仓库的地址,完成推送
-
1.2 搭建配置中心
-
新建 spring 模块:sp09-config
-
添加依赖
- eureka client
- config server
-
yml
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://gitee.com/shixumin/springclould1 #创建的git仓库地址
search-paths: config
server:
port: 6001
eureka:
client:
service-url:
defaultZone: http://eureka1:2001/eureka, http://eureka2:2002/eureka
-
启动类注解:
@EnableConfigServer
-
验证
- 注册表中有 config-server
http://localhost:6001/item-service/dev
http://localhost:6001/user-service/dev
http://localhost:6001/order-service/dev
1.3 配置中心的客户端
- 把 2,3,4 的 application.yml 都注释掉
- 添加依赖: config client
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
- 添加新的配置文件: bootstrap.yml
- eureka地址
- 设置配置中心的服务id
- 下载的配置文件
# 引导配置,应用启动之前会先执行引导配置
#应用启动时才会执行 application.yml
#从配置中心下载配置,再使用下载的配置启动应用
# 1.连接eureka
# 2.从注册表获得config-server的地址
# 3.从config-server下载配置文件
eureka:
client:
service-url:
defaultZone: http://eureka1:2001/eureka,http://eureka2:2002/eureka
spring:
cloud:
config:
discovery:
enabled: true #
#2.从注册表获得config-server的地址
service-id: CONFIG-SERVER
#3.从config-server下载配置文件 user-service-dev.yml
name: user-service
profile: dev
1.4 检查确认
- 按顺序启动项目
- 05-eureka,等待05完全启动
- 09-config,等待09完全启动
- 03-user
- 检查配置中心
- 注册表中有 config-server
http://localhost:6001/item-service/dev
http://localhost:6001/user-service/dev
http://localhost:6001/order-service/dev
- 03-user 的控制台日志,有没有连接 6001 服务器
更换仓库再测试
注意:先启动02的话 ,会连接默认配置中心 localhost:8888
VMware
1.1 ip设置失败
# centos 7 禁用 NetworkManager 系统服务
systemctl stop NetworkManager
systemctl disable NetworkManager
# centos 8 开启 VMware 托管
nmcli n on
systemctl restart NetworkManager
1.2 安装 Docker 环境
- 关闭虚拟机
- 右键点虚拟机–管理–克隆
- 点三下下一步,起名字: docker-base
- 启动虚拟机
- 执行 ifconfig 查看 ip
- 用 MobaXterm 工具连接服务器,上传文件到 /root/
- DevOps课前资料\docker\docker-install 文件夹
- 按 csdn 离线安装 docker 笔记
上传离线安装包
rabbitmq-install 目录上传到 /root
切换到rabbitmq-install目录
cd rabbitmq-install
安装
rpm -ivh *.rpm
Rabbitmq
消息服务、消息队列、消息中间件 Broker
常见的消息服务器:
- Rabbitmq
- Activemq
- Rocketmq
- Kafka
- Tubemq
搭建 Rabbitmq 服务器
1. 关闭 docker-base,从docker-base克隆: rabbitmq
2. 设置固定ip
./ip-static
ip: 192.168.64.140
ifconfig
3. 上传文件到 /root/
- DevOps课前资料\docker\rabbit-image.gz
4. 导入镜像
systemctl restart docker
docker load -i rabbit-image.gz
docker images
5. 按照 rabbitmq 笔记 – docker 启动rabbitmq,启动rabbitmq 容
-
关闭防火墙
systemctl stop firewalld systemctl disable firewalld #取消开机自启 # 重启 docker 系统服务 systemctl restart docker
-
配置管理员用户名和密码
mkdir /etc/rabbitmq vim /etc/rabbitmq/rabbitmq.conf # 添加两行配置: default_user = admin default_pass = admin
-
启动Rabbitmq
docker run -d --name rabbit \ -p 5672:5672 \ -p 15672:15672 \ -v /etc/rabbitmq/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \ -e RABBITMQ_CONFIG_FILE=/etc/rabbitmq/rabbitmq.conf \ --restart=always \ rabbitmq:management
-
访问管理控制台 http://192.168.64.140:15672
用户名密码是 admin
3 rabbitmq六种工作模式
3.1 简单模式
- 发送消息的程序是生产者
- 队列就代表一个邮箱。虽然消息会流经RbbitMQ和你的应用程序,但消息只能被存储在队列里。队列存储空间只受服务器内存和磁盘限制,它本质上是一个大的消息缓冲区。多个生产者可以向同一个队列发送消息,多个消费者也可以从同一个队列接收消息.
- 消费者等待从队列接收消息
pom依赖
<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.4.3</version>
</dependency>
</dependencies>
生产者发送消息
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Producer {
public static void main(String[] args) throws IOException, TimeoutException {
// 1.连接服务器
ConnectionFactory f = new ConnectionFactory();
f.setHost("192.168.64.140");
f.setPort(5672);//5672 收发消息端口 , 15672 管理控制台界面的端口
f.setUsername("admin");
f.setPassword("admin");
Connection con = f.newConnection();
//建立信道
Channel c = con.createChannel(); //通信新增
// 2.在服务器上创建一个队列 : helloworld
//如果队列在服务器上已存在,不会重复创建
/*
*参数:
* 第二个参数durable: 是否是持久队列
* 3 exclusive:是否是排他队列,独占队列
* 4 autoDelete:是否自动删除
* 5 arguments: 队列的其他属性
*/
c.queueDeclare("helloworld",false,false,false,null);
// 3.向helloworld队列发送消息
/*
1. "" 空串 默认的交换机
2. -routingKey: 对于默认交换机,路由键就是目标队列名称
* 3. -props: 其他参数,例如头信息
* 4. -body: 消息内容byte[]数组
*/
c.basicPublish("", "helloworld", null, "helloworld!".getBytes());
System.out.println("消息已发送");
c.close();
con.close();
}
}
消费者接收消息
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Consumer {
public static void main(String[] args) throws IOException, TimeoutException {
// 连接
// 1.连接服务器
ConnectionFactory f = new ConnectionFactory();
f.setHost("192.168.64.140");
f.setPort(5672);//5672 收发消息端口 , 15672 管理控制台界面的端口
f.setUsername("admin");
f.setPassword("admin");
Connection con = f.newConnection();
//建立信道
Channel c = con.createChannel(); //通信新增
// 2.在服务器上创建一个队列 : helloworld
//如果队列在服务器上已存在,不会重复创建
c.queueDeclare("helloworld",false,false,false,null);
// 3.创建回调对象
//DeliverCallback 处理消息
//方式1 new 匿名内部类
DeliverCallback deliverCallback = new DeliverCallback() {
@Override
public void handle(String s, Delivery message) throws IOException {
byte[] a = message.getBody();
s = new String(a);
System.out.println("收到:"+s);
}
};
//方式2 Lambda表达式
// DeliverCallback deliverCallback = (consumerTag, message) -> {
// byte[] a = message.getBody();
// String s = new String(a);
// System.out.println("收到:"+s);
// };
CancelCallback cancelCallback=consumerTag -> {};
// 4. 开始接受消息,把消息传递给一个回调对象进行处理
//第2个参数 autoAck: 是否自动确认
c.basicConsume("helloworld", true, deliverCallback, cancelCallback);
}
}
3.2 工作模式
一个生产者,多个消费者,每个消费者获取到的消息唯一
- 自动模式
消费者从消息队列获取消息后,服务端就认为该消息已经成功消费。 - 手动模式
消费者从消息队列获取消息后,服务端并没有标记为成功消费
消费者成功消费后需要将状态返回到服务端
4
查看有没有暴露bus-refresh
http://localhost:6001/actuator
查看2,3,4 控制台有没有重连配置中心,重新下载相应配置(商品,用户,订单配置)
POST http://localhost:6001/actuator/bus-refresh
bus 消息总线 (动态配置刷新)
sleuth + Zipkin 链路跟踪
zipkin 可以收集链路跟踪数据,提供可视化的链路分析
java -jar zipkin-server-2.12.9-exec.jar --zipkin.collector.rabbitmq.uri=amqp://admin:admin@192.168.64.140:5672
java -jar zipkin-server-2.23.16-exec.jar --zipkin.collector.rabbitmq.uri=amqp://admin:admin@192.168.64.140:5672
微服务添加 zipkin 起步依赖
修改以下微服务
sp02-item-service
sp03-user-service
sp04-order-service
sp11-zuul
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>