1.Config 分布式配置中心
配置中心顾名思义,就是管理配置的模块,使用场景是什么呢?在开发过程中我们会遇到很多配置文件,无论是我们框架上的开发环境、测试环境、生产环境,这些个配置,还是我们代码里用到的参数配置,当越来越多的时候会变的难以管理(有聪明的兄弟就要问了怎么会越来越多呢?比如说微服务我有上百个,每个微服务我都做集群,那么我什么时候要改一个配置,让你慢慢改你受得了吗?),那么配置中心就解决了这些痛点。
有了配置中心那么这些服务只要知道配置中心的地址就行,过来问配置中心要配置就行,而且这边的好处就是配置中心更改了,相应的微服务可以不用重启,非常方便。
1.1 配置中心 - 外部文件
配置中心肯定要有一个统一的地方存放配置文件,有两种方式存放,一是你自己搞个服务器,把配置啥的,都放在服务器上。二是放在云端比如github、gitee。下面我就用gitee来简单教学一下。
实现准备一个gitee仓库并且上传一个文件。
1.2 配置中心服务端的搭建
pom文件,这个非常重要,不引入的话,找不到参数会报错的。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
启动类
@SpringBootApplication
@EnableConfigServer//开启config 这个功能
@EnableEurekaClient
public class ConfigServerApp {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApp.class,args);
}
}
配置文件
server:
port: 5687
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://gitee.com/xxxxx/xxxx.git
#这边是你刚才创建的gitee仓库
#如果不是公开的话就要配置账号密码
# username: xxxx
# password: xxxx
#分支名称
label: master
#注册到eureka上
client:
service-url:
defaultZone: http://localhost:8761/eureka
1.3 客户端连接配置中心
第一步引入依赖!别忘了,忘了就会报错!
第二步创建bootstrap.yml 文件,这个文件加载顺序优先级更高
spring:
cloud:
config:
#这边可以直接配置相应的配置中心地址,当然也可以从eureka上拿
# uri : http://localhost:5687
name : my
profile : dev
lable : master
#注册在eureka 上配置中心的地址
discovery:
enabled: true
service-id: CONFIG-SERVER
第三步使用
@Value("${server}")
private String server;
public CompanyInfo findCompanyInfo(int id){
System.out.println(server);
return companyDao.findCompany(id);
}
1.4 配置自动刷新
这边的刷新是指客户端的刷新,配置中心是实时请求云端配置文件的,所以这边涉及到的刷新就是针对消费方的功能。
第一步引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
第二步加上配置文件
management:
endpoints:
web:
exposure:
include: refresh
第三步加上@RefreshScope注解
这边我使用的时候遇到了一个问题就是,这个注解加在controller 层的时候,发现注解都不可用的情况。
这个注解就是你在哪里使用云端配置文件的地方就在加在哪里。
@Service
@RefreshScope//开启自动刷新功能
public class CompanyService {
@Autowired
CompanyDao companyDao;
@Value("${server}")
private String server;
public CompanyInfo findCompanyInfo(int id){
System.out.println(server);
return companyDao.findCompany(id);
}
}
第四步用命令刷新一下,这个端口是用消费方的的端口,有的人要问了,更新一下都要手动刷新一下吗,那么不如不要这个功能哦,不要急着给功能需要配合bus 才能发挥功效!
curl -X POST http://localhost:8000/actuator/refresh
2. bus消息总站
大概的说一下这是个什么东西,可以理解为一个容器,里面的核心功能呢由RabbitMq、或者kafuka消息中间件实现,然后bus可以对消息处理的一个应用服务,这个服务可以与其他微服务建立连接,可以大致理解为一个广播站!这边演示一下rabbitmq 消息组件实现消息群发功能。
我们这边主要实现上面手动刷新的功能
2.1 rabbitmq 安装
安装教程点击这边https://www.cnblogs.com/JiHC/p/15879240.html
2.2 pom文件
这两个是实现关键,客户端服务端都要配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
2.3 配置文件
无论是客户端还是服务端都要配置
spring
rabbitmq:
host: localhost
port: 5672
username: 你自己的用户名
password: 你自己的密码
virtual-host: /
management:
endpoints:
web:
exposure:
include: 'bus-refresh'
#这边是暴露节点
2.4 最后一步向服务端发送命令
我这边的服务端就是配置中心,我像配置中心发送刷新的节点,配置中心会往mq里面发送一条信息,服务端回去消费这条信息,无论我的服务端有多少个,都会去消费这条消息,
这边需要注意的是你的消费方暴露节点必须是全部暴露,或者和客户端暴露的节点是一样的,也就是这段代码
management:
endpoints:
web:
exposure:
include: 'bus-refresh'
curl -X POST http://localhost:5687/actuator/bus-refresh
3. Stream 消息驱动
这个讲简单点,这个消息驱动就是和jdbc 一样的设计思路,jdbc 封装了对mysql、oracle等数据库的操作,我们通过一些配置就可以在数据库的种类中切换,那么stream消息驱动异曲同工,它封装了rabbitmq和kafuka两个消息队列,我们也可以动态切换。
3.1 三大组件
消息驱动实现的三个核心的组件分别是,了解一下就行
- binder 绑定器实现应用程序和消息中间件消息传输的桥梁
- output 向外发消息 source 接口
- input 向内接受消息 sink接口
下面我就简单的演示一下
3.1.1 消息的生产者
pom 文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
配置文件,配置文件比较复杂
server:
port: 8760
spring:
cloud:
stream:
binders:#绑定器
zxbinder:#自定义绑定器的名称
type: rabbit #消息中间件的类型,也有kafuka
environment:#这边就是消息中间件的配置
spring:
rabbitmq:
host: 124.111.91.141#你自己的rabbitmq 的地址
port: 5672
username: zzz
password: zzz
virtual-host: /
bindings:
output:#发送出去,这边会在代码里体现
binder: zxbinder#上面自定义的绑定器的名字
destination : zx_exchange #这边就是rabbitmq的交换机
发送类,包不要导错了!
package com.example.producerMsg;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;
@Component
@EnableBinding(Source.class)#发送类固定写法
public class MsgProducer {
@Autowired
private MessageChannel output;
public void send(){
String msg = "hello stream~~";
output.send(MessageBuilder.withPayload(msg).build());
System.out.println("发送成功");
}
}
3.1.2 消息的消费者
这边大部分都和生产方差不多,我这边列出不一样的地方,为了醒目我直接贴图片
配置文件
代码
4.Sleuth+Zipkin 链路追踪
Sleuth 其实就是监控消息的生命周期,具体是什么意思呢,我一个请求过来,可能经过100个微服务,突然就报错了,你怎么知道哪个服务不行呢,我看日志,一百个服务你一行一行看吗?sleuth 就是解决这个痛点,我就可以站在上帝视角看一下,数据是怎么在各个微服务之间流转的
Zipkin 就是辅助sleuth 记录数据展示数据。
4.1 zipkin 下载
zipkin开源下载https://www.jianshu.com/p/226e0af70f21
官方网站 https://zipkin.io/pages/quickstart.html
4.2 配置
在你想要监控的服务里面配置如下东西即可监控
pom 配置,可以只引入一个zipkin
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
配置文件
spring:
zipkin:
base-url: http://124.111.11.111:9411/ #zipkin 地址
sleuth:
sampler:
probability: 1 #采集颗粒度,是不是每个请求都采集
然后启动就行,页面如下